XQuery/文档验证
您希望使用 XML 模式验证文档。
注意:验证是一个非常复杂的话题。eXist 带有默认设置,这些设置可能会阻止添加与命名空间关联的文件,一旦模式保存在注册表中。请注意这些已记录在此处的因素。
eXist 支持一个验证模块,该模块包含一个validate()函数,用于根据语法文件(如 XML 模式)验证 XML 文件。
validation:validate($input-doc as item(), $schema-uri as xs:anyURI) as xs:boolean
其中:$input-doc 是您要验证的文档,$schema-uri 是要用于验证文档的 XML 模式的 URI。请注意,这必须是 xs:anyURI 类型。
此函数返回一个 true/false 的单一值,如果文档根据 XML 模式有效,则为 true。
xquery version "1.0";
let $doc :=
<root>
<element>test</element>
</root>
let $schema := '/db/test/validate/schema.xsd'
(: you must run this every time the XML Schema file changes! :)
let $clear := validation:clear-grammar-cache()
let $result :=
if (validation:validate($doc, $schema))
then "PASS"
else "FAIL"
return
<results>
{$result}
</results>
这是一个用于验证非常小的 XML 文件的 XML 模式示例。在 eXist 1.3 中,仅支持具有命名空间的 XML 文件。
<xs:schema
xmlns="http://example.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.com"
elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="my-data"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
关于此 XML 模式,有两个要点需要注意。
targetNamespace="http://example.com" 属性表示此 XML 模式针对 http://example.com 命名空间。
elementFormDefault="qualified" 属性表示当 XML 解析器读取文件的根时,应使用目标命名空间。
如果没有这两个属性,验证将无法工作。
<root xmlns="http://example.com">
<my-data>test</my-data>
</root>
validate() 函数仅返回简单的布尔 true/false 值。如果您的 XML 文件中存在错误,则此函数在查找错误方面不是很有用。为了帮助此过程,还有一个名为validate-report()的函数。它具有相同的参数
validation:validate-report($input-doc, $schema-uri)
结果可以修改为以下内容
let $result :=
if ( validation:validate($input-doc, $schema-uri) )
then "The XML File is Valid"
else (
"The XML File is Not Valid",
validation:validate-report($input-doc, $schema-uri)
)