New features in XPath 3.0

Some of the new features in XPath 3.0 are as follows. For full details, see the W3C specifications, and for further Saxon implementation details see the Conformance section.

  1. The concatenation operator || is available (as in SQL). For example, ('$' || 12.5) returns the string $12.5.

  2. A new simple mapping operator is available, !. This works rather like /, except there is no restriction that the left hand operand must be a node-set, and there is no sorting of results into document order. For example, (1 to 7)!(.*.) returns the sequence (1, 4, 9, 16, 25, 36, 49).

  3. Local variables can be declared in a let expression, for example let $x := /*/@version return //e[@version = $x].

  4. Inline function items can be declared, and used as arguments to higher-order functions. For example map(//employee, function($e){$e/salary + $e/bonus}). A function item is a third kind of item, alongside nodes and atomic values. The function represented by a function item $f can be invoked using a dynamic function call $f(args). Higher-order functions require Saxon-PE or higher.

  5. Expanded QNames can be written in the notation Q{uri}local, allowing XPath expressions to be written that do not depend on an externally-supplied namespace context.

A number of new functions are available, including head, tail, for-each, filter, for-each-pair, pi, sin, cos, tan, asin, acos, atan, sqrt, format-integer, and others. For details see the Functions section.

Maps are available as part of the Saxon XPath 3.0 implementation, though they are now in fact part of the XPath 3.1 specification; for more details see Maps in XPath. They provide a similar capability to "objects" in Javascript, or "associative arrays" in some other languages. But as befits a function language like XPath, they are immutable. A collection of functions is available to operate on maps (see the Function Library), and in addition there is new syntax for a map constructor (of the form map{ key : value, key : value }) where both the keys and values are arbitrary expressions. There is a sequence type for maps map(K, V), defining the types of the key and value parts. Maps are functions, so given a map $M, the entry for a key $K can be obtained as the result of the function call $M($K).