What this stands for in xsl? match="@*|node()"

sajay picture sajay · Jun 20, 2013 · Viewed 12.7k times · Source

Can anyone explain what this means in xsl? Exactly what does each expression stands for

<xsl:template match="@*|node()">

Answer

Ian Roberts picture Ian Roberts · Jun 20, 2013

@* matches any attribute node, and node() matches any other kind of node (element, text node, processing instruction or comment). So a template matching @*|node() will apply to any node that is not consumed by a more specific template.

The most common example of this is the identity template

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

which copies the input XML to the output tree verbatim. You can then override this template with more specific ones that apply to particular nodes to make small tweaks to the XML, for example, this stylesheet would create an output XML that is identical to the input except that all foo elements have had their names changed to bar:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>

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