xsl-list
[Top] [All Lists]

Re: Sorting elements by element name

2005-01-27 13:15:22
Tempore 20:08:53, die 01/27/2005 AD, hinc in xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com scripsit Güray Sen <guray(_at_)novaeres(_dot_)com>:

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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>