Optimization

The XQuery expression for $x at $p in EXPR return $p is now rewritten as 1 to count(EXPR).

A filter expression that filters a constant sequence is now evaluated at compile time, provided the predicate does not use any variables and has no dependencies on the dynamic context other than the context item, position, and size.

"Loop-lifting" (extraction of subexpressions to prevent them being repeatedly evaluated within a loop) is now extended to XQuery for expressions that have a position variable.

Adjacent literal text nodes in the content of an element or document constructor are now merged at compile time. (These can arise as a result of early evaluation of expressions in the content sequence.)

The AttributeValidator, which checks whether required attributes are present and expands default values during schema validation, has been rewritten for efficiency, to do most of the work of setting up the necessary data structures at schema compile time rather than on a per-element basis at validation time. It also uses two different implementations of the main data structure to handle the typical case with a small number of attributes, and the more difficult but unusual case where large numbers of attributes are declared.

When an attribute has an enumeration type, space is saved on the instance tree by using references to the attribute value as held in the compiled schema, avoiding holding multiple copies of the same string.

In XSLT, multiple identical key definitions are now merged. These can arise when the same stylesheet module is imported several times in different places. Previously, this led to the construction of multiple indexes, whose results were merged at run-time.

The set of XPath expressions for which streamed evaluation is possible (using saxon:stream() or equivalent interfaces) has been slightly extended. It can now include expressions that return a union of elements and attributes; previously it was required to return exclusively elements, or exclusively attributes. It now allows multiple predicates (previously only a single predicate was allowed).

In XSLT, tail-call optimization is now performed for a call on xsl:call-template that appears within an xsl:for-each instruction, provided that it can be statically determined that the select expression of the xsl:for-each returns at most one item.