XML 具有 1 个或 2 个内部元素的序列

XML sequence with 1 or 2 inner elements

我想为 XML 定义一个架构,我可以在其中通过定义箭头、箭羽或两者来定义箭头。如何创建一个内部项目数量有限的序列并同时限制每个项目类型的最大出现次数? 我的实际版本不检测箭头定义何时不包含任何元素:

<xs:element name="Arrow">
<xs:annotation>
  <xs:documentation>Arrow with fletching, head or both.</xs:documentation>
</xs:annotation>    
<xs:complexType>
    <xs:sequence minOccurs="1" maxOccurs="2">
      <xs:element minOccurs="0" name="Fletching" maxOccurs="1">
      </xs:element>
      <xs:element minOccurs="0" name="Head" maxOccurs="1">
      </xs:element>
    </xs:sequence>
[...]

使用此架构,我希望验证:

<Arrow>
    <Head/>
</Arrow>

<Arrow>
    <Fletching/>
</Arrow>

<Arrow>
    <Head/>
    <Fletching/>
</Arrow>

还可以。

<Arrow/>

<Arror>
</Arrow>

不太好。

你可以得到你想要的

<choice>
  <sequence>
    <element ref="Fletching"/>
    <element ref="Head" minOccurs="0"/>
  </sequence>
  <sequence>
    <element ref="Head"/>
    <element ref="Fletching" minOccurs="0"/>
  </sequence>
</choice>

在集合中有两个以上元素的情况下,规定顺序通常更简单(除非顺序传达了一些信息):

<choice>
  <sequence>
    <element ref="Fletching"/>
    <element ref="Head" minOccurs="0"/>
  </sequence>
  <sequence>
    <element ref="Head"/>
  </sequence>
</choice>

在 XSD 1.1 中,也可以使用 xsd:all 断言 parent 至少有一个 child.