Difference between revisions of "Validation Module"

From BaseX Documentation
Jump to navigation Jump to search
(36 intermediate revisions by 2 users not shown)
Line 1: Line 1:
This [[Module Library|XQuery Module]] contains functions to perform validations against DTDs, XML Schema and (since {{Version|8.3}}) RelaxNG. For Schematron validation, check out Vincent Lizzi’s [https://github.com/vincentml/schematron-basex Schematron XQuery Module].
+
This [[Module Library|XQuery Module]] contains functions to perform validations against DTDs, XML Schema and RelaxNG. The documentation further describes how to use Schematron validation with BaseX.
  
 
=Conventions=
 
=Conventions=
  
All functions 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 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=
 
=DTD Validation=
Line 10: Line 9:
 
Checks whether an XML document validates against a DTD. The input document can be specified as:
 
Checks whether an XML document validates against a DTD. The input document can be specified as:
  
* an {{Code|xs:string}}, containing the path to the resource,
+
* {{Code|xs:string}}, representing a URI (relative URIs will always be resolved against the static base URI of the query),
* an {{Code|xs:string}}, containing the resource in its string representation, or
+
* {{Code|xs:string}}, representing the resource in its string representation, or
* a {{Code|node()}}, containing the resource itself.
+
* {{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.
 
If no DTD is supplied in a function, the XML document is expected to contain an embedded DTD doctype declaration.
Line 27: Line 26:
 
|-
 
|-
 
| '''Errors'''
 
| '''Errors'''
|{{Error|BXVA0001|#Errors}} the validation fails.<br/>{{Error|BXVA0002|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003|#Errors}} no DTD validator is available.
+
|{{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.
 
|-
 
|-
 
| '''Examples'''
 
| '''Examples'''
Line 33: Line 32:
 
* {{Code|validate:dtd('doc.xml', 'doc.dtd')}} validates the document {{Code|doc.xml}} against the specified DTD file {{Code|doc.dtd}}.
 
* {{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:
 
* The following example validates an invalid document against a DTD, which is specified as string:
<pre class="brush:xquery">
+
<syntaxhighlight lang="xquery">
 
try {
 
try {
 
   let $doc := <invalid/>
 
   let $doc := <invalid/>
 
   let $schema := '<!ELEMENT root (#PCDATA)>'
 
   let $schema := '<!ELEMENT root (#PCDATA)>'
 
   return validate:dtd($doc, $schema)
 
   return validate:dtd($doc, $schema)
} catch bxerr:BXVA0001 {
+
} catch validate:error {
 
   'DTD Validation failed.'
 
   'DTD Validation failed.'
 
}
 
}
</pre>
+
</syntaxhighlight>
 
|}
 
|}
  
Line 55: Line 54:
 
|-
 
|-
 
| '''Errors'''
 
| '''Errors'''
|{{Error|BXVA0002|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003|#Errors}} no DTD validator is available.
+
|{{Error|init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} no DTD validator is available.
 
|-
 
|-
 
| '''Examples'''
 
| '''Examples'''
Line 63: Line 62:
  
 
==validate:dtd-report==
 
==validate:dtd-report==
 
{{Mark|Introduced with Version 8.3}}:
 
  
 
{| width='100%'
 
{| width='100%'
 +
| width='100%'
 
|-
 
|-
 
| width='120' | '''Signatures'''
 
| width='120' | '''Signatures'''
Line 75: Line 73:
 
|-
 
|-
 
| '''Errors'''
 
| '''Errors'''
|{{Error|BXVA0002|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003|#Errors}} no DTD validator is available.
+
|{{Error|init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} no DTD validator is available.
 
|-
 
|-
 
| '''Examples'''
 
| '''Examples'''
 
|
 
|
 
* <code>validate:dtd-report(<invalid/>, '<!ELEMENT root (#PCDATA)>')</code> returns:
 
* <code>validate:dtd-report(<invalid/>, '<!ELEMENT root (#PCDATA)>')</code> returns:
<pre class="brush:xml">
+
<syntaxhighlight lang="xml">
 
<report>
 
<report>
 
   <status>invalid</status>
 
   <status>invalid</status>
 
   <message level="Error" line="2" column="11">Element type "invalid" must be declared.</message>
 
   <message level="Error" line="2" column="11">Element type "invalid" must be declared.</message>
 
</report>
 
</report>
</pre>
+
</syntaxhighlight>
 
|}
 
|}
  
 
=XML Schema Validation=
 
=XML Schema Validation=
 
{{Mark|Updated with Version 8.3}}:
 
  
 
Checks whether an XML document validates against an XML Schema. The input document and the schema can be specified as:
 
Checks whether an XML document validates against an XML Schema. The input document and the schema can be specified as:
Line 98: Line 94:
 
* {{Code|node()}}, containing the resource itself.
 
* {{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 [http://www.w3.org/TR/xmlschema-1/#xsi_schemaLocation W3C XML Schema].
+
If no schema is given, the input is expected to contain an {{Code|xsi:(noNamespace)schemaLocation}} attribute, as defined in [https://www.w3.org/TR/xmlschema-1/#xsi_schemaLocation W3C XML Schema].
  
Different XML Schema implementations can be applied for validation:
+
Different XML Schema processors are supported:
  
* Java includes a default implementation of XML Schema (which is an older version of Apache Xerces)
+
* By default, the '''Java implementation''' of XML Schema 1.0 is used (it is based on an old version of Apache Xerces).
* If [https://xerces.apache.org/xerces2-j Xerces2] exists in the classpath, it will be used instead. If you want to manually add Xerces2, you should download the [http://xerces.apache.org/mirrors.cgi#binary Xerces2 Java ..... (XML Schema 1.1) (Beta)] archive and copy at least four libraries ({{Code|cupv10k-runtime.jar}}, {{Code|org.eclipse.wst.xml.xpath2.processor_1.1.0.jar}}, {{Code|xercesImpl.jar}}, {{Code|xml-apis.jar}}) to the {{Code|lib}} directory of the full distribution of BaseX.
+
* 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:
* The [http://www.saxonica.com/ Saxon] Enterprise Edition (saxon9ee.jar) is detected as well.
+
** {{Code|org.eclipse.wst.xml.xpath2.processor_1.2.0.jar}}
 
+
** {{Code|cupv10k-runtime.jar}}
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.
+
** {{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==
 
==validate:xsd==
Line 113: Line 111:
 
|-
 
|-
 
| width='120' | '''Signatures'''
 
| width='120' | '''Signatures'''
|{{Func|validate:xsd|$input as item()|empty-sequence()}}<br />{{Func|validate:xsd|$input as item(), $schema as item()?|empty-sequence()}}<br />{{Func|validate:xsd|$input as item(), $schema as item()?, $version as xs:string|empty-sequence()}}
+
|{{Func|validate:xsd|$input as item()|empty-sequence()}}<br />{{Func|validate:xsd|$input as item(), $schema as item()?|empty-sequence()}}<br />{{Func|validate:xsd|$input as item(), $schema as item()?, $features as map(*)|empty-sequence()}}
 
|-
 
|-
 
| '''Summary'''
 
| '''Summary'''
|Validates the XML {{Code|$input}} document against a {{Code|$schema}}.
+
|Validates the XML {{Code|$input}} document against a {{Code|$schema}}, using the processor-specific {{Code|$features}}.
 
|-
 
|-
 
| '''Errors'''
 
| '''Errors'''
|{{Error|BXVA0001|#Errors}} the validation fails.<br/>{{Error|BXVA0002|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003|#Errors}} no XML Schema validator is available.
+
|{{Error|error|#Errors}} the validation fails.<br/>{{Error|init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} no XML Schema validator is available.
 
|-
 
|-
 
| '''Examples'''
 
| '''Examples'''
 
|
 
|
* {{Code|validate:xsd('doc.xml', 'doc.xsd')}} validates the document {{Code|doc.xml}} against the specified schema {{Code|doc.xsd}}.
+
* Pass on document and schema as nodes:
* The following example demonstrates how a document can be validated against a schema without resorting to local or remote URIs:
+
<syntaxhighlight lang="xquery">
<pre class="brush:xquery">
 
 
let $doc := <simple:root xmlns:simple='http://basex.org/simple'/>
 
let $doc := <simple:root xmlns:simple='http://basex.org/simple'/>
 
let $schema :=
 
let $schema :=
Line 132: Line 129:
 
   </xs:schema>
 
   </xs:schema>
 
return validate:xsd($doc, $schema)
 
return validate:xsd($doc, $schema)
</pre>
+
</syntaxhighlight>
 +
* Validate all documents of a database against the specified schema, using the supplied feature:
 +
<syntaxhighlight lang="xquery">
 +
for $city in db:open('cities')
 +
return validate:xsd($city, 'city.xsd',
 +
  map { 'http://javax.xml.XMLConstants/feature/secure-processing': true() }
 +
)
 +
</syntaxhighlight>
 
|}
 
|}
  
Line 140: Line 144:
 
|-
 
|-
 
| width='120' | '''Signatures'''
 
| width='120' | '''Signatures'''
|{{Func|validate:xsd-info|$input as item()|xs:string*}}<br />{{Func|validate:xsd-info|$input as item(), $schema as item()?|xs:string*}}
+
|{{Func|validate:xsd-info|$input as item()|xs:string*}}<br />{{Func|validate:xsd-info|$input as item(), $schema as item()?|xs:string*}}<br />{{Func|validate:xsd-info|$input as item(), $schema as item()?, $features as map(*)|xs:string*}}
 
|-
 
|-
 
| '''Summary'''
 
| '''Summary'''
|Validates a document and returns warnings, errors and fatal errors in a string sequence. See [[#validate:xsd|validate:xsd]] for more details on the function arguments.
+
|Validates the XML {{Code|$input}} document against a {{Code|$schema}}, using the processor-specific {{Code|$features}}, and returns warnings, errors and fatal errors in a string sequence.
 
|-
 
|-
 
| '''Errors'''
 
| '''Errors'''
|{{Error|BXVA0002|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003|#Errors}} no XML Schema validator is available.
+
|{{Error|init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} no XML Schema validator is available.
 
|}
 
|}
  
 
==validate:xsd-report==
 
==validate:xsd-report==
  
{{Mark|Introduced with Version 8.3}}:
+
{| width='100%'
 +
|-
 +
| width='120' | '''Signatures'''
 +
|{{Func|validate:xsd-report|$input as item()|element(report)}}<br />{{Func|validate:xsd-report|$input as item(), $schema as xs:string?|element(report)}}<br />{{Func|validate:xsd-report|$input as item(), $schema as xs:string?, $features as map(*)|element(report)}}
 +
|-
 +
| '''Summary'''
 +
|Validates the XML {{Code|$input}} document against a {{Code|$schema}}, using the processor-specific {{Code|$features}}, and returns warnings, errors and fatal errors as XML.
 +
|-
 +
| '''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%'
 
{| width='100%'
 
|-
 
|-
 
| width='120' | '''Signatures'''
 
| width='120' | '''Signatures'''
|{{Func|validate:xsd-report|$input as item()|element(report)}}<br />{{Func|validate:xsd-report|$input as item(), $schema as xs:string?|element(report)}}
+
|{{Func|validate:xsd-processor||xs:string}}
 
|-
 
|-
 
| '''Summary'''
 
| '''Summary'''
|Validates a document and returns warnings, errors and fatal errors as XML. See [[#validate:xsd|validate:xsd]] for more details on the function arguments.
+
|Returns the name of the applied XSD processor.
 +
|}
 +
 
 +
==validate:xsd-version==
 +
 
 +
{| width='100%'
 
|-
 
|-
| '''Errors'''
+
| width='120' | '''Signatures'''
|{{Error|BXVA0002|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003|#Errors}} no XML Schema validator is available.
+
|{{Func|validate:xsd-version||xs:string}}
 +
|-
 +
| '''Summary'''
 +
|Returns the supported version of XSD Schema.
 
|}
 
|}
  
 
=RelaxNG Validation=
 
=RelaxNG Validation=
  
Checks whether an XML document validates against a RelaxNG schema. The input document and the schema an be specified as:
+
Checks whether an XML document validates against a RelaxNG 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 path to the resource,
Line 173: Line 197:
 
* {{Code|node()}}, containing the resource itself.
 
* {{Code|node()}}, containing the resource itself.
  
RelaxNG validation will be available if [http://www.thaiopensource.com/relaxng/jing.html Jing] exists in the classpath. The latest version, {{Code|jing-20091111.jar}}, is included in the full distributions of BaseX.
+
RelaxNG validation will be available if [https://relaxng.org/jclark/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==
 
==validate:rng==
 
{{Mark|Introduced with Version 8.3}}:
 
  
 
{| width='100%'
 
{| width='100%'
Line 188: Line 210:
 
|-
 
|-
 
| '''Errors'''
 
| '''Errors'''
|{{Error|BXVA0001|#Errors}} the validation fails.<br/>{{Error|BXVA0002|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003|#Errors}} the RelaxNG validator is not available.<br/>{{Error|BXVA0004|#Errors}} no validator is found for the specified version.
+
|{{Error|error|#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.
 
|-
 
|-
 
| '''Examples'''
 
| '''Examples'''
Line 196: Line 218:
  
 
==validate:rng-info==
 
==validate:rng-info==
 
{{Mark|Introduced with Version 8.3}}:
 
  
 
{| width='100%'
 
{| width='100%'
Line 208: Line 228:
 
|-
 
|-
 
| '''Errors'''
 
| '''Errors'''
|{{Error|BXVA0002|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003|#Errors}} the RelaxNG validator is not available.<br/>{{Error|BXVA0004|#Errors}} no validator is found for the specified version.
+
|{{Error|init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} the RelaxNG validator is not available.
 
|}
 
|}
  
 
==validate:rng-report==
 
==validate:rng-report==
 
{{Mark|Introduced with Version 8.3}}:
 
  
 
{| width='100%'
 
{| width='100%'
Line 224: Line 242:
 
|-
 
|-
 
| '''Errors'''
 
| '''Errors'''
|{{Error|BXVA0002|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003|#Errors}} The RelaxNG validator is not available.<br/>{{Error|BXVA0004|#Errors}} no validator is found for the specified version.
+
|{{Error|init|#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, simply install Vincent Lizzi’s excellent [https://github.com/Schematron/schematron-basex Schematron XQuery Module for BaseX]:
 +
 +
<syntaxhighlight lang="xquery">
 +
repo:install('https://github.com/Schematron/schematron-basex/raw/master/dist/schematron-basex-1.2.xar')
 +
</syntaxhighlight>
 +
 +
The following query illustrates how documents are validated. It is directly taken from the GitHub project:
 +
 +
<syntaxhighlight 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))
 +
)
 +
</syntaxhighlight>
  
 
=Errors=
 
=Errors=
Line 233: Line 273:
 
|Description
 
|Description
 
|-
 
|-
|{{Code|BXVA0001}}
+
|{{Code|error}}
|The document cannot be validated against the specified DTD or XML Schema.
+
|The document cannot be validated against the specified schema.
 
|-
 
|-
|{{Code|BXVA0002}}
+
|{{Code|init}}
 
|The validation cannot be started.
 
|The validation cannot be started.
 
|-
 
|-
|{{Code|BXVA0003}}
+
|{{Code|not-found}}
 
|No validator is available.
 
|No validator is available.
|-
 
|{{Code|BXVA0004}}
 
|No validator is found for the specified version.
 
 
|}
 
|}
  
 
=Changelog=
 
=Changelog=
 +
 +
;Version 9.2
 +
 +
* Added: [[#validate:xsd-processor|validate:xsd-processor]], [[#validate:xsd-version|validate:xsd-version]]
 +
* Updated: [[#validate:xsd|validate:xsd]], [[#validate:xsd-info|validate:xsd-info]], [[#validate:xsd-report|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
 
;Version 8.3
 +
 
* Added: [[#validate:rng|validate:rng]], [[#validate:rng-info|validate:rng-info]]
 
* Added: [[#validate:rng|validate:rng]], [[#validate:rng-info|validate:rng-info]]
 
* Added: [[#validate:dtd-report|dtd-report]], [[#validate:xsd-report|xsd-report]], [[#validate:rng-report|validate:rng-report]]
 
* Added: [[#validate:dtd-report|dtd-report]], [[#validate:xsd-report|xsd-report]], [[#validate:rng-report|validate:rng-report]]
  
 
;Version 7.6
 
;Version 7.6
 +
 
* Added: [[#validate:xsd-info|validate:xsd-info]], [[#validate:dtd-info|validate:dtd-info]]
 
* Added: [[#validate:xsd-info|validate:xsd-info]], [[#validate:dtd-info|validate:dtd-info]]
  
 
The module was introduced with Version 7.3.
 
The module was introduced with Version 7.3.
 
[[Category:XQuery]]
 

Revision as of 12:19, 2 July 2020

This XQuery Module contains functions to perform validations against DTDs, XML Schema and RelaxNG. The documentation further describes how to use Schematron validation with BaseX.

Conventions

All functions and errors in this module are assigned to the http://basex.org/modules/validate namespace, which is statically bound to the validate prefix.

DTD Validation

Checks whether an XML document validates against a DTD. The input document can be specified as:

  • xs:string, representing a URI (relative URIs will always be resolved against the static base URI of the query),
  • xs:string, representing the resource in its string representation, or
  • 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

Signatures validate:dtd($input as item()) as empty-sequence()
validate:dtd($input as item(), $schema as xs:string?) as empty-sequence()
Summary Validates the XML $input document against a $schema and returns an empty sequence or an error.
Errors error: the validation fails.
init: the validation process cannot be started.
not-found: no DTD validator is available.
Examples
  • validate:dtd('doc.xml', 'doc.dtd') validates the document doc.xml against the specified DTD file doc.dtd.
  • The following example validates an invalid document against a DTD, which is specified as string:

<syntaxhighlight lang="xquery"> try {

 let $doc := <invalid/>
 let $schema := '<!ELEMENT root (#PCDATA)>'
 return validate:dtd($doc, $schema)

} catch validate:error {

 'DTD Validation failed.'

} </syntaxhighlight>

validate:dtd-info

Signatures validate:dtd-info($input as item()) as xs:string*
validate:dtd-info($input as item(), $schema as xs:string?) as xs:string*
Summary Validates the XML $input document against a $schema and returns warnings, errors and fatal errors in a string sequence.
Errors init: the validation process cannot be started.
not-found: no DTD validator is available.
Examples
  • validate:dtd-info(<invalid/>, '<!ELEMENT root (#PCDATA)>') returns:
    2:11: Element type "invalid" must be declared..

validate:dtd-report

width='100%'
Signatures validate:dtd-report($input as item()) as element(report)
validate:dtd-report($input as item(), $schema as xs:string?) as element(report)
Summary Validates the XML $input document against a $schema and returns warnings, errors and fatal errors as XML.
Errors init: the validation process cannot be started.
not-found: no DTD validator is available.
Examples
  • validate:dtd-report(<invalid/>, '<!ELEMENT root (#PCDATA)>') returns:

<syntaxhighlight lang="xml"> <report>

 <status>invalid</status>
 <message level="Error" line="2" column="11">Element type "invalid" must be declared.</message>

</report> </syntaxhighlight>

XML Schema Validation

Checks whether an XML document validates against an XML Schema. The input document and the schema can be specified as:

  • xs:string, containing the path to the resource,
  • xs:string, containing the resource in its string representation, or
  • node(), containing the resource itself.

If no schema is given, the input is expected to contain an xsi:(noNamespace)schemaLocation attribute, as defined in 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 binary distributions and copy the following libraries to the lib/custom directory of the full distribution of BaseX:
    • org.eclipse.wst.xml.xpath2.processor_1.2.0.jar
    • cupv10k-runtime.jar
    • xercesImpl.jar
    • xml-apis.jar
  • Saxon Enterprise Edition will be used if you download the ZIP release and if you copy saxon9ee.jar and a valid license key to the classpath.

validate:xsd

Signatures validate:xsd($input as item()) as empty-sequence()
validate:xsd($input as item(), $schema as item()?) as empty-sequence()
validate:xsd($input as item(), $schema as item()?, $features as map(*)) as empty-sequence()
Summary Validates the XML $input document against a $schema, using the processor-specific $features.
Errors error: the validation fails.
init: the validation process cannot be started.
not-found: no XML Schema validator is available.
Examples
  • Pass on document and schema as nodes:

<syntaxhighlight lang="xquery"> let $doc := <simple:root xmlns:simple='http://basex.org/simple'/> let $schema :=

 <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='http://basex.org/simple'>
   <xs:element name='root'/>
 </xs:schema>

return validate:xsd($doc, $schema) </syntaxhighlight>

  • Validate all documents of a database against the specified schema, using the supplied feature:

<syntaxhighlight lang="xquery"> for $city in db:open('cities') return validate:xsd($city, 'city.xsd',

 map { 'http://javax.xml.XMLConstants/feature/secure-processing': true() }

) </syntaxhighlight>

validate:xsd-info

Signatures validate:xsd-info($input as item()) as xs:string*
validate:xsd-info($input as item(), $schema as item()?) as xs:string*
validate:xsd-info($input as item(), $schema as item()?, $features as map(*)) as xs:string*
Summary Validates the XML $input document against a $schema, using the processor-specific $features, and returns warnings, errors and fatal errors in a string sequence.
Errors init: the validation process cannot be started.
not-found: no XML Schema validator is available.

validate:xsd-report

Signatures validate:xsd-report($input as item()) as element(report)
validate:xsd-report($input as item(), $schema as xs:string?) as element(report)
validate:xsd-report($input as item(), $schema as xs:string?, $features as map(*)) as element(report)
Summary Validates the XML $input document against a $schema, using the processor-specific $features, and returns warnings, errors and fatal errors as XML.
Errors init: the validation process cannot be started.
not-found: no XML Schema validator is available.

validate:xsd-processor

Signatures validate:xsd-processor() as xs:string
Summary Returns the name of the applied XSD processor.

validate:xsd-version

Signatures validate:xsd-version() as xs:string
Summary Returns the supported version of XSD Schema.

RelaxNG Validation

Checks whether an XML document validates against a RelaxNG schema. The input document and the schema can be specified as:

  • xs:string, containing the path to the resource,
  • xs:string, containing the resource in its string representation, or
  • node(), containing the resource itself.

RelaxNG validation will be available if Jing exists in the classpath. The latest version, jing-20091111.jar, is included in the full distributions of BaseX. As Jing additionally supports NVDL validation, you can also use the functions to validate the input against NVDL schemas.

validate:rng

Signatures validate:rng($input as item(), $schema as item()) as empty-sequence()
validate:rng($input as item(), $schema as item(), $compact as xs:boolean) as empty-sequence()
Summary Validates the XML $input document against a $schema, using the XML or $compact notation.
Errors error: the validation fails.
init: the validation process cannot be started.
not-found: the RelaxNG validator is not available.
Examples
  • validate:rng('doc.xml', 'doc.rng') validates the document doc.xml against the specified schema doc.rng.

validate:rng-info

Signatures validate:rng-info($input as item(), $schema as item()) as xs:string*
validate:rng-info($input as item(), $schema as item(), $compact as xs:boolean) as xs:string*
Summary Validates the XML $input document against a $schema, using the XML or $compact notation, and returns warnings, errors and fatal errors in a string sequence.
Errors init: the validation process cannot be started.
not-found: the RelaxNG validator is not available.

validate:rng-report

Signatures validate:rng-report($input as item(), $schema as xs:string) as element(report)
validate:rng-report($input as item(), $schema as xs:string, $compact as xs:boolean) as element(report)
Summary Validates the XML $input document against a $schema, using the XML or $compact notation, and returns warnings, errors and fatal errors as XML.
Errors init: the validation process cannot be started.
not-found: The RelaxNG validator is not available.

Schematron Validation

If you want to use Schematron for validating documents, simply install Vincent Lizzi’s excellent Schematron XQuery Module for BaseX:

<syntaxhighlight lang="xquery"> repo:install('https://github.com/Schematron/schematron-basex/raw/master/dist/schematron-basex-1.2.xar') </syntaxhighlight>

The following query illustrates how documents are validated. It is directly taken from the GitHub project:

<syntaxhighlight 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))

) </syntaxhighlight>

Errors

Code Description
error The document cannot be validated against the specified schema.
init The validation cannot be started.
not-found No validator is available.

Changelog

Version 9.2
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
Version 7.6

The module was introduced with Version 7.3.