Re: [xsl] Sort problem

Subject: Re: [xsl] Sort problem
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Mon, 5 Feb 2001 04:31:12 -0800 (PST)
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@xxxxxxxxx> 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


Current Thread