[xsl] xsl:sort descending causes attribute nodes to be created after children, causing an error

Subject: [xsl] xsl:sort descending causes attribute nodes to be created after children, causing an error
From: Abel Braaksma <abel.online@xxxxxxxxx>
Date: Tue, 16 Jan 2007 14:00:48 +0100
Hi XSLT'ers,

The following issue is easy to workaround, but I am wondering if this is correct behavior after the XSLT 2 (or even 1) recommendation.

With an xsl:apply-template that includes attribute nodes in its select-attribute, and you apply an xsl:sort on the children, then it happens that the attribute nodes are created after the children when the order of xsl:sort is descending. I tried google on this, but couldn't find something useful.

The example below throws the following error:
"An attribute node (count) cannot be created after the children of the containing element"


I did not try other parsers. The xslt employs a simple copy idiom and sorts the rows of the input in $data. Call the XSLT on itself to see the error or the results:

<xsl:stylesheet
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
   version="2.0">

<xsl:output indent="yes" />
<xsl:variable name="data">
<rows count="3">
<row>bbbb</row>
<row>aaaa</row>
<row>cccc</row>
</rows>
</xsl:variable>
<xsl:template match="/">
<xsl:apply-templates select="$data/*" />
</xsl:template>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>


   <xsl:template match="rows">
       <xsl:copy>
           <xsl:apply-templates select="node() | @*">
               <xsl:sort
                   select="text()"
                   order="descending" />
           </xsl:apply-templates>
       </xsl:copy>
   </xsl:template>

</xsl:stylesheet>


Any thoughts on this? Is this behavior desired and/or required, or is this the processor's mistake?


Btw: a possible workaround is to apply the attribute node first.

Cheers,
-- Abel Braaksma
  http://www.nuntia.nl

Current Thread