# Changes in Functions, Operators, and Data Types

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 doc function.

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).

Next