This [[Module Library|XQuery Module]] contains functions to perform validations against [http://www.w3.org/XML/Schema DTDs, XML Schema] and [http://en.wikipedia.org/wiki/Document_Type_Declaration Document Type Declarations]. By default, this module uses Java’s standard validators. As an alternative, [http://www.saxonica.com/ Saxon XSLT Processor] is used if ({{Code|saxon9he.jar}}, {{Code|saxon9pe.jar}} or {{Code|saxon9eeRelaxNG.jar}}) is added The documentation further describes how to the classpathuse Schematron validation with BaseX.
=Conventions=
All functions and errors in this module are assigned to the {{Code|<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|http://basex.org/errors}} namespace, which is statically bound to the {{Code|bxerr}} prefix.
=FunctionsDTD Validation= Checks whether an XML document validates against a DTD. The input document can be specified as: * {{Code|xs:string}}, representing a URI (relative URIs will always be resolved against the static base URI of the query),* {{Code|xs:string}}, representing the resource in its string representation, or* {{Code|node()}}, representing the resource itself. If no DTD is supplied in a function, the XML document is expected to contain an embedded DTD doctype declaration. ==validate:dtd== {| width='100%'|- valign="top"| width='120' | '''Signature'''|<pre>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|error|#Errors}} the validation fails.<br/>{{Error|init|#Errors}} the validation process cannot be started.<br/>{{Error|not-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 lang='xquery'>try { let $doc := <invalid/> let $schema := '<!ELEMENT root (#PCDATA)>' return validate:dtd($doc, $schema)} catch validate:error { 'DTD Validation failed.'}</pre>|} ==validate:dtd-info== {| width='100%'|- valign="top"| width='120' | '''Signature'''|<pre>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|init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} no DTD validator is available.|- valign="top"| '''Examples'''|* <code>validate:dtd-info(<invalid/>, '<!ELEMENT root (#PCDATA)>')</code> returns:<br/><code>2:11: Element type "invalid" must be declared.</code>.|} ==validate:dtd-report==
==validate:xsd==
{| width='100%'
|-valign="top"| width='90120' | '''SignaturesSignature'''|{{Func|<pre>validate:xsd|$input as item()|emptydtd-sequencereport()}}<br />{{Func|validate:xsd| $input as item(), $schema as itemxs:string? := ()|empty-sequence) as element(report)}}</pre>|-valign="top"
| '''Summary'''
|Validates the document specified by XML {{Code|$input}}. Both document against a {{Code|$inputschema}} and returns warnings, errors and fatal errors as XML.|- valign="top"| '''Errors'''|{{Error|init|#Errors}} the validation process cannot be started.<br/>{{CodeError|not-found|$schema#Errors}}no DTD validator is available.|- valign="top"| '''Examples'''|* <code>validate:dtd-report(<invalid/>, '<!ELEMENT root (#PCDATA)>')</code> returns:<pre lang="xml"><report> <status>invalid</status> <message level="Error" line="2" column="11">Element type "invalid" must be declared.</message></report></pre>|} =XML Schema Validation= Checks whether an XML document validates against an XML Schema. The input document and the schema can be specified as:
* {{Code|xs:string}}, containing the path to the resource,
* {{Code|xs:string}}, containing the resource in its string representation, or
* {{Code|node()}}, containing the resource itself.
{{Code|$schema}} can be used to specify the schema for validation. If no schema is given, {{Code|$the input}} is required 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 processors are supported: * By default, the '''Java implementation''' of XML Schema 1.0 is used (it is based on an old version of Apache Xerces).* The latest version of '''Xerces2''' provides implementations of XML Schema 1.0 and 1.1. The processor will be applied if you download one of the [https://xerces.apache.org/mirrors.cgi#binary binary distributions] and copy the following libraries to the {{Code|lib/custom}} directory of the full distribution of BaseX:** {{Code|org.eclipse.wst.xml.xpath2.processor_1.2.0.jar}}** {{Code|cupv10k-runtime.jar}}** {{Code|xercesImpl.jar}}** {{Code|xml-apis.jar}}* '''Saxon Enterprise Edition''' will be used if you download the [https://www.saxonica.com/download/java.xml ZIP release] and if you copy {{Code|saxon9ee.jar}} and a valid license key to the classpath. ==validate:xsd== {{Announce|Updated with Version 11:}} caching feature added. {| width='100%'|- valign="top"| width='120' | '''Signature'''|<pre>validate:xsd( $input as item(), $schema as item()? := (), $options as map(*)? := map { }) as empty-sequence()<br /pre>|-valign="top"| '''Summary'''|Validates the XML {{Code|$input}} document against a {{Code|$schema}}. The supported {{Code|$options}} are:* {{Code|cache}}: 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|not-found|#Errors}} no XML Schema validator is available.|-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>
|}
==validate:xsd-info==
{| width='100%'
|- valign="top"
| width='120' | '''Signature'''
|<pre>validate:xsd-info(
$input as item(),
$schema as item()? := (),
$options as map(*)? := map { }
) 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. See {{Function||validate:xsd}} for more information of the {{Code|$options}} parameter.
|- valign="top"
| '''Errors'''
|{{Error|init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} no XML Schema validator is available.
|}
==validate:xsd-report==
{| width='100%'
|- valign="top"
| width='120' | '''Signature'''
|<pre>validate:xsd-report(
$input as item(),
$schema as xs:string? := (),
$options as map(*) := map { }
) 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. See {{Function||validate:xsd}} for more information of the {{Code|$options}} parameter.
|- valign="top"
| '''Errors'''
|{{Error|init|#Errors}} the validation process cannot be started.<br/>{{Error|not-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</pre>
|- valign="top"
| '''Summary'''
|Returns the name of the applied XSD processor.
|}
==validate:xsd-version==
{| width='100%'
|-valign="top"| width='90120' | '''SignaturesSignature'''|{{Func|<pre>validate:xsd-info|$input as itemversion()|as xs:string*}}<br /pre>{{Func|validate:xsd-info|$input as item(), $schema as item()|xs:string*}}|-valign="top"
| '''Summary'''
|Validates Returns the document specified by {{Codesupported version of XSD Schema.|$input}} and returns warning, errors and fatal errors in =RelaxNG Validation= Checks whether an XML document validates against a string sequenceRelaxNG schema. {{Code|$The input}} document and {{Code|$the schema}} can be specified as:
* {{Code|xs:string}}, containing the path to the resource,
* {{Code|xs:string}}, containing the resource in its string representation, or
* {{Code|node()}}, containing the resource itself.
RelaxNG validation will be available if [https://relaxng.org/jclark/jing.html Jing] exists in the classpath. The latest version, {{Code|$schemajing-20091111.jar}} , is included in the full distributions of BaseX. As Jing additionally supports [http://www.nvdl.org/ NVDL] validation, you can be used also use the functions to specify validate the schema for validationinput against NVDL schemas. If no ==validate:rng== {| width='100%'|- valign="top"| width='120' | '''Signature'''|<pre>validate:rng( $input as item(), $schema is given as item(), $compact as xs:boolean? := map { }) as empty-sequence()</pre>|- valign="top"| '''Summary'''|Validates the XML {{Code|$input}} is required to contain an document against a {{Code|xsi:(noNamespace)schemaLocation$schema}} as defined in [http://www.w3.org/TR/xmlschema-1/#xsi_schemaLocation W3C , using the XML Schema]or {{Code|$compact}} notation.<br />|-valign="top"
| '''Errors'''
|{{Error|BXVA0002error|#Errors}} the validation fails.<br/>{{Error|init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} the RelaxNG validator is not available.|- valign="top"| '''Examples'''|* {{Code|validate:rng('doc.xml', 'doc.rng')}} validates the document {{Code|doc.xml}} against the specified schema {{Code|doc.rng}}.
|}
==validate:dtdrng-info==
{| width='100%'
|-valign="top"| width='90120' | '''SignaturesSignature'''|{{Func|<pre>validate:dtd|rng-info( $input as item()|empty-sequence()}}<br />{{Func|validate:dtd|, $input schema as item(), $dtd compact as xs:boolean? := map { }) as xs:string|empty-sequence()}}*</pre>|-valign="top"
| '''Summary'''
|Validates the document specified by XML {{Code|$input}}. document against a {{Code|$input}} can be specified as:* an {{Code|xs:string}}, containing the path to the resource,* an {{Code|xs:stringschema}}, containing using the resource in its string representation, XML or* a {{Code|node()$compact}}notation, containing the resource itself.{{Code|$schema}} can be used to specify the DTD for validation. If no DTD is givenand returns warnings, {{Code|$input}} is required to contain errors and fatal errors in a DTD doctype declarationstring sequence.<br />|-valign="top"
| '''Errors'''
|{{Error|BXVA0001init|#Errors}} the validation failsprocess cannot be started.<br/>{{Error|BXVA0002not-found|#Errors}} the validation process cannot be started.|-| '''Examples'''|* {{Code|validate:xsd('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 RelaxNG validator is specified as string:<pre class="brush:xquery">try { let $doc := <invalid/> let $dtd := '<!ELEMENT root (#PCDATA)>' return validate:dtd($doc, $dtd)} catch BXVA0001 { 'DTD Validation failednot available.'}</pre>|-
|}
==validate:dtdrng-inforeport==
{| width='100%'
|-valign="top"| width='90120' | '''SignaturesSignature'''|{{Func|validate:dtd-info|$input as item()|xs:string*}}<br /pre>{{Func|validate:dtdrng-info|report( $input as item(), $dtd schema as xs:string|, $compact as xs:string*}boolean? := map { }) as element(report)</pre>|-valign="top"
| '''Summary'''
|Validates the document specified by XML {{Code|$input}} and returns warning, errors and fatal errors in document against a string sequence. {{Code|$input}} can be * an {{Code|xs:stringschema}}, containing the path to using the resource,* an {{Code|xs:string}}, containing the resource in its string representation, XML or* a {{Code|node()$compact}}notation, containing the resource itself.{{Code|$schema}} can be used to specify the DTD for validation. If no DTD is givenand returns warnings, {{Code|$input}} is required to contain a DTD doctype declarationerrors and fatal errors as XML.<br />|-valign="top"
| '''Errors'''
|{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|not-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='100%' class="wikitable" width="100%"! width="5%110"|Code! width="95%"|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|not-found}}
|No validator is available.
|}
=Changelog=
;Version 711.50 * Updated: {{Function||validate:xsd}}, {{Function||validate:xsd-info}}, {{Function||validate:xsd-report}}: caching feature added ;Version 9.12 * 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: {{Function||validate:rng}}, {{Function||validate:rng-info]]}}* Added: {{Function||validate:dtd-report|dtd-report}}, {{Function||validate:xsd-report}}, [[#{{Function||validate:rng-report}} ;Version 7.6 * Added: {{Function||validate:dtdxsd-info}}, {{Function||validate:dtd-info]]}}
The module was introduced with Version 7.3.
[[Category:XQuery]]