我在验证与Schematron结合使用的SXD架构时遇到了困难。
按照本guide中描述的步骤,我在XSD文档中的<xs:appinfo>
标记之间加入了schematron,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Test">
<xs:annotation>
<xs:appinfo>
<sch:pattern name="Testing schematron" xmlns:sch="http://purl.oclc.org/dsdl/schematron">
<sch:rule context="Test">
<sch:assert test="@Attribute1">Attribute 1 exists</sch:assert>
</sch:rule>
</sch:pattern>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:attribute name="Attribute1" type="xs:string" use="optional"/>
<xs:attribute name="Attribute2" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
</xs:schema>
本文档应该测试(或验证)文档
<?xml version="1.0" encoding="ISO-8859-1"?>
<Test Attribute1="attr1"/>
使用schematron page上列出的简单的基于xsltproc的脚本。不幸的是,我在脚本的最后一步收到以下错误消息。
step3.xsl:13: parser error : Extra content at the end of the document
plates select="*|comment()|processing-instruction()" mode="M0"/></axsl:template>
^
cannot parse step3.xsl
我很感激帮助找出导致此错误的原因。
答案 0 :(得分:3)
您的架构是正确的,并且做了它的目的......
问题在于脚本:这个脚本希望接收一个Schematron模式,并为它提供一个带有嵌入式规则的XML Schema,这是一种不同的野兽。
要进行验证,您需要运行第一个转换,从XML Schema中提取Schematron并对此结果运行验证。
您还可以使用xmllint(libxml)根据XML Schema验证文档,这是一种不同的操作。
为此,您可以将脚本的下载ExtractSchFromXSD.xsl更改为:
#!/bin/bash
echo XSD validation
xmllint -schema $1 $2
echo Step0 ...
xsltproc ExtractSchFromXSD.xsl $1 > schema.sch
echo Step1 ...
xsltproc iso_dsdl_include.xsl schema.sch > step1.xsl
echo Step2 ...
xsltproc iso_abstract_expand.xsl step1.xsl > step2.xsl
echo Step3 ...
xsltproc iso_svrl_for_xslt1.xsl step2.xsl > step3.xsl
echo Validation ...
xsltproc step3.xsl $2 | tee result.svrl
或者,您可以使用本机支持模式中的嵌入式Schematron规则的实现或oXygen之类的工具。