This [[Module Library|XQuery Module]] contains functions to perform validations against DTDs, XML Schema and RelaxNG. For The documentation further describes how to use Schematron validation, check out Vincent Lizzi’s [https://github.com/vincentml/schematron-basex Schematron XQuery Module]with BaseX.
=Conventions=
All functions and errors in this module are assigned to the <code><nowiki>http://basex.org/modules/validate</nowiki></code> namespace, which is statically bound to the {{Code|validate}} prefix.<br/>All errors are assigned to the <code><nowiki>http://basex.org/errors</nowiki></code> namespace, which is statically bound to the {{Code|bxerr}} prefix.
=DTD Validation=
Checks whether an XML document validates against a DTD. The input document can be specified as:
* an {{Code|xs:string}}, containing representing a URI (relative URIs will always be resolved against the path to static base URI of the resourcequery),* an {{Code|xs:string}}, containing representing the resource in its string representation, or* a {{Code|node()}}, containing representing the resource itself.
If no DTD is supplied in a function, the XML document is expected to contain an embedded DTD doctype declaration.
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|validate:dtd|$input as item()|empty-sequence()}}<br /pre>{{Func|validate:dtd|( $input as item(), $schema as xs:string?| := ()) as empty-sequence()}}</pre>|-valign="top"
| '''Summary'''
|Validates the XML {{Code|$input}} document against a {{Code|$schema}} and returns an empty sequence or an error.
|-valign="top"
| '''Errors'''
|{{Error|BXVA0001error|#Errors}} the validation fails.<br/>{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003not-found|#Errors}} no DTD validator is available.|-valign="top"
| '''Examples'''
|
* {{Code|validate:dtd('doc.xml', 'doc.dtd')}} validates the document {{Code|doc.xml}} against the specified DTD file {{Code|doc.dtd}}.
* The following example validates an invalid document against a DTD, which is specified as string:
<pre classlang="brush:'xquery"'>
try {
let $doc := <invalid/>
let $schema := '<!ELEMENT root (#PCDATA)>'
return validate:dtd($doc, $schema)
} catch bxerrvalidate:BXVA0001 error {
'DTD Validation failed.'
}
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|validate:dtd-info|$input as item()|xs:string*}}<br /pre>{{Func|validate:dtd-info|( $input as item(), $schema as xs:string?| := ()) as xs:string*}}</pre>|-valign="top"
| '''Summary'''
|Validates the XML {{Code|$input}} document against a {{Code|$schema}} and returns warnings, errors and fatal errors in a string sequence.
|-valign="top"
| '''Errors'''
|{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003not-found|#Errors}} no DTD validator is available.|-valign="top"
| '''Examples'''
|
==validate:dtd-report==
{| width='100%'|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|validate:dtd-report|$input as item()|element(report)}}<br /pre>{{Func|validate:dtd-report|( $input as item(), $schema as xs:string?| := ()) as element(report)}}</pre>|-valign="top"
| '''Summary'''
|Validates the XML {{Code|$input}} document against a {{Code|$schema}} and returns warnings, errors and fatal errors as XML.
|-valign="top"
| '''Errors'''
|{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003not-found|#Errors}} no DTD validator is available.|-valign="top"
| '''Examples'''
|
* <code>validate:dtd-report(<invalid/>, '<!ELEMENT root (#PCDATA)>')</code> returns:
<pre classlang="brush:xml">
<report>
<status>invalid</status>
* {{Code|node()}}, containing the resource itself.
If no schema is given, the input is expected to contain an {{Code|xsi:(noNamespace)schemaLocation}} attribute, as defined in [httphttps://www.w3.org/TR/xmlschema-1/#xsi_schemaLocation W3C XML Schema].
Different XML Schema implementations can be applied for validationprocessors are supported:
* By default, the '''Java implementation ''' of XML Schema 1.0 is used (it is based on an old version of Apache Xerces).* If [https://xercesThe latest version of '''Xerces2''' provides implementations of XML Schema 1.0 and 1.apache1.org/xerces2-j Xerces2] exists in the classpath, it The processor will be used instead. If you want to manually add Xerces2, applied if you should download one of the [httphttps://xerces.apache.org/mirrors.cgi#binary Xerces2 Java ..... (XML Schema 1.1) (Beta)binary distributions] archive and copy at least four the following libraries (to the {{Code|cupv10k-runtime.jarlib/custom}}, directory of the full distribution of BaseX:** {{Code|org.eclipse.wst.xml.xpath2.processor_1.12.0.jar}}, ** {{Code|xercesImplcupv10k-runtime.jar}}, ** {{Code|xml-apisxercesImpl.jar}}) to the ** {{Code|libxml-apis.jar}} directory of the full distribution of BaseX.* The '''Saxon Enterprise Edition''' will be used if you download the [httphttps://www.saxonica.com/ Saxondownload/java.xml ZIP release] Enterprise Edition (and if you copy {{Code|saxon9ee.jar}}) is detected as welland a valid license key to the classpath.
The XML Schema version can be specified as well (the supplied string must be {{Code|1.0}} or {{Code|1.1}}). Please note that Version 1.1 is only available if Saxon EE or Xerces2 is added to the classpath.==validate:xsd==
==validate{{Announce|Updated with Version 11:xsd==}} caching feature added.
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|validate:xsd|$input as item()|empty-sequence()}}<br /pre>{{Func|validate:xsd|( $input as item(), $schema as item()?|empty-sequence()}}<br />{{Func|validate :xsd|$input as item= (), $schema options as itemmap(*)?, $version := map { }) as xs:string|empty-sequence()}}</pre>|-valign="top"
| '''Summary'''
|Validates the XML {{Code|$input}} document against a {{Code|$schema}}, using the specified . The supported {{Code|$versionoptions}} are:* {{Code|cache}} of XML Schema: Generated schemas are cached and reused.* All other options are handled as features and passed on to the validator.|-valign="top"
| '''Errors'''
|{{Error|BXVA0001error|#Errors}} the validation fails.<br/>{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003not-found|#Errors}} no XML Schema validator is available.<br/>{{Error|BXVA0004|#Errors}} no validator is found for the specified version.|-valign="top"
| '''Examples'''
|
* {{Code|validate:xsd('doc.xml', 'doc.xsd')}} validates the Pass on document {{Code|doc.xml}} against the specified and schema {{Code|doc.xsd}}.* The following example demonstrates how a document can be validated against a schema without resorting to local or remote URIsas nodes:<pre classlang="brush:'xquery"'>
let $doc := <simple:root xmlns:simple='http://basex.org/simple'/>
let $schema :=
</xs:schema>
return validate:xsd($doc, $schema)
</pre>
* Validate all documents of a database against the specified schema, using the supplied feature:
<pre lang='xquery'>
for $city in db:get('cities')
return validate:xsd($city, 'city.xsd',
map { 'http://javax.xml.XMLConstants/feature/secure-processing': true() }
)
</pre>
|}
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|validate:xsd-info|$input as item()|xs:string*}}<br /pre>{{Func|validate:xsd-info|( $input as item(), $schema as item()?|xs :string*}}<br />{{Func|validate:xsd-info|$input as item= (), $schema options as itemmap(*)?, $version := map { }) as xs:string|xs:string*}}</pre>|-valign="top"
| '''Summary'''
|Validates the XML {{Code|$input}} document against a {{Code|$schema}}, using the specified {{Code|$version}} of XML Schema, and returns warnings, errors and fatal errors in a string sequence. See {{Function||validate:xsd}} for more information of the {{Code|$options}} parameter.|-valign="top"
| '''Errors'''
|{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003not-found|#Errors}} no XML Schema validator is available.<br/>{{Error|BXVA0004|#Errors}} no validator is found for the specified version.
|}
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|validate:xsd-report|$input as item()|element(report)}}<br /pre>{{Func|validate:xsd-report|( $input as item(), $schema as xs:string?|element := (report)}}<br />{{Func|validate:xsd-report|, $input options as itemmap(*), $schema as xs :string?, $version = map { }) as xs:string|element(report)}}</pre>|-valign="top"
| '''Summary'''
|Validates the XML {{Code|$input}} document against a {{Code|$schema}}, using the specified {{Code|$version}} of XML Schema, and returns warnings, errors and fatal errors as XML. See {{Function||validate:xsd}} for more information of the {{Code|$options}} parameter.|-valign="top"
| '''Errors'''
|{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003not-found|#Errors}} no XML Schema validator is available.|} ==validate:xsd-processor== {| width='100%'|- valign="top"| width='120' | '''Signature'''|<pre>validate:xsd-processor() as xs:string<br/pre>|- valign="top"| '''Summary'''|Returns the name of the applied XSD processor.|} ==validate:xsd-version== {{Error|BXVA0004width='100%'|- valign="top"| width='120' | '''Signature'''|<pre>validate:xsd-version() as xs:string</pre>|- valign="top"| '''Summary'''|#Errors}} no validator is found for Returns the specified supported versionof XSD Schema.
|}
* {{Code|node()}}, containing the resource itself.
RelaxNG validation will be available if [httphttps://wwwrelaxng.thaiopensource.comorg/relaxngjclark/jing.html Jing] exists in the classpath. The latest version, {{Code|jing-20091111.jar}}, is included in the full distributions of BaseX. As Jing additionally supports [http://www.nvdl.org/ NVDL] validation, you can also use the functions to validate the input against NVDL schemas.
==validate:rng==
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|validate:rng|$input as item(), $schema as item()|empty-sequence()}}<br/pre>{{Func|validate:rng|( $input as item(), $schema as item(), $compact as xs:boolean|? := map { }) as empty-sequence()}}</pre>|-valign="top"
| '''Summary'''
|Validates the XML {{Code|$input}} document against a {{Code|$schema}}, using the XML or {{Code|$compact}} notation.
|-valign="top"
| '''Errors'''
|{{Error|BXVA0001error|#Errors}} the validation fails.<br/>{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003not-found|#Errors}} the RelaxNG validator is not available.|-valign="top"
| '''Examples'''
|
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|validate:rng-info|$input as item(), $schema as item()|xs:string*}}<br/pre>{{Func|validate:rng-info|( $input as item(), $schema as item(), $compact as xs:boolean|? := map { }) as xs:string*}}</pre>|-valign="top"
| '''Summary'''
|Validates the XML {{Code|$input}} document against a {{Code|$schema}}, using the XML or {{Code|$compact}} notation, and returns warnings, errors and fatal errors in a string sequence.
|-valign="top"
| '''Errors'''
|{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003not-found|#Errors}} the RelaxNG validator is not available.
|}
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|validate:rng-report|$input as item(), $schema as xs:string|element(report)}}<br /pre>{{Func|validate:rng-report|( $input as item(), $schema as xs:string, $compact as xs:boolean|? := map { }) as element(report)}}</pre>|-valign="top"
| '''Summary'''
|Validates the XML {{Code|$input}} document against a {{Code|$schema}}, using the XML or {{Code|$compact}} notation, and returns warnings, errors and fatal errors as XML.
|-valign="top"
| '''Errors'''
|{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003not-found|#Errors}} The RelaxNG validator is not available.
|}
=Schematron Validation=
If you want to use Schematron for validating documents, install Vincent Lizzi’s excellent [https://github.com/Schematron/schematron-basex Schematron XQuery Module for BaseX]:
<pre lang='xquery'>
repo:install('https://github.com/Schematron/schematron-basex/raw/master/dist/schematron-basex-1.2.xar')
</pre>
The following query illustrates how documents are validated. It is directly taken from the GitHub project:
<pre lang='xquery'>
import module namespace schematron = "http://github.com/Schematron/schematron-basex";
let $sch := schematron:compile(doc('rules.sch'))
let $svrl := schematron:validate(doc('document.xml'), $sch)
return (
schematron:is-valid($svrl),
for $message in schematron:messages($svrl)
return concat(schematron:message-level($message), ': ', schematron:message-description($message))
)
</pre>
=Errors=
! width="110"|Code
|Description
|-valign="top"|{{Code|BXVA0001error}}|The document cannot be validated against the specified DTD or XML Schemaschema.|-valign="top"|{{Code|BXVA0002init}}
|The validation cannot be started.
|-valign="top"|{{Code|BXVA0003not-found}}
|No validator is available.
|-
|{{Code|BXVA0004}}
|No validator is found for the specified version.
|}
=Changelog=
;Version 11.0
* Updated: {{Function||validate:xsd}}, {{Function||validate:xsd-info}}, {{Function||validate:xsd-report}}: caching feature added
;Version 9.2
* Added: {{Function||validate:xsd-processor}}, {{Function||validate:xsd-version}}
* Updated: {{Function||validate:xsd}}, {{Function||validate:xsd-info}}, {{Function||validate:xsd-report}}: version argument was dropped (the latest version will always be used)
;Version 9.0
* Updated: error codes updated; errors now use the module namespace
;Version 8.5
* Updated: Relative URIs will always be resolved against the static base URI of the query
;Version 8.3
* Added: [[#validate:rng{{Function||validate:rng]]}}, [[#validate:rng-info{{Function||validate:rng-info]]}}* Added: [[#{{Function||validate:dtd-report|dtd-report]]}}, [[#{{Function||validate:xsd-report}}, {{Function|xsd-report]], [[#validate:rng-report|validate:rng-report]]}}
;Version 7.6
* Added: [[#validate:xsd-info{{Function||validate:xsd-info]]}}, [[#validate:dtd-info{{Function||validate:dtd-info]]}}
The module was introduced with Version 7.3.