XPath 2.0 implementation

Namespace URIs have been updated as defined in the October 2004 draft specifications: for example http://www.w3.org/2004/10/xpath-functions and http://www.w3.org/2004/10/xpath-datatypes.

The right-hand operand of the "/" operator can now be an expression of any type. (The left-hand operand must still return nodes, which means that in a path expression, every step except the last must return nodes.) If the expression returns atomic values, no sorting into document order or removal of duplicates takes place. A type error occurs if the returned value contains a mixture of nodes and atomic values. This facility allows expressions such as sum(//item/(@price * @qty)), eliminating the need for range variables in many situations..

The revised rules for backwards compatible processing in general comparisons have been implemented. These are much closer to the XPath 1.0 rules. Most notably, an expression such as @price > @discount where both attributes are untyped is now a numeric comparison rather than a string comparison. Backwards-compatible mode is invoked in an XSLT stylesheet specifying version="1.0".

The revised rules for backwards compatibility in arithmetic expressions have been implemented. The main changes are (a) numeric arithmetic always produces an xs:double result (never an integer or a decimal - except in the case of the idiv operator), (b) arguments that can't be converted to a number generate NaN (rather than an error or an empty sequence).

Compile-time warning messages are now produced for steps in path expressions that can never retrieve any nodes, for example child::text() if the context node is an attribute, or .. if the context node is a document node.