XSD 以确保元素 X 位于元素 Y 之前
XSD to ensure element X is preceded by element Y
我正在解析一个 XML 文档,我想确保每个元素 <element2>
前面都有 <element1>
,条件是没有 <element3>
它们之间。
我知道如何使用 XPath 执行此操作,但我想不出使用 XSD 执行此操作的方法。有办法吗?我是否使用了正确的工具来完成这项工作,或者我应该 "validate" 使用脚本?
这可能有效:
<xs:element name="container">
<xs:complexType>
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="element1"/>
<xs:element name="element2"/>
<xs:element name="element3"/>
</xs:choice>
<xs:assert test="generate-id(element2/preceding-sibling::element1[1][following-sibling::element3[1])
eq generate-id(element2/following-sibling::element3[1])" />
</xs:complexType>
</xs:element>
通常将此表示为对作为 element1、element2 和 element3 的父元素的内容模型的约束。
通常你会说什么元素可以出现在 element1 和 element3 之间,但如果它真的是 element3 以外的任何元素,那么在 XSD 1.1 中你可以将内容模型定义为
<xs:element name="element1"/>
<xs:any not-QName="element3" minOccurs="0"/>
<xs:element name="element2"/>
我正在解析一个 XML 文档,我想确保每个元素 <element2>
前面都有 <element1>
,条件是没有 <element3>
它们之间。
我知道如何使用 XPath 执行此操作,但我想不出使用 XSD 执行此操作的方法。有办法吗?我是否使用了正确的工具来完成这项工作,或者我应该 "validate" 使用脚本?
这可能有效:
<xs:element name="container">
<xs:complexType>
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="element1"/>
<xs:element name="element2"/>
<xs:element name="element3"/>
</xs:choice>
<xs:assert test="generate-id(element2/preceding-sibling::element1[1][following-sibling::element3[1])
eq generate-id(element2/following-sibling::element3[1])" />
</xs:complexType>
</xs:element>
通常将此表示为对作为 element1、element2 和 element3 的父元素的内容模型的约束。
通常你会说什么元素可以出现在 element1 和 element3 之间,但如果它真的是 element3 以外的任何元素,那么在 XSD 1.1 中你可以将内容模型定义为
<xs:element name="element1"/>
<xs:any not-QName="element3" minOccurs="0"/>
<xs:element name="element2"/>