A Stylesheet That Doesn’t Quite Reproduce Its Input Document

Now we’ll look at a similar stylesheet that uses <xsl:copy> instead. Again, our stylesheet is very simple:

<?xml version="1.0"?>
<!-- copy1.xsl -->
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <xsl:copy/>
  </xsl:template>
</xsl:stylesheet>

You probably noticed that the stylesheet is shorter. Unlike <xsl:copy-of>, the <xsl:copy> element doesn’t have a select attribute. (It has some other attributes in XSLT 2.0; it didn’t have any at all in XSLT 1.0.) Here are the results when we use this stylesheet:

<?xml version="1.0" encoding="UTF-8"?>

Hmmm. It appears that <xsl:copy> didn’t actually copy anything. While that makes for a small, concise document, it’s probably not what we wanted. (This is the result you get from Xalan; Saxon doesn’t generate anything at all.) One thing to remember here is that the document root is not the root element that contains the XML data in our document. An XML document can contain comments and processing instructions that are outside the root element; those comments and PIs are part of the XPath document root. So, if we want to copy anything, we need to create a template for the root element. Here’s another attempt at a stylesheet:

<?xml version="1.0"?>
<!-- copy2.xsl --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:apply-templates select="*"/> </xsl:template> <xsl:template match="*"> ...

Get XSLT, 2nd Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.