RE: [xsl] Problem with sort order

Subject: RE: [xsl] Problem with sort order
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 22 Aug 2006 21:20:04 +0100
You need to do two passes: construct the output, then sort it.

You can either do that in a single stylesheet (in XSLT 1.0 you'll need the
xx:node-set() extension), or in two stylesheets chained together in a
pipeline.

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: Per Eberg [mailto:aberg.per@xxxxxxxx]
> Sent: 22 August 2006 19:23
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Problem with sort order
>
> Hi,
>
> In my xslt file, I want to examine the attributes of the xml
> elements, transform some of them (if needed), and then sort
> the output after the attributes. My problem is that the
> transformed attributes become sorted after their "ingoing"
> value instead of their new value. The following invented
> example shows the problem. According to the xsl 1.0 specs the
> output of the transformation should be sorted, but here it
> seems like the input is being sorted. Does anyone know how I
> can get it right?
>
> Thanks in advance,
> Per
>
> The xml-file:
>
> <?xml version="1.0" encoding="utf-8"?>
> <?xml-stylesheet type="text/xsl" href="xslt_file.xsl"?> <animal>
>     <species>
>         <name language="English">Wolf</name>
>         <name language="Spanish">Lobo</name>
>         <name language="Danish">Canis Lupus</name>
>         <name language="French">Loup</name>
>     </species>
> </animal>
>
> The xsl-file:
>
> <?xml version="1.0" encoding="utf-8"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>     <xsl:output method="xml"/>
>     <xsl:template match="/animal">
>         <animal>
>             <xsl:apply-templates select="species"/>
>         </animal>
>     </xsl:template>
>     <xsl:template match="species">
>         <species>
>             <xsl:for-each select="name">
>             <xsl:sort select="@language"/>
>                <xsl:choose>
>                     <xsl:when test="@language='Danish'">
>                         <name language="Latin"><xsl:value-of
> select="."/></name>
>                     </xsl:when>
>                     <xsl:otherwise>
>                         <name language="{@language}"><xsl:value-of
> select="."/></name>
>                     </xsl:otherwise>
>                 </xsl:choose>
>             </xsl:for-each>
>         </species>
>     </xsl:template>
> </xsl:stylesheet>
>
> The output:
>
> <animal>
>      <species>
>           <name language="Latin">Canis Lupus</name>
>           <name language="English">Wolf</name>
>           <name language="French">Loup</name>
>           <name language="Spanish">Lobo</name>
>      </species>
> </animal>
>
> The desired output:
>
> <animal>
>      <species>
>           <name language="English">Wolf</name>
>           <name language="French">Loup</name>
>           <name language="Latin">Canis Lupus</name>
>           <name language="Spanish">Lobo</name>
>      </species>
> </animal>

Current Thread