XSLT 3.0 implementation
The bind-group
and bind-grouping-key
variables on the xsl:for-each-group
element are now implemented.
This involved some internal refactoring of the way variables are managed during the XSLT static analysis phase.
Implemented the composite
attribute of the
xsl:for-each-group
element.
Changed the implementation of xsl:merge
to reflect the
revisions in the draft XSLT 3.0 specification (removed xsl:merge-input
element; added sort-before-merge
attribute).
Implemented accumulators (the new xsl:accumulator
feature)
for both streamed and unstreamed documents.
Implemented the xsl:stream
instruction.
Implemented the error-code
attribute of xsl:message
.
Implemented the start-at
attribute of xsl:number
.
Implemented the context-item
attribute of xsl:evaluate
.
Implemented the xsl:assert
instruction.
Implemented the xsl:map
and xsl:map-entry
instructions.
The restriction that xsl:import
must precede other declarations in
a stylesheet module has been removed.
Implemented the on-empty
attribute of xsl:attribute
.
Implemented the xsl:on-empty
attribute of literal result elements. (Note, although this
facility was designed specifically to support streaming, it is not yet fully streamable).
Saxon now allows the EQName syntax Q{uri}local
in places where a QName is required,
for example the name
attribute of xsl:variable
, xsl:template
,
xsl:function
etc, the first argument of the functions key()
,
system-property()
, and function-available()
, the final argument of
format-number()
, etc. This is useful for static names in the case where stylesheets
are generated programmatically, and it is always useful for dynamic names because it avoids the dependency
on the static namespace context.
It is now a static error if the same NodeTest
appears in an xsl:strip-space
and
an xsl:preserve-space
declaration at the same import precedence. This is a backwards
incompatibility introduced in the 3.0 specification.
There is now a warning message if the namespace URI of the document element of the
principal input document does not match the namespace URIs used in the template rules of the
stylesheet. This is designed to catch the common beginner's mistake of writing (for example)
match="html"
when the element to be matched is actually in a (default) namespace.
The precise conditions for the warning are that the stylesheet contains one or more template
rules in the initial mode that match an explicit element name, and none of these template
rules matches an element in the namespace used for the top level element of the principal source
document.
Implemented more of the new pattern syntax: patterns matching variables, namespace nodes, ... Patterns that match atomic values can no longer be used as part of a pattern that uses "union", "intersect", or "except" (as a result of clarification of the XSLT 3.0 specification.)
Affecting XSLT 2.0 also, a very long-standing bug has been fixed: documents read using the
collection()
function are now subjected to whitespace stripping as defined by xsl:strip-space
declarations in the stylesheet.
Also affecting XSLT 2.0, a subtle change has been made in the behavior of
xsl:result-document
when the href
attribute is absent. Previously this caused the constructed result document to be
serialized to the location specified by the base output URI. Now it causes the constructed document to
be sent to the primary output destination selected in the calling API (which might, for example, be a
DOMResult or an XdmDestination). Both interpretations appear to be allowed by the specification.
Note that omitting the href
attribute is done typically when you want to validate the result
document against a schema, though the same effect can be achieved using xsl:document
.
Whitespace stripping: the xsl:strip-space
declaration now has no effect on a node if it is within
the scope of an XSD 1.1 assertion: that is, whitespace text nodes are not stripped if any ancestor node has been validated
against a type that contains an assertion. This is because changing the content of such a node could invalidate the
assertion, thus breaking type safety.
Content value templates are implemented. These allow expressions contained in curly braces to be contained in text
nodes within a sequence constructor, rather like attribute value templates; the facility can be enabled by setting
expand-text="yes"
on any enclosing XSLT element (for example, <xsl:stylesheet>
).
Example: <out>{$greeting}, {$first} {$last}, how are things?</out>
.
Note that the details of the facility in the specification (for example, handling of boundary whitespace) are subject
to change. Note also that although the syntax is similar to XQuery, the semantics are different: the result of evaluating
the enclosed expressions is always reduced to a string, it never generates nested elements.
The new match pattern syntax match="?{ expr }"
is implemented (replaced in Saxon 9.5.1 with
the revised form match=".[ expr ]"
). This matches an item T
if the expression has an effective boolean value of true when evaluated with T as the context item.
This construct replaces the ~ itemType
syntax defined in earlier XSLT 3.0 drafts, but
for the moment Saxon implements both.
Some of the features NOT implemented from XSLT 3.0 include:
-
Packages
-
xsl:context-item