# Extensions

When an extension function has a declared return type of `java.lang.Object` in Java, or `System.Object` in .NET, the inferred static type is now `xs:anyAtomicType` rather than `external object`. This means that if the value actually returned at run-time is, say, an integer, and the value is used where an integer is required, then the call will not be rejected as a compile-time type error.

The extension function `saxon:transform()` has changed: in the third argument, which is used to pass parameters to the stylesheet, the argument must now be a sequence of element nodes, attribute nodes, or document nodes. If a document node is supplied, it is treated as equivalent to passing its element children.

Two new extension functions `saxon:compile-query()` and `saxon:query()` are available. They allow a query to be constructed dynamically as a string, compiled, and repeatedly executed. The input to the function can (if required) be created using the new `saxon:xquery` output method.

A new extension function `saxon:result-document()` is available in Saxon-SA, for the benefit of XQuery users. Modelled on the `xsl:result-document` instruction, it allows a query to generate multiple output documents and serialize them to filestore.

The implementation of the EXSLT `math:power()` function has been extended to cater for numeric data types other than xs:double. For example, the result of `math.power(2, 128)` is now calculated using integer rather than double arithmetic, and the result is an integer. For the full rules, see EXSLT

In Saxon's implementation of the EXSLT dates-and-times library, the current date/time that is used is now aligned with the XPath 2.0 `current-dateTime()` function, and thus returns the same value for the duration of a query or transformation.

The extension function `saxon:typeAnnotation()` now accepts any item. For a node it returns the type annotation; for an atomic value it returns the type label. The return type is now xs:QName (it was previously a lexical QName returned as a string).

The extension functions `yearMonthDurationFromMonths()` and `dayTimeDurationFromSeconds()`, which have been undocumented since Saxon 8.1, have finally been dropped. The same effect can be achieved by multiplying a duration of one month or one second by the appropriate integer.

The extension function `saxon:tokenize()`, also undocumented since Saxon 8.1, has been dropped. Use `fn:tokenize()` instead.

Three new extension functions are available to find when a file was last modified. Two variants of `saxon:last-modified()` test the last modified date of the file from which a node was obtained; the function `saxon:file-last-modified()` takes an absolute URI as its argument.

Next