SAXONICA

Saxon Documentation
Full Contents
About Saxon
Changes in this Release
Conditions of Use
Using XSLT 2.0
Using XQuery
| Introduction
| Running XQuery from the Command Line
| Invoking XQuery from Java
| Calling XQuery Functions from Java
| Result Format
| Extensibility
» | Extensions
| Use Cases
Handling Source Documents
XML Schema Processing
The XPath API
Standards Conformance
Extensibility
Saxon Extensions
Sample Saxon Applications
The Saxon SQL Extension
XSLT Elements
XPath 2.0 Expression Syntax
Function Library
XSLT Patterns

# Extensions

The full library of Saxon and EXSLT functions described in Extensions is available, except for those (for example, some forms of `saxon:serialize`) that have an intrinsic dependency on an XSLT stylesheet.

declare option saxon:default

An XQuery option declaration is defined allowing a default value to be specified for a query parameter (external variable). The syntax is illustrated below:

    declare namespace saxon="http://saxon.sf.net/";
    declare option saxon:default "20";
    declare variable $x external;

The default value is written as an XPath expression. The surrounding quotes are part of the "declare option" syntax, not part of the expression: therefore, if the default value is to be supplied as a string literal, two sets of quotes are needed. In the above example, the default value is the integer 20, not a string. Perhaps it would be clearer to show this by writing `saxon:default "(+20)"`

declare option saxon:output

Saxon also provides an option declaration to set serialization parameters. This takes the form shown in the following example:

    declare namespace saxon="http://saxon.sf.net/";
    declare option saxon:output "method=html";
    declare option saxon:output "saxon:indent-spaces=1";

The saxon:validate-type pragma

Saxon-SA provides a pragma (a language extension) to allow constructed elements to be validated against a schema-defined global type definition. The standard `validate` expression allows validation only against a global element declaration, but some schemas (an example is FpML) provide very few global elements, and instead rely heavily on locally-declared elements having a global type. This makes it impossible to construct fragments of an FpML document in a way that takes advantage of static and dynamic type checking.

The extension takes the form:

    (# saxon:validate-type my:personType #) { expr }

Conceptually, it makes a copy of the result of evaluating `expr` and validates it against the named schema type, causing the copied nodes to acquire type annotations based on the validation process. The effect is the same as that of the `type` attribute in XSLT instructions such as `xsl:element` and `xsl:copy-of`. The schema type (shown in the above example as `myPersonType`) may be a simple type or a complex type defined in an imported schema, or a built-in type; it is written as a QName, using the default namespace for elements and types if it is unprefixed.

Note that XQuery processors other than Saxon will typically ignore this pragma, and return the value of `expr` unchanged. Such processors will report type-checking failures if the value is used in a context where the required type is `element(*, type-name)`.

You can use a different namespace prefix in place of "saxon", but it must be bound using a namespace declaration to the namespace "http://saxon.sf.net/".

Here is a complete example:

    module namespace tim="http://www.example.com/module/hour-minute-time";
    declare namespace saxon="http://saxon.sf.net/";
    import schema namespace fpml = "http://www.fpml.org/2005/FpML-4-2" at "....";

    declare function time:getCurrentHourMinuteTime() as element(*, fpml:HourMinuteTime) {
        (# saxon:validate-type fpml:HourMinuteTime #) {
            let $time = string(current-time())
            return <time>{substring($time, 1, 5)}:00</time>
        }
    };

Saxon ignores any pragmas in a namespace other than the Saxon namespace; it rejects any pragmas whose QName is ill-formed, as well as pragmas in the Saxon namespace whose local name is not recognized.

Next