XSLT 3.0 implementation

The type-available() function now allows the argument to be an EQName in the format "Q{uri}local".

A call on system-property('xsl:version') now returns "2.0" or "3.0" depending on whether XSLT 3.0 has been enabled.

The xsl:analyze-string instruction allows the regular expression to be one that matches a zero-length string.

The XSLT 3.0 pattern syntax is fully implemented. Support for the syntax ~typename, which was present in earlier versions of the specification, has been discontinued.

Accumulators have been changed to use the syntax in the latest working draft (functions accumulator-before() and accumulator-after() with a first argument giving the accumulator name, rather than functions with user-defined names.)

The attribute applies-to on xsl:accumulator is implemented.

The version number 2.1 is no longer recognized as a synonym for 3.0.

The xsl:function attributes cache and identity-sensitive are accepted. Setting cache="full" or cache="partial" and identity-sensitive="no" has the same effect as setting saxon:memo-function=yes; it causes the function to be implemented as a memo function, remembering the results of all previous calls.

The select attribute of xsl:break and xsl:on-completion is implemented.

With a non-schema-aware processor at version="3.0", the attributes validation="preserve" and validation="lax" are now treated as validation="strip", rather than being rejected as in 2.0.

Full support for the use of the Unicode Collation Algorithm is provided in Saxon-PE/EE, with fallback behaviour in Saxon-HE.

Conversion between JSON and XML using the json-to-xml() function is supported as per the specification in Saxon-PE/EE.

Support for the bind-group and bind-grouping-key attributes in xsl:for-each-group is dropped, and the semantics of current-group() and current-grouping-key() change reflecting the latest XSLT 3.0 specification.

The xsl:merge syntax has been updated to the latest spec (bug 24150, post-last-call change). The xsl:merge-source/@for-each attribute is renamed for-each-item, and calls to current-group() and current-grouping-key() are replaced by current-merge-group() and current-merge-key() respectively. The for-each-stream attribute is implemented, with the capability to validate input documents, and the single-argument form of current-merge-group() is available, allowing selection of merged items according to which input source they came from. Streamed merging is not yet implemented.

The typed attribute on xsl:mode is partially implemented. Currently with typed="strict" or typed="lax", only simple name patterns are converted to the schema-element(N) form.

Maps no longer have a collation property (the feature was dropped from the spec); instead there is now a collation-key() function, which has been implemented.

The function library for maps is updated to reflect the current specification. The functions map:merge(), map:put(), and map:for-each-entry() are implemented. The function map:new(), which has been removed from the specification, is retained in Saxon for the time being.

Shadow attributes (also known as static AVTs) are implemented. This facility allows any attribute of an XSLT element to be computed during preprocessing by means of a static expression: for example, to include a module whose URI is computed from static parameters, you can write <xsl:include _href="lib{$V}.xsl"/>. Note the leading underscore on the attribute name to indicate that this is a shadow attribute. The feature applies to all no-namespace attributes of elements in the XSLT namespace.