Schema-Aware XQuery from Java
When queries are controlled using the Java API, the equivalent to the -val
option is to create a EnterpriseConfiguration instead
of a Configuration
object, and then to call setSchemaValidationMode(net.sf.saxon.lib.Validation.STRICT) on this object. The
value Validation.LAX can
also be used.
This option switches validation on for all source documents used by any transformation
under the control of this EnterpriseConfiguration
. If you want finer control,
so that some documents are validated and others are not, you can achieve this by using the
AugmentedSource object.
An AugmentedSource
is a wrapper around a normal JAXP Source
object, in which additional properties can be set: for example, a property to request
validation of the document. The AugmentedSource
itself implements the JAXP
Source
interface, so it can be used anywhere that an ordinary
Source
object can be used, for example as the first argument to the
buildDocument()
method of the QueryProcessor
, and as the
return value from a user-written URIResolver
.
If the PTreeURIResolver
is used, it is also possible to control validation for each source document by means of
query parameters in the document URI. For example,
doc('source.xml?val=strict')
requests the loading of the file
source.xml
with strict validation.
The Configuration method
setValidationWarnings()
has the same effect as the -outval:recover
option
on the command line: validation errors encountered when processing the final result tree
are reported to the ErrorListener
as warnings, not as fatal errors. They are
also reported as XML comments in the result tree.
Schemas can be loaded using either of the techniques used with the command-line interface:
that is, by specifying them in the import schema
directive in the query
prolog, or by including them in an xsi:schemaLocation
attribute in a source
document. In addition, they can be loaded using the addSchemaSource()
method
on the EnterpriseConfiguration
class.
All schemas that are loaded are cached as part of the EnterpriseConfiguration. This is
true whether the schema is loaded explicitly using the Java API, whether it is loaded as a
result of import schema
in a query, or whether it is referenced in an
xsi:schemaLocation
attribute in a source document. There can only be one
schema document loaded for each namespace: any further attempts to load a schema for a
given target namespace will return the existing loaded schema, rather than loading a new
one. Note in particular that this means there can only be one loaded no-namespace schema
document. If you want to force loading of a different schema document for an existing
namespace, the only way to do it is to create a new
EnterpriseConfiguration
.