# 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