Hi -
I am looking for a XSL snippet that simply returns the XML unaltered. It sounds trivial but I can't seem to find an example anywhere on the web. Any help out there?
Hi -
I am looking for a XSL snippet that simply returns the XML unaltered. It sounds trivial but I can't seem to find an example anywhere on the web. Any help out there?
How about:
<xsl:template match ="/">
<xsl:copy-of select="."/>
</xsl:template>
Maybe there's an even simpler way ?
This is a common problem and the answer is called an identity transform. The following template will copy the existing XML correctly. You then add extra templates to modify the behaviour (eg removing certain elements, renaming elements or attributes, etc).
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
In order to copy the complete XML document, it is necessary to have a template that matches the root. This might be:
<xsl:template match="/">
or
<xsl:template match="node()">
Then a single copying of the current node (the root node) is just sufficient:
<xsl:copy-of
select="."/>
So, one such complete transformation is:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
Although this is probably the simplest such transformation, XSLT programmers use another one, widely known as the identity transformation
or the identity rule
:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
The reson the identity transformation is considered to be one the most fundamental XSLT design patterns and to be so massively used, is that by overriding this template rule with other, more specific templates, one can very easily perform a variety of operations that otherwise will be difficult. Examples are deleting a particular (set of) element(s) that have a specific name or satisfy some other condition, renaming particular elements, changing the namespace of particular elements, creating new children or siblings of particular elements, ..., etc.
For more information and code snippets using the identity transformation, do look here.