Saxon extensions to the W3C XSLT/XQuery specifications

The EXSLT extension function exslt:node-set(), which is widely implemented in XSLT 1.0 processors, is now implemented in Saxon-HE (it has always been available in PE and EE). This is to make it easier to write stylesheets that work both under Saxon and under XSLT 1.0 processors.

In XQuery, the option declaration declare option saxon:default, which was introduced to allow a default value to be defined for an external variable before a standard mechanism for this became available in XQuery 3.0, is now dropped.

In XSLT, the extension instruction saxon:call-template, which allowed the name of the called template to be computed dynamically, is dropped. With the introduction of higher-order functions there is no longer any need for this extension, and it is complex to redefine the semantics in a way that makes sense with XSLT 3.0 packages. The effect of saxon:call-template can be achieved by replacing (or wrapping) the relevant templates with functions, and replacing the call on saxon:call-template with a dynamic call on a function found using fn:function-lookup().

In XSLT, the extension declaration saxon:collation, which has been deprecated since Saxon 8.8, is dropped.

The extension function saxon:generate-id is dropped. It is no longer needed, since the standard fn:generate-id() is now available in XPath and XQuery as well as XSLT.

The extension function saxon:get-pseudo-attribute() now returns an empty sequence rather than a zero-length string if the requested pseudo-attribute is absent.

The XSLT extension attribute saxon:read-once="yes", which was an early interface provided for streamed processing, is dropped. In place of <xsl:copy-of select="doc('a.xml')//e" saxon:read-once="yes"/>, use <xsl:stream href="a.xml"><xsl:apply-templates select=".//e"/></xsl:stream>; or use <xsl:sequence select="saxon:stream(doc('a.xml')//e)"/>.

The saxon:stream() extension function now delivers snapshots of the selected nodes (that is, the result of fn:snapshot() rather than fn:copy-of()); the effect is that the copied nodes come with copies of their ancestors and the attributes of ancestors, as well as the node's own attributes and descendants).

The extension function saxon:query() now accepts queries using XQuery 3.0 syntax.

The EXPath binary module (see is now implemented in Saxon-PE/EE. This provides a number of extension functions for manipulating binary data and converting to and from numeric and string forms. As the specification has been given Version 1.0 status, the set of functions provided can be considered stable.

The proposed EXPath archive module (see is now implemented in Saxon-PE/EE. This provides a number of extension functions for manipulating archive directory structures, such as ZIP and JAR formats. It is intended to replace the functionality of the EXPath ZIP module, support for which was withdrawn in

Some of the signatures of the functions in the proposed EXPath file module (see, implemented in Saxon-PE/EE, have altered.