[xsl] Identity Transform

Subject: [xsl] Identity Transform
From: "Christian Roth" <roth@xxxxxxxxxxxxxx>
Date: Mon, 7 Nov 2005 12:24:28 +0100
Hi,

this is a question for my own understanding.

Browsing through posts on this list, I can find two forms of what's
called "identity transform":

** Form 1 **

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


** Form 2 **

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

(The difference is in the apply-templates' 'select' attribute.)

Both seem to work when testing locally, both with Xalan and Saxon,
seemingly no warnings, omissions or errors.

However, XSLT specifies that first, one has to add attributes to a node
before appending any children. Doesn't Form 2 first append child nodes
and then attributes, which should either result in an error or silently
discard the attributes?

Has this something to do with document traversal order, i.e. while
building the list of selected items using "node()|@*", the attribute
nodes (satisfying the expression) are found first and are therefore
added first to the list of items to be copied, in consequence satisfying
the "attribute-before-children" requirement?

Regards, Christian.

Current Thread