Implements three extension elements to allow an XSLT transformation to
redirect its output to multiple output files.
It is accessed by specifying a namespace URI as follows:
xmlns:redirect="http://xml.apache.org/xalan/redirect"
You can either just use redirect:write, in which case the file will be
opened and immediately closed after the write, or you can bracket the
write calls by redirect:open and redirect:close, in which case the
file will be kept open for multiple writes until the close call is
encountered. Calls can be nested.
Calls can take a 'file' attribute
and/or a 'select' attribute in order to get the filename. If a select
attribute is encountered, it will evaluate that expression for a string
that indicates the filename. If the string evaluates to empty, it will
attempt to use the 'file' attribute as a default. Filenames can be relative
or absolute. If they are relative, the base directory will be the same as
the base directory for the output document. This is obtained by calling
getOutputTarget() on the TransformerImpl. You can set this base directory
by calling TransformerImpl.setOutputTarget() or it is automatically set
when using the two argument form of transform() or transformNode().
Calls to redirect:write and redirect:open also take an optional
attribute append="true|yes", which will attempt to simply append
to an existing file instead of always opening a new file. The
default behavior of always overwriting the file still happens
if you do not specify append.
Note: this may give unexpected results when using xml
or html output methods, since this is
not coordinated
with the serializers - hence, you may get extra xml decls in
the middle of your file after appending to it.
Example:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:redirect="http://xml.apache.org/xalan/redirect"
extension-element-prefixes="redirect">
<xsl:template match="/">
<out>
default output.
</out>
<redirect:open file="doc3.out"/>
<redirect:write file="doc3.out">
<out>
<redirect:write file="doc1.out">
<out>
doc1 output.
<redirect:write file="doc3.out">
Some text to doc3
</redirect:write>
</out>
</redirect:write>
<redirect:write file="doc2.out">
<out>
doc2 output.
<redirect:write file="doc3.out">
Some more text to doc3
<redirect:write select="doc/foo">
text for doc4
</redirect:write>
</redirect:write>
</out>
</redirect:write>
</out>
</redirect:write>
<redirect:close file="doc3.out"/>
</xsl:template>
</xsl:stylesheet>