Functions, operators, and data types for XPath 2.0
The 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.
The 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 @price+1
,
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 xs:duration
to xdt:yearMonthDuration
or
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.
Casting from xs:date
to xs:gYear
or xs:gYearMonth
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.
Saxon supports xdt:yearMonthDuration
values up to 2^31 months, and xdt:dayTimeDuration
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 PT0S
.
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 java.net.URI
class
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 xs:anyURI
.
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 xsi:schemaLocation
attribute).
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 books.xml
,
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
The URI supplied as an argument to the collection()
function may now be resolved by a
user-defined CollectionURIResolver
. Such a resolver may be registered using
the setCollectionResolver()
method on the Configuration
object. The standard
CollectionURIResolver
behaves as before if the URI supplied to the collection()
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, collection("file:///c:/temp/docs/?select=*.xml")
returns
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=strict
or validate=lax
may be added to request schema validation;
the parameter 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;
the parameter 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).