This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Sort problem
- To: mick at telekabel dot nl
- Subject: Re: [xsl] Sort problem
- From: Dimitre Novatchev <dnovatchev at yahoo dot com>
- Date: Mon, 5 Feb 2001 04:31:12 -0800 (PST)
- Cc: xsl-list at lists dot mulberrytech dot com
- Reply-To: xsl-list at lists dot mulberrytech dot com
OK,
This will work only if your hyphenation character comes before any
other characters in the words.
One example is to use"~" instead of "-".
Interestingly enough, MSXML3 sorts "-" before the alphabetical
characters and "~" after them.
With MSXML3 and the stylesheet I supplied and the following xml source:
<root>
<line lineID="1">
<word wordID="1">ABC-</word>
<word wordID="2">ABCD</word>
<word wordID="2">ABCDE</word>
</line>
<line lineID="2">
<word wordID="1" type="end">DEF</word>
<word wordID="2">XYZ</word>
</line>
</root>
I get the following result:
ABCD
ABCDE
ABCDEF
XYZ
With Saxon I get:
ABCDEF
ABCD
ABCDE
XYZ
This must be definitely a bug in MSXML3.
Dimitre.
--- Dimitre Novatchev <dnovatchev@yahoo.com> wrote:
> Hi Mick,
>
> Use:
>
> <xsl:for-each select="root/line/word[not(@type = 'end')]">
> <xsl:sort
>
select="concat(.,self::*[contains(.,'-')]/following::word[@type='end'])"/>
> <xsl:choose>
> <xsl:when test="contains(., '-')">
> <xsl:value-of select="substring-before(., '-')"/>
> <xsl:value-of select="following::word[@type='end']"/>
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="."/>
> </xsl:otherwise>
> </xsl:choose>
> <xsl:if test="position() != last()">
> <xsl:text>
</xsl:text>
> </xsl:if>
> </xsl:for-each>
>
>
> Cheers,
> Dimitre Novatchev.
>
> Mick <mick at telekabel dot nl> wrote:
>
> Hi all,
>
> I have the following problem when sorting a list of words. My xml is:
>
> <root>
> <line lineID="1">
> <word wordID="1">ABC-</word>
> <word wordID="2">ABCD</word>
> </line>
> <line lineID="2">
> <word wordID="1" type="end">DEF</word>
> <word wordID="2">XYZ</word>
> </line>
> </root>
>
> I have a stylesheet to create an alphabetical list of words. If a
> word
> contains a dash, it means it has to be joined with the following word
> that
> has an attribute type="end". The xsl I use is:
>
> <xsl:for-each select="root/line/word">
> <xsl:sort select="."/>
> <xsl:choose>
> <xsl:when test="contains(., '-')">
> <xsl:value-of select="substring-before(., '-')"/>
> <xsl:value-of select="following::word[@type='end']"/><br/>
> </xsl:when>
> <xsl:when test="@type='end'"></xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="."/>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:for-each>
>
> The result is:
>
> ABCDEF
> ABCD
> XYZ
>
> which is not what I want because the alphabetical order is wrong. The
> xsl:sort only sorts on the 'substring-before' part ABC minus the
> dash)
> and
> ignores the 'following::word' bit (DEF). I want the output to be:
>
> ABCD
> ABCDEF
> XYZ
>
> How can I get the result of the 'substring-before' part and the
> 'following::word' part to be handled as one entity?
> I'm using IE and MSXML3.
>
> -mick
>
>
>
>
> __________________________________________________
> Get personalized email addresses from Yahoo! Mail - only $35
> a year! http://personal.mail.yahoo.com/
>
__________________________________________________
Get personalized email addresses from Yahoo! Mail - only $35
a year! http://personal.mail.yahoo.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list