Functions, operators, and data types for XPath 2.0
nilled() function has been implemented.
Duration values (xs:duration, xdt:dayTimeDuration, and subtypes thereof) are now maintained to microsecond rather than millisecond precision. Trailing zeros in the fractional part of the seconds value are no longer displayed when converting the value to a string. Note that the precision of dateTime values is still milliseconds, a restriction of the underlying Java classes.
normalize-unicode() function has been implemented. The normalization code
used is based on the code published by the Unicode consortium, but with changes to avoid the heavy
cost of reading the Unicode character database files every time Saxon starts up. The code has also been
modified to remove its dependence on routines in the ICU product from IBM: these were all basic utility
routines for handling UTF-16 encoding which already had equivalents in Saxon, and it seemed desirable
to avoid introducing additional complexity into the software license. The Saxon version of the code has been used
to run the conformance tests published by the Unicode consortium (with the exception of those tests
that use chararacters not permitted in XML), using a test driver written in XSLT. The same code is
also used to support the
normalization-form serialization property. The normalization
forms supported are NFC, NFD, NFKC, and NFKD (as well as the keyword "none"). The "fully-normalized"
option is not implemented.
Negative zero is now output (converted to a string) as "-0" rather than "0" as in XPath 1.0.
When an untypedAtomic value is used in an arithmetic expression, for example
and the untypedAtomic value cannot be cast to a double, Saxon was returning NaN. It now returns NaN
only when processing in backwards compatibility mode, and otherwise reports an error.
The rules for casting from
xdt:dayTimeDuration have been changed to match the current specification. This
extracts the relevant components of the value, ignoring the other components: previously Saxon reported
an error if the other components were non-zero.
has been corrected to retain the "era" (BC or AD).
Overflow is now detected and reported when multiplying or dividing a duration by a number.
xdt:yearMonthDuration values up to 2^31 months, and
values up to 2^63 microseconds.
When converting an
xs:duration to a string, zero components are now omitted;
a duration of length zero is output as
Saxon previously allowed any string to be used as the value of an
xs:anyURI. It now
applies checks that the string is valid. Specifically, the string after trimming leading and trailing whitespace
must be one of the following: (a) a zero-length string, (b) a string that the
accepts as a valid URI, or (c) a string which after escaping of non-ASCII and other special characters
(-_.!~*'()%;/?:@&=+$,#) is accepted by the
java.net.URI class. This validation is applied only
when casting a string to
xs:anyURI, or when validating against the schema type
To prevent problems interoperating with other software, Saxon continues to allow any string to be used
as the namespace URI in an
xs:QName. An example of an invalid URI is
1:2:3 - the
scheme name, which is the part before the first colon, must start with a letter.
The standard URI resolver (used, for example, to resolve the URIs passed to the document() and doc()
functions) now performs escaping of disallowed characters such as spaces. This means the "URI"
that is passed can be either a valid URI, or a string that becomes a valid URI when such characters
are escaped. (However, spaces cannot be used in contexts where a space-separated list of URIs is required,
for example in the
There is now an option (-p on the command line) that causes the standard URI resolver to recognize query
parameters supplied in the URI passed to the document() or doc() functions. For example,
doc("books.xml?validation=strict") loads the contents of the file
and applies strict validation. Other options include
strip-space=yes which strips all whitespace-only
text nodes (regardless of the setting of xsl:strip-space in the stylesheet). Full details are provided
in the description of the doc function.
The URI supplied as an argument to the
collection() function may now be resolved by a
CollectionURIResolver. Such a resolver may be registered using
setCollectionResolver() method on the
Configuration object. The standard
CollectionURIResolver behaves as before if the URI supplied to the
function identifies an XML catalogue file. As an alternative, however, the URI may be one that refers
to a directory, with optional query parameters that filter
the files in the directory. For example,
all files in the directory
c:/temp/docs that have the file extension ".xml". In addition,
the query parameter
recurse=yes may be added to expand the directory recursively; the parameter
validate=lax may be added to request schema validation;
strip-space=yes may be added to request whitespace-stripping; the parameter
on-error=fail|warning|ignore controls the action when processing of a file in the collection fails;
parser=full.class.name selects a parser (SAX XMLReader) to be used to process
the files (for example, Jown Cowan's TagSoup parser may be selected to process ill-formed HTML).
The type of the first argument to
namespace-uri-for-prefix() is now an optional string.
(Change agreed by the working groups, not yet published).