Svish
Svish

Reputation: 158291

What is the default select of XSLT apply-templates?

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

Answers (3)

oberlies
oberlies

Reputation: 11723

The default selection of apply-templates is node(), which is shorthand for child::node(). This XPath expressions is evaluated as follows:

  • First, all nodes from the "child" axis are taken. This are all the direct children of the current element, i.e. other elements, text, and comments, but not the attributes.
  • Then this node set is filtered with the node test "node()". In this case, no elements are filtered because that test matches everything.

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

Dimitre Novatchev
Dimitre Novatchev

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

Ian Roberts
Ian Roberts

Reputation: 122414

The default select for <xsl:apply-templates/> is just "node()", it doesn't include attributes.

Upvotes: 5

Related Questions