Re: [xsl] Sorting elements by element name

Subject: Re: [xsl] Sorting elements by element name
From: "Joris Gillis" <roac@xxxxxxxxxx>
Date: Thu, 27 Jan 2005 21:15:22 +0100
Tempore 20:08:53, die 01/27/2005 AD, hinc in xsl-list@xxxxxxxxxxxxxxxxxxxxxx scripsit GC<ray Sen <guray@xxxxxxxxxxxx>:

I would like to sort some XML data by the names of the elements.
I have found some XSLT that does that on the net, but there seems to be a
problem when the elements have attributes. Is there a way to accomplish
the above (possibly by finetuning the XSLT below)?

<xsl:template match="@* | node()">
	<xsl:copy>
		<xsl:apply-template select="@* | node()">
			<xsl:sort select="name()"/>
		</xsl:apply-template>
	</xsl:copy>
Hi,

Indeed, attribute nodes have to be copied to the result tree before any nodes of another type. Because of the sorting, the node-set loses document order and thus cannot any longer guarantee that the attributes are processed earlier than the elements and text nodes.

one solution is this:

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

But since the relative output order of attributes after serialization of the result tree depends on the processor, you might as well omit the attribute sorting:

<xsl:template match="@* | node()">
	<xsl:copy>
		<xsl:copy-of select="@*"/>
		<xsl:apply-templates select="node()">
			<xsl:sort select="name()"/>
		</xsl:apply-templates>
	</xsl:copy>
</xsl:template>


regards, -- Joris Gillis (http://www.ticalc.org/cgi-bin/acct-view.cgi?userid=38041) Laudeo W3C et dona ferens

Current Thread