Difference between revisions of "Validation Module"

From BaseX Documentation
Jump to navigation Jump to search
(Example in validate:dtd section referred to wrong function name)
m (Text replacement - "syntaxhighlight" to "pre")
 
(75 intermediate revisions by 3 users not shown)
Line 1: Line 1:
This [[Module Library|XQuery Module]] contains functions to perform validations against [http://www.w3.org/XML/Schema 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|saxon9ee.jar}}) is added to the classpath.
+
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|http://basex.org/modules/validate}} 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|http://basex.org/errors}} namespace, which is statically bound to the {{Code|bxerr}} prefix.
 
  
=Functions=
+
=DTD 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%'
 
{| width='100%'
|-
+
|- valign="top"
| width='120' | '''Signatures'''
+
| width='120' | '''Signature'''
|{{Func|validate:xsd|$input as item()|empty-sequence()}}<br />{{Func|validate:xsd|$input as item(), $schema as item()|empty-sequence()}}
+
|<pre>validate:dtd-report(
|-
+
  $input   as item(),
 +
  $schema as xs:string?  := ()
 +
) as element(report)</pre>
 +
|- valign="top"
 
| '''Summary'''
 
| '''Summary'''
|Validates the document specified by {{Code|$input}}. Both {{Code|$input}} and {{Code|$schema}} can be specified as:
+
|Validates the XML {{Code|$input}} document against a {{Code|$schema}} and returns warnings, errors and fatal errors as XML.
 +
|- 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-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 path to the resource,
 
* {{Code|xs:string}}, containing the resource in its string representation, or
 
* {{Code|xs:string}}, containing the resource in its string representation, or
 
* {{Code|node()}}, containing the resource itself.
 
* {{Code|node()}}, containing the resource itself.
{{Code|$schema}} can be used to specify the schema for validation. If no schema is given, {{Code|$input}} is required to contain an {{Code|xsi:(noNamespace)schemaLocation}} attribute as defined in [http://www.w3.org/TR/xmlschema-1/#xsi_schemaLocation W3C XML Schema].<br />
+
 
|-
+
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 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()</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'''
 
| '''Errors'''
|{{Error|BXVA0001|#Errors}} the validation fails.<br/>{{Error|BXVA0002|#Errors}} the validation process cannot be started.
+
|{{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.
|-
+
|- valign="top"
 
| '''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:
+
<pre 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 35: Line 145:
 
   </xs:schema>
 
   </xs:schema>
 
return validate:xsd($doc, $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>
 
</pre>
 
|}
 
|}
Line 41: Line 158:
  
 
{| width='100%'
 
{| width='100%'
|-
+
|- valign="top"
| width='120' | '''Signatures'''
+
| width='120' | '''Signature'''
|{{Func|validate:xsd-info|$input as item()|xs:string*}}<br />{{Func|validate:xsd-info|$input as item(), $schema as item()|xs:string*}}
+
|<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'''
 
| '''Summary'''
|Validates the document specified by {{Code|$input}} and returns warning, errors and fatal errors in a string sequence. {{Code|$input}} and {{Code|$schema}} can be specified as:
+
|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='120' | '''Signature'''
 +
|<pre>validate:xsd-version() as xs:string</pre>
 +
|- valign="top"
 +
| '''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:
 +
 
 
* {{Code|xs:string}}, containing the path to the resource,
 
* {{Code|xs:string}}, containing the path to the resource,
 
* {{Code|xs:string}}, containing the resource in its string representation, or
 
* {{Code|xs:string}}, containing the resource in its string representation, or
 
* {{Code|node()}}, containing the resource itself.
 
* {{Code|node()}}, containing the resource itself.
{{Code|$schema}} can be used to specify the schema for validation. If no schema is given, {{Code|$input}} is required to contain an {{Code|xsi:(noNamespace)schemaLocation}} attribute as defined in [http://www.w3.org/TR/xmlschema-1/#xsi_schemaLocation W3C XML Schema].<br />
+
 
|-
+
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==
 +
 
 +
{| width='100%'
 +
|- valign="top"
 +
| width='120' | '''Signature'''
 +
|<pre>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'''
 
| '''Errors'''
|{{Error|BXVA0002|#Errors}} the validation process cannot be started.
+
|{{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.
 +
|- valign="top"
 +
| '''Examples'''
 +
|
 +
* {{Code|validate:rng('doc.xml', 'doc.rng')}} validates the document {{Code|doc.xml}} against the specified schema {{Code|doc.rng}}.
 
|}
 
|}
  
==validate:dtd==
+
==validate:rng-info==
 +
 
 
{| width='100%'
 
{| width='100%'
|-
+
|- valign="top"
| width='120' | '''Signatures'''
+
| width='120' | '''Signature'''
|{{Func|validate:dtd|$input as item()|empty-sequence()}}<br />{{Func|validate:dtd|$input as item(), $dtd as xs:string|empty-sequence()}}
+
|<pre>validate:rng-info(
|-
+
  $input   as item(),
 +
  $schema  as item(),
 +
  $compact  as xs:boolean?  := map { }
 +
) as xs:string*</pre>
 +
|- valign="top"
 
| '''Summary'''
 
| '''Summary'''
|Validates the document specified by {{Code|$input}}. {{Code|$input}} can be specified as:
+
|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.
* an {{Code|xs:string}}, containing the path to the resource,
+
|- valign="top"
* an {{Code|xs:string}}, containing the resource in its string representation, or
 
* a {{Code|node()}}, containing the resource itself.
 
{{Code|$schema}} can be used to specify the DTD for validation. If no DTD is given, {{Code|$input}} is required to contain a DTD doctype declaration.<br />
 
|-
 
 
| '''Errors'''
 
| '''Errors'''
|{{Error|BXVA0001|#Errors}} the validation fails.<br/>{{Error|BXVA0002|#Errors}} the validation process cannot be started.
+
|{{Error|init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} the RelaxNG validator is not available.
|-
 
| '''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 class="brush:xquery">
 
try {
 
  let $doc := <invalid/>
 
  let $dtd := '<!ELEMENT root (#PCDATA)>'
 
  return validate:dtd($doc, $dtd)
 
} catch BXVA0001 {
 
  'DTD Validation failed.'
 
}
 
</pre>
 
|-
 
 
|}
 
|}
  
==validate:dtd-info==
+
==validate:rng-report==
  
 
{| width='100%'
 
{| width='100%'
|-
+
|- valign="top"
| width='120' | '''Signatures'''
+
| width='120' | '''Signature'''
|{{Func|validate:dtd-info|$input as item()|xs:string*}}<br />{{Func|validate:dtd-info|$input as item(), $dtd as xs:string|xs:string*}}
+
|<pre>validate:rng-report(
|-
+
  $input   as item(),
 +
  $schema  as xs:string,
 +
  $compact  as xs:boolean?  := map { }
 +
) as element(report)</pre>
 +
|- valign="top"
 
| '''Summary'''
 
| '''Summary'''
|Validates the document specified by {{Code|$input}} and returns warning, errors and fatal errors in a string sequence. {{Code|$input}} can be specified as:
+
|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.
* {{Code|xs:string}}, containing the path to the resource,
+
|- valign="top"
* {{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 DTD for validation. If no DTD is given, {{Code|$input}} is required to contain a DTD doctype declaration.<br />
 
|-
 
 
| '''Errors'''
 
| '''Errors'''
|{{Error|BXVA0002|#Errors}} the validation process cannot be started.
+
|{{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, 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=
 
=Errors=
Line 111: Line 308:
 
! width="110"|Code
 
! width="110"|Code
 
|Description
 
|Description
|-
+
|- valign="top"
|{{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.
|-
+
|- valign="top"
|{{Code|BXVA0002}}
+
|{{Code|init}}
 
|The validation cannot be started.
 
|The validation cannot be started.
 +
|- valign="top"
 +
|{{Code|not-found}}
 +
|No validator is available.
 
|}
 
|}
  
 
=Changelog=
 
=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: {{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
 
;Version 7.6
* Added: [[#validate:xsd-info|validate:xsd-info]], [[#validate:dtd-info|validate:dtd-info]]
+
 
 +
* Added: {{Function||validate:xsd-info}}, {{Function||validate:dtd-info}}
  
 
The module was introduced with Version 7.3.
 
The module was introduced with Version 7.3.
 
[[Category:XQuery]]
 

Latest revision as of 17:38, 1 December 2023

Conventions[edit]

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[edit]

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[edit]

Signature
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:
try {
  let $doc := <invalid/>
  let $schema := '<!ELEMENT root (#PCDATA)>'
  return validate:dtd($doc, $schema)
} catch validate:error {
  'DTD Validation failed.'
}

validate:dtd-info[edit]

Signature
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[edit]

Signature
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:
<report>
  <status>invalid</status>
  <message level="Error" line="2" column="11">Element type "invalid" must be declared.</message>
</report>

XML Schema Validation[edit]

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[edit]

Updated with Version 11: caching feature added.

Signature
validate:xsd(
  $input    as item(),
  $schema   as item()?  := (),
  $options  as map(*)?  := map { }
) as empty-sequence()
Summary Validates the XML $input document against a $schema. The supported $options are:
  • cache: Generated schemas are cached and reused.
  • All other options are handled as features and passed on to the validator.
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:
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)
  • Validate all documents of a database against the specified schema, using the supplied feature:
for $city in db:get('cities')
return validate:xsd($city, 'city.xsd',
  map { 'http://javax.xml.XMLConstants/feature/secure-processing': true() }
)

validate:xsd-info[edit]

Signature
validate:xsd-info(
  $input    as item(),
  $schema   as item()?  := (),
  $options  as map(*)?  := map { }
) as xs:string*
Summary Validates the XML $input document against a $schema and returns warnings, errors and fatal errors in a string sequence. See validate:xsd for more information of the $options parameter.
Errors init: the validation process cannot be started.
not-found: no XML Schema validator is available.

validate:xsd-report[edit]

Signature
validate:xsd-report(
  $input     as item(),
  $schema    as xs:string?  := (),
  $options   as map(*)      := map { }
) as element(report)
Summary Validates the XML $input document against a $schema and returns warnings, errors and fatal errors as XML. See validate:xsd for more information of the $options parameter.
Errors init: the validation process cannot be started.
not-found: no XML Schema validator is available.

validate:xsd-processor[edit]

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

validate:xsd-version[edit]

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

RelaxNG Validation[edit]

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[edit]

Signature
validate:rng(
  $input    as item(),
  $schema   as item(),
  $compact  as xs:boolean?  := map { }
) 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[edit]

Signature
validate:rng-info(
  $input    as item(),
  $schema   as item(),
  $compact  as xs:boolean?  := map { }
) 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[edit]

Signature
validate:rng-report(
  $input    as item(),
  $schema   as xs:string,
  $compact  as xs:boolean?  := map { }
) 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[edit]

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

repo:install('https://github.com/Schematron/schematron-basex/raw/master/dist/schematron-basex-1.2.xar')

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

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

Errors[edit]

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[edit]

Version 11.0
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.