Reputation: 158291
The identity template looks like this:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
Does <xsl:apply-templates select="@*|node()" />
select more than <xsl:apply-templates />
, or could the identity template have been like this?
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
What exactly is selected when I do the following?
<xsl:apply-templates />
Upvotes: 15
Views: 4239
Reputation: 11723
The default selection of apply-templates is node()
, which is shorthand for child::node()
. This XPath expressions is evaluated as follows:
So with <xsl:apply-templates />
, templates for the child elements are applied but not for the attributes. In case of the copy template this would mean that the attributes are not copied.
Upvotes: 2
Reputation: 243579
Does
<xsl:apply-templates select="@*|node()" />
select more than<xsl:apply-templates />
, or could the identity template have been like this?
<xsl:apply-templates/>
is equivalent to:
<xsl:apply-templates select="node()"/>
and this is a shorter former of:
<xsl:apply-templates select="child::node()"/>
and this is a equivalent to:
<xsl:apply-templates select="* | text() | comment() | processing-instruction()"/>
As we see from the last instruction, the xsl:apply-templates
instruction you are asking about, doesn't select any attributes, therefore it cannot be used as a shorthand for:
<xsl:apply-templates select="@*|node()"/>
Upvotes: 21
Reputation: 122414
The default select for <xsl:apply-templates/>
is just "node()"
, it doesn't include attributes.
Upvotes: 5