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.