Changes

Jump to navigation Jump to search
4,246 bytes added ,  06:52, 29 November 2019
no edit summary
This [[Module Library|XQuery Module]] contains functions to perform validations against [http://en.wikipedia.org/wiki/Document_Type_Declaration DTDs], [http://www.w3.org/XML/Schema XML Schema] and (since {{Version|8RelaxNG.3}}) [http://relaxngThe documentation further describes how to use Schematron validation with BaseX.org/ RelaxNG]:
* For DTDs =Conventions= All functions and XML Schema, Java’s standard validators is used.* For XML Schema, errors in this module are assigned to the [<code><nowiki>http://www.saxonica.com/ Saxon XSLT Processor] – {{Code|SaxonHE.jar}}, {{Code|SaxonPE.jar}}, or {{Code|SaxonEEbasex.jar}} – is used if it is added to the classpath.* For RelaxNG, [http:org/modules/www.thaiopensource.comvalidate</relaxngnowiki></jing.html Jing] must be added code> namespace, which is statically bound to the classpath. The latest version, {{Code|jing-20091111.jarvalidate}}, is included in the full distributions of BaseXprefix.<br/> =DTD Validation=
=Conventions=Checks whether an XML document validates against a DTD. The input document can be specified as:
All functions in this module are assigned to the <code><nowiki>http* {{Code|xs://basex.org/modules/validate</nowiki></code> namespacestring}}, which is statically bound to representing a URI (relative URIs will always be resolved against the static base URI of the query),* {{Code|validatexs:string}} prefix.<br/>All errors are assigned to , representing the <code><nowiki>http://basex.org/errors</nowiki></code> namespaceresource in its string representation, which is statically bound to the or* {{Code|bxerrnode()}} prefix, representing the resource itself.
=Functions=If no DTD is supplied in a function, the XML document is expected to contain an embedded DTD doctype declaration.
==validate:dtd==
 
{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|validate:dtd|$input as item()|empty-sequence()}}<br />{{Func|validate:dtd|$input as item(), $dtd schema as xs:string?|empty-sequence()}}
|-
| '''Summary'''
|Validates the document specified by XML {{Code|$input}}. document against a {{Code|$inputschema}} can be specified as:* and returns an {{Code|xs:string}}, containing the path to the resource,* empty sequence or 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 declarationerror.<br />
|-
| '''Errors'''
|{{Error|BXVA0001error|#Errors}} the validation fails.<br/>{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} no DTD validator is available.
|-
| '''Examples'''
try {
let $doc := <invalid/>
let $dtd schema := '<!ELEMENT root (#PCDATA)>' return validate:dtd($doc, $dtdschema)} catch BXVA0001 validate:error {
'DTD Validation failed.'
}
</pre>
|-
|}
|-
| width='120' | '''Signatures'''
|{{Func|validate:dtd-info|$input as item()|xs:string*}}<br />{{Func|validate:dtd-info|$input as item(), $dtd schema as xs:string?|xs:string*}}
|-
| '''Summary'''
|Validates the XML {{Code|$input}} document specified by against a {{Code|$inputschema}} and returns warningwarnings, errors and fatal errors in a string sequence. {{Code|$input}} 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 DTD for validation. If no DTD is given, {{Code|$input}} is required to contain a DTD doctype declaration.<br />
|-
| '''Errors'''
|{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} no DTD validator is available.|-| '''Examples'''|* <code>validate:dtd-info(<invalid/>, '<!ELEMENT root (#PCDATA)>')</code> returns:<br/><code>2:11: Element type "invalid" must be declared.</code>.
|}
==validate:xsddtd-report==
{| width='100%'
| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|validate:xsddtd-report|$input as item()|empty-sequenceelement(report)}}<br />{{Func|validate:xsddtd-report|$input as item(), $schema as item()xs:string?|empty-sequenceelement(report)}}
|-
| '''Summary'''
|Validates the document specified by XML {{Code|$input}}. Both document against a {{Code|$inputschema}} and returns warnings, errors and fatal errors as XML.|-| '''Errors'''|{{Error|init|#Errors}} the validation process cannot be started.<br/>{{CodeError|not-found|$schema#Errors}}no DTD validator is available.|-| '''Examples'''|* <code>validate:dtd-report(<invalid/>, '<!ELEMENT root (#PCDATA)>')</code> returns:<pre class="brush: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 [http://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 [http://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 applied 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== {| width='100%'|-| 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()?, $features as map(*)|empty-sequence()}}|-| '''Summary'''|Validates the XML {{Code|$input}} document against a {{Code|$schema}}, using the processor-specific {{Code|$features}}.
|-
| '''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.
|-
| '''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 class="brush:xquery">
let $doc := <simple:root xmlns:simple='http://basex.org/simple'/>
</xs:schema>
return validate:xsd($doc, $schema)
</pre>
* Validate all documents of a database against the specified schema, using the supplied feature:
<pre class="brush:xquery">
for $city in db:open('cities')
return validate:xsd($city, 'city.xsd',
map { 'http://javax.xml.XMLConstants/feature/secure-processing': true() }
)
</pre>
|}
|-
| 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*}}<br />{{Func|validate:xsd-info|$input as item(), $schema as item()?, $features as map(*)|xs:string*}}|-| '''Summary'''|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'''|{{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%'|-| 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 document specified by XML {{Code|$input}} and returns warning, errors and fatal errors in document against a string sequence. {{Code|$input}} and {{Code|$schema}} can be specified as:* {{Code|xs:string}}, containing using the path to the resource,* processor-specific {{Code|xs:string$features}}, containing the resource in its string representationand returns warnings, or* {{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 errors and fatal errors as defined in [http://www.w3.org/TR/xmlschema-1/#xsi_schemaLocation W3C XML Schema].<br />
|-
| '''Errors'''
|{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|not-found|#Errors}} no XML Schema validator is available.
|}
==validate:rngxsd-processor== {| width='100%'|-| width='120' | '''Signatures'''|{{Func|validate:xsd-processor||xs:string}}|-| '''Summary'''|Returns the name of the applied XSD processor.|}
{{Mark|Introduced with Version 8.3}}==validate:xsd-version==
{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|validate:rng|$input as item(), $schema as item()|emptyxsd-sequence()}}<br/>{{Funcversion|validate:rng|$input as item(), $schema as item(), $compact as xs:boolean|empty-sequence()string}}
|-
| '''Summary'''
|Validates Returns the document specified by {{Code|$input}}supported version of XSD Schema. The validation schema is specified by {{Code|$schema}}, and {{Code|$compact}} indicates if the  =RelaxNG Validation= Checks whether an XML document validates against a RelaxNG schema uses the compact RelaxNG notation. Both {{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 [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. 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%'
|-
| width='120' | '''Signatures'''
|{{Func|validate:rng|$input as item(), $schema as item()|empty-sequence()}}<br/>{{Func|validate:rng|$input as item(), $schema as item(), $compact as xs:boolean|empty-sequence()}}
|-
| '''Summary'''
|Validates the XML {{Code|$input}} document against a {{Code|$schema}}, using the XML or {{Code|$compact}} notation.
|-
| '''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.
|-
| '''Examples'''
==validate:rng-info==
{| width='100%'|-| width='120' | '''Signatures'''|{{MarkFunc|validate:rng-info|Introduced with Version 8$input as item(), $schema as item()|xs:string*}}<br/>{{Func|validate:rng-info|$input as item(), $schema as item(), $compact as xs:boolean|xs:string*}}|-| '''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.|-| '''Errors'''|{{Error|init|#Errors}} the validation process cannot be started.3<br/>{{Error|not-found|#Errors}}the RelaxNG validator is not available.|} ==validate:rng-report==
{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|validate:rng-inforeport|$input as item(), $schema as item()|xs:string*|element(report)}}<br/>{{Func|validate:rng-inforeport|$input as item(), $schema as item()xs:string, $compact as xs:boolean|xs:string*element(report)}}
|-
| '''Summary'''
|Validates the document specified by XML {{Code|$input}} and returns warnings, errors and fatal errors in document against a string sequence. The validation schema is specified by {{Code|$schema}}, and using the XML or {{Code|$compact}} indicates if the schema uses the compact RelaxNG notation. {{Code|$input}} , and returns warnings, errors and {{Code|$schema}} can be specified fatal errors 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 itselfXML.
|-
| '''Errors'''
|{{Error|BXVA0002init|#Errors}} the validation process cannot be started.<br/>{{Error|BXVA0003not-found|#Errors}} the 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]:
 
<pre class="brush: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 class="brush: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=
|Description
|-
|{{Code|BXVA0001error}}|The document cannot be validated against the specified DTD or XML Schemaschema.
|-
|{{Code|BXVA0002init}}
|The validation cannot be started.
|-
|{{Code|BXVA0003not-found}}|No RelaxNG validator is available.
|}
=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
 
* 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]]
;Version 7.6
 
* Added: [[#validate:xsd-info|validate:xsd-info]], [[#validate:dtd-info|validate:dtd-info]]
The module was introduced with Version 7.3.
 
[[Category:XQuery]]
Bureaucrats, editor, reviewer, Administrators
13,550

edits

Navigation menu