29

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?

Dimitre Novatchev
  • 240,661
  • 26
  • 293
  • 431
Keith Fitzgerald
  • 5,651
  • 14
  • 43
  • 58

3 Answers3

38

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.

Dimitre Novatchev
  • 240,661
  • 26
  • 293
  • 431
  • 2
    Unfortunately, this is wrong. There is no way to leave the XML document unaltered, as the XSLT has no access to the doctype declaration; you can replicate the actual XML data, but you can't claim it's unaltered, as the output of the transform will not preserve the doctype declaration. – Flynn1179 Jun 08 '10 at 12:47
  • @Flynn1179: XSLT doesn't operate on the lexical level. It operates on a *tree*. That is, after the string representation of the XML has been parsed. There are a number of differences at the lexical level that may appear in the result document. *All of these are known* and nobody pretends that the result document will be identical to the source document char by char. What XSLT guarantees is that the result document and the wanted document will be identical *as trees*. – Dimitre Novatchev Jun 08 '10 at 13:13
  • 1
    I'm not disputing that, but my point is, the result of any XSLT will NOT output a document that is identical to the original XML. Regardless of how it's represented, a doctype representation is part of the XML, and cannot be preserved in transformed output; Of course you can leave the tree unaltered, but XML is more than just a tree. – Flynn1179 Jun 08 '10 at 13:25
  • @Flynn1179: Nobody is arguing this. This is stated in the XSLT Specification(s). – Dimitre Novatchev Jun 08 '10 at 13:42
11

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>
cletus
  • 616,129
  • 168
  • 910
  • 942
0

How about:

<xsl:template match ="/">
  <xsl:copy-of select="."/>
</xsl:template>

Maybe there's an even simpler way ?

krosenvold
  • 75,535
  • 32
  • 152
  • 208