Optimizations and performance improvements
Expressions of the form //x/y are where possible now rewritten as
descendant::y[parent::x]. This removes the need for sorting into document
order, and it makes the code streamable. If the selection is not from the document node, for
example .//x/y, then it is rewritten as
child::*/descendant::y[parent::x].
Axis steps using node tests that match non-element nodes are now recognized where appropriate
as peer expressions, where the nodes are non-overlapping and therefore streamable: an example
is descendant::text(). (Such expressions can arise as the result of the previous
optimization, for example .//title/text() is translated into
child::*/descendant::text()[parent::title].)
Where two or more expressions of the form //x[a=b] occur, and both are
translated to calls on the key() function with a suitable key definition, Saxon
now checks whether they can make use of the same key definition, which potentially means that
only one index is constructed instead of multiple identical indexes.