O'Reilly logo

XSLT, 2nd Edition by Doug Tidwell

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

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="*"> ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required