Functions, operators, and data types for XPath 2.0

The standard functions have been enhanced, where the spec requires it, to return an empty sequence if one of their arguments is an empty sequence.

The max() and min() functions now handle any comparable type, returning the correct data type (for example, if given a set of integers, they return an integer). The default (for untyped nodes) is string comparison. A collation can be specified as the second argument; if not specified, the default collation is used. {expr56, expr57, sort20, sort21, date065, error220}

The implementation of deep-equal(), sequence-deep-equal(), and sequence-node-equal() has been revised to conform to the current specifications.

The distinct-values() function is now implemented, with an optional collation argument. {group017-019}

The functions floor(), round(), ceiling() now return a value of the same type as the supplied argument. {math87-90}

The index-of() function now takes an optional collation argument. {expr87}

For functions that take a collation argument, such as compare(), the default if no collation is specified in the call, and no default <saxon:collation> is supplied, is to use code-point collation. This differs from previous releases, where the default was to use a locale-dependent collation. For xsl:sort, the default is still locale-dependent. This decision is likely to be reviewed in future.

The arguments of sort() are now reversed: the first argument is the sequence to be sorted, the second is the name of the sort key specification.

Changed sum() and avg() to return the same type as supplied. The average of an empty sequence is now (), not NaN. These functions are still confined to handling numeric values, they do not yet work over other summable types such as durations. {math91, math92, expr55, error227}

Corrected a bug: conversion of a double to a float was returning a double!

The functions starts-with(), contains(), and ends-with() now accept a collation name as an optional second argument. {str126-128}

The functions substring-before() and substring-after() now accept a collation name as an optional second argument. {str129-130}

The saxon:distinct() function, with a single argument, is dropped: the functionality is available using either the XPath 2.0 distinct-values() function, or the EXSLT set:distinct() function. The two-argument form (which takes an expression as the second argument) remains.

The dynamic expression supplied to saxon:expression and saxon:evaluate can now contain references to the variables $p1, $p2, ... $p9. The values of these variables can be supplied when the expression is evaluated using saxon:eval or saxon:evaluate respectively. The expression can also contain calls to Java extension functions bound using the implicit mapping of Java classes to namespaces, and to Saxon and EXSLT extension functions. For more details see Saxon Extensions.

The function saxon:get-user-data() has changed to return an empty sequence rather than a zero-length string if no data exists. This is to prevent type-checking problems when the expected value is not a string. {saxon06}

The error() function (with optional argument) is implemented. If the argument is specified, its string-value is used as the error message. {error223-224}

The node-name() function is implemented. It returns a value of type xs:QName.

The functions get-in-scope-namespaces() and get-namespace-uri-for-prefix() are implemented. {nspc45-46}

The unparsed-entity-public-id() function (defined in XSLT 2.0) is implemented. This required a minor change to the DocumentInfo interface implemented by the tree model. {expr88}

The unordered() function is implemented. This returns the results of a sequence in implementation-defined order. In practice the only important case where it has any effect in the Saxon implementation is where the sequence supplied as argument is a Step using a reverse axis: for example, unordered(ancestor::*) returns the ancestors in reverse document order. But applications should not rely on the actual order; the function is intended to be used by applications that do not care about the order of the results. {axes60}

A simple implementation of the input() function is available. If the parameter {}input has been supplied to the transformation, it returns the value of this parameter. This must be a node sequence -- which means it cannot be supplied from the command line. If no such parameter has been supplied, it returns the root of the principal source document (the document containing the node that was matched on entry to the transformation). {Limited testing only: mdocs09}

The default-collation() function is implemented: it returns the URI of the default collation if specified, or the URI of the code-point collation otherwise.

The component extraction functions for durations are now available only on the two subtypes yearMonthDuration and dayTimeDuration, and are named accordingly: for example get-years-from-yearMonthDuration and get-hours-from-dayTimeDuration. (But other operations remain available on durations even though not specified in the current working draft, for example equality comparison on durations). {date055-058}

Casts and constructor functions, when converting from a string to another type, now apply the appropriate whitespace normalization to the supplied value, as defined in the whitespace facet for the target data type. This means, for example, that an ID value can have leading and trailing spaces, which are ignored. {type035}