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"/>