XSLT 2.0 implementation
href attribute of
xsl:result-document is now interpreted as a relative
URI, relative to the system ID of the principal result document. This works only where the system ID of the
principal output is known, and uses the "file://" protocol. The result document is no longer created
relative to the current working directory, for security reasons (it causes problems when executing
an untrusted stylesheet in a servlet environment).
Note that when Saxon is invoked from the command line, the -o option should be used to specify the
principal output destination. This will ensure that a suitable system ID is available. If the result document
is sent to the standard output stream (even if this is redirected to a file), Saxon will not know the
system identifier and will therefore be unable to create a secondary output destination using a relative
URI. It is still possible, of course, to specify an absolute URI as the value of the
attribute - note that this must be a URL, not a filename, so it will typically start with
It is now possible to specify an OutputURIResolver to be used to resolve the URI specified in the
attribute of the
xsl:result-document element. This will be used in place of the standard output URI
resolver. The OutputURIResolver is called when writing of the output document starts, at which point it must
return a JAXP Result object to act as the output destination. It is called again when writing of an output document
is complete. You can nominate an OutputURIResolver by calling
or by calling
If the -t option is used, a message is written to the standard error output identifying the
files written using using
It is now an error to use
xsl:result-document when the current output destination
is a temporary tree.
The meaning of the ALLOW_EXTENSION_FUNCTIONS attribute in the TransformerFactory has been
extended so that setting the value to
false also disables extension elements and
the creation of multiple output files. This is because all these operations carry similar risks
when a servlet is allowed to execute untrusted stylesheets.
Added support for the
separator attribute of
current() function may now be used in a pattern (specifically, within a predicate).
Its value is the node being tested against the pattern. For example,
matches any element that contains another element with the same name.
A global variable or parameter may now be used in the match pattern of
xsl:template, provided that it does
not cause a circularity (that is, it must be possible to evaluate the variable without calling
A global variable or parameter may now be used in the match pattern or the use expression
xsl:key, provided that it does
not cause a circularity (that is, it must be possible to evaluate the variable without using the
function against the key being defined)
key() function may now be used in the
match attributes of
xsl:key, provided the key definitions are not circular. (For example, key k1 can be defined
in terms of key k2, provided that k2 is not defined in terms of k1.)
group-ending-with attribute of
xsl:for-each-group is implemented. It is especially
useful where the last node in each group carries some kind of marker, for example
saxon:collation, to specify whether this collation
should be used as the default collation. If more than one collation is specified as the default, the last one wins.
If no default collation is specified, Unicode codepoint collation is used. The default collation is used by
the compare() function if no third argument is supplied, by xsl:sort if no collation is specified (for data type text
or string), and also by the comparison operators =, !=, <, >, etc.
The collation name is now a URI, not a QName.
Sorting and comparison according to Unicode codepoints can be achieved by setting up a collator as
<saxon:collation name="unicode" class="net.sf.saxon.sort.CodepointCollator"/>