[xsl] Understanding Identity Transformations

Subject: [xsl] Understanding Identity Transformations
From: Karl Stubsjoen <kstubs@xxxxxxxxx>
Date: Fri, 11 Feb 2005 15:56:58 -0700
Seems like this is pretty standard:

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

But then I've also seen this:

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

How do they compare?  I make not of the SAMPLE_001 within the xsl:copy
there are 2 apply templates, what does each do?

Then, understanding what is happening, is the following sample true
that this will strip an XML doc of all attribute elements?

SAMPLE_003:
<xsl:template match="*">
  <xsl:copy>
    <xsl:apply-templates select="*"/>
  </xsl:copy>
</xsl:template>

And finally, when I identity transform the following my document i
quadrupled in size, but I though I was following standard practices
from previous example.

SAMPLE_004:
<xsl:template match="*">
  <xsl:copy>
    <xsl:apply-templates select="*"/>
    <xsl:apply-templates />
  </xsl:copy>
</xsl:template>

Ahh, I think I understand what is going on in SAMPLE_004 (please
confirm) I am basically applying templates for all nodes twice and in
the case of lets say SAMPLE_001 the first apply-templates simply gets
all attributes, the 2nd then gets all nodes.  We'd call this a
recursive call on the node set?

Karl

Current Thread