xsd:choice里面两个元素的具体顺序

Specific order of two elements inside xsd:choice

我有以下 XSD:

<xs:complexType name="CodeTags">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="text" minOccurs="0" maxOccurs="unbounded">
            ...
        </xs:element>
        <xs:element name="reference" minOccurs="0" maxOccurs="unbounded">
            ...
        </xs:element>
        <xs:element ref="switch" minOccurs="0" maxOccurs="unbounded">
            ...
        </xs:element>
        <xs:element ref="if" minOccurs="0" maxOccurs="unbounded">
            ...
        </xs:element>
        <xs:element ref="else" minOccurs="0" maxOccurs="unbounded">
            ...
        </xs:element>
        <xs:element ref="param" minOccurs="0" maxOccurs="unbounded">
            ...
        </xs:element>       
    </xs:choice>
</xs:complexType>

我希望 else 标签刚好出现在 if 标签之后。我怎样才能做到这一点?我已经将它们放入 <xs:sequence> 订单中,但我仍然可以在任何地方输入 else 标签,并在它和 if 标签之间添加其他标签。

编辑:代码片段作为图片发布,现在更改为代码块。

只需将 ifelse 放在一个 xs:sequence 中作为选择之一:

<xs:choice minOccurs="0" maxOccurs="unbounded">
  <!-- ... -->
  <xs:sequence>
    <xs:element ref="if"/>
    <xs:element ref="else"/>
  </xs:sequence>
  <!-- ... -->
<xs:choice>

您也可以从每个选项中删除 minOccursmaxOccurs;将它们放在 xs:choice 本身就足以满足您的目的。

要了解如何更好地处理这种情况,我建议您首先了解您编写的 CodeTags 元素的含义,以及为什么它允许您不想允许的元素序列。然后继续了解 kjhughes 提供的解决方案为何有效。