Parameterizing Schemas
Saxon provides an extension to the standard XSD syntax that allows a schema to be parameterized. This is only useful if XSD 1.1 is enabled. The facility allows a parameter to be declared in a top-level annotation in the schema document, for example:
<xs:annotation> <xs:appinfo> <saxon:param name="accepted-currencies" as="xs:string" select="'USD', 'GBP, 'EUR'" xmlns:saxon="http://saxon.sf.net/"/> </xs:appinfo> </xs:annotation>This declaration allows the variable $currency
to appear in any XPath expression appearing in the remainder of the same
schema document. Typically it will be used in an assertion or in an expression controlling conditional type assignment, for example:
As with stylesheet parameters in XSLT, the as
attribute defines the required type of the value (defaulting to item()*
),
and the select
attribute supplies a default value. The expression determining the default value is evaluated during schema processing
(that is, at "compile time"). The name of the parameter is a QName following the XSLT convention that no prefix means no namespace.
The supplied value is converted to the required type using the function conversion rules, and validation fails if this is not possible.
It is important to supply a sensible default value since it will not always be possible to supply a value for the parameter.
For example, if the variable is used in the assertion
facet of a simple type, then a cast expression initiated
from XSLT or XQuery will always use the default value for the parameter.
The scope of the declared variable is all XPath expressions appearing after the
saxon:param
element within the same schema document. All parameters within
a schema must have distinct names. It is not at present possible to use one parameter
across multiple schema documents (as a workaround, all types using the variable should
appear in the same schema document).
On the Validate
command line the parameters can be supplied in the form keyword=value
, for example currency=EUR
; more
complex values can be supplied as XPath expressions, for example ?accepted-currencies=('USD','GBP','EUR')
or
+lookup-table=lookup-doc.xml
.
Using the s9api interface from Java, parameter values can be supplied using the setParameter()
method on the
SchemaValidator
object.
Using the Saxon-Api interface on .NET, parameter values can be supplied using the SetParameter()
method on the
SchemaValidator
object.
It is not currently possible to supply parameter values when using the JAXP interfaces to run a validation episode, or when invoking
validation using the standard mechanisms in XSLT or XQuery. In this situation the default value will always be used. In the absence of the select
attribute the default value is an empty sequence (whether or not this is a legal value according to the required type).
An extension function saxon:validate
is available to allow parameterized validation
to be invoked from XSLT or XQuery. The first argument is the document or element node to be
validated; the second argument is a map giving validation options, and the third argument is
a set of values for any validation parameters, also supplied as a map (the keys will be of type xs:QName
).
All three arguments are mandatory; the second
and third arguments can be supplied as an empty map if appropriate, for example
saxon:validate($node, map{}, map{})
.