Splitting Documents
Problem
You want to partition elements from a single document into subdocuments.
Solution
For XSLT 1.0, you must rely on a widely available but nonstandard
extension that allows multiple output documents.[11] The
solution determines the level in the document structure to serialize
and determines the name of the resulting file. The following
stylesheet splits the salesBySalesPerson.xml
from Chapter 4 into separate files for each
salesperson. The stylesheet works in Saxon. Saxon allows use of the
XSLT 1.1 xsl:document
element when the stylesheet
version is set to 1.1.[12]
If you prefer not to use Version 1.1, then you can use
the
saxon:output
extension:
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:include href="copy.xslt"/> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="salesperson"> <xsl:variable name="outFile" select="concat('salesperson.',translate(@name,' ','_'),'.xml')"/> <!-- Non-standard saxon xsl:document! --> <xsl:document href="{$outFile}"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:copy> </xsl:document> </xsl:template> <xsl:template match="salesBySalesperson"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>
Discussion
Although the previous stylesheet is specific to Saxon, the technique
works with most XSLT 1.0 processors with only minor changes. Saxon
also has the saxon:output
extension element
(xmlns:saxon ...
Get XSLT Cookbook 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.