我正在使用oXygen XML Editor 16.1使用SaxonEE set for XML Schema 1.1进行这些测试 .
我想确保复杂类型中的元素是基本complexType的限制,具有相同数量的枚举 . (以下代码)
示例complexType(帖子的底部)应该使此断言失败:
<xs:assert test="count(//xs:element[@name='id-name']//xs:enumeration)
eq count(//xs:element[@name='issuer']//xs:enumeration)
and
count(//xs:element[@name='issuer']//xs:enumeration)
eq count(//xs:element[@name='assignor']//xs:enumeration)"></xs:assert>
因为赋值人有三个枚举而其他元素有两个 . 无论我将它放在基本complexType还是受限制的complexType中,它仍将限制显示为有效模式 .
如果我执行此操作
count(//xs:element[@name='id-name']//xs:enumeration)
eq count(//xs:element[@name='issuer']//xs:enumeration) and
count(//xs:element[@name='issuer']//xs:enumeration)
eq count(//xs:element[@name='assignor']//xs:enumeration)
在XPath编辑器中,它会失败(返回false),并且当三个都有两个枚举时传递(返回true) .
样品限制:
<xs:complexType name='mytype' xml:lang='en-US'>
<xs:complexContent>
<xs:restriction base='myBaseType'>
<xs:sequence>
<xs:element maxOccurs='1' minOccurs='1' name='id-name'>
<xs:simpleType>
<xs:restriction base='xs:string'>
<xs:enumeration value='URI'></xs:enumeration>
<xs:enumeration value='ID Number'></xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element maxOccurs='1' minOccurs='1' name='issuer'>
<xs:simpleType>
<xs:restriction base='xs:string'>
<xs:enumeration value='Owner'/>
<xs:enumeration value='Owner'/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element maxOccurs='1' minOccurs='1' name='assignor'>
<xs:simpleType>
<xs:restriction base='xs:string'>
<xs:enumeration value='Owner'/>
<xs:enumeration value='Owner'/>
<xs:enumeration value='Owner'/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
'myBaseType'位于另一个“包含”的模式中 . 那个complexType看起来像这样:
<xs:complexType name="myBaseType">
<xs:complexContent>
<xs:extension base="someType">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="id-name" type="xs:string"></xs:element>
<xs:element maxOccurs="1" minOccurs="0" name="issuer" type="xs:string"></xs:element>
<xs:element maxOccurs="1" minOccurs="0" name="assignor" type="xs:string"></xs:element>
</xs:sequence>
<xs:assert test="count(//xs:element[@name='id-name']//xs:enumeration) eq count(//xs:element[@name='issuer']//xs:enumeration) and
count(//xs:element[@name='issuer']//xs:enumeration) eq count(//xs:element[@name='assignor']//xs:enumeration)
"></xs:assert>
</xs:extension>
</xs:complexContent>
我错过了什么?我不能在限制complexType上 Build 断言,还是只对例子数据进行求值?在我看来,由于'mytype'是'myBaseType'的限制,因此应该应用断言 .
1 回答
正如您在问题结束时所预期的那样,断言的范围是由XSD管理的XML文档实例,而不是XSD本身 . 如果您希望对XSD本身进行断言,则必须创建一个将原始XSD视为XML文档的meta-xsd .
你可以从XML Schema schema开始 . 但是,您应该考虑使用Schematron断言,这可能更适合选择性地执行约束 . 我使用Schematron而不是XSD来强制执行组织惯例,并发现它是检查所采用策略合规性的可行方法 .
每个OP评论更新
不,这不是你试图从验证XML文档实例的相同XSD对XSD进行断言的原因 . 它是一个单独的XSD通过
xsd:include
引入的事实没有改变;它已经低估了这项任务所涉及的复杂性 . 如果你没有意识到meta XSD必须做什么 .因为通过Schematron或其他技术强制执行点约束的复杂性实际上低于通过XSD验证所有XSD的复杂性,然后加上一些断言来覆盖点约束 . 此外,XSD 1.1 's assertion facilities are considerably more restricted than Schematron'的断言 .