适用于多个XML元素的XSD架构,其中至少有一个以任何顺序存在

时间:2017-01-05 12:06:51

标签: xml xsd

这是我的XML:

<animals>
  <cat/>
  <dog/>
  <cat/>
  <cat/>
</animals>

<cat/><dog/>元素可以按任意顺序排列,并且可以有任意数量的元素。但我确实需要确保至少有一个<cat/>和至少一个<dog/>。我无法理解我的XSD必须如何。

这就是我的尝试:

<xs:complexType name="animals">
  <xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="cat" minOccurs="1" maxOccurs="unbounded"/>
    <xs:element name="dog" minOccurs="1" maxOccurs="unbounded"/>
  </xs:choice>
</xs:complexType>

例如,如果没有<cat/>,则不会显示任何错误。

1 个答案:

答案 0 :(得分:1)

使用XSD 1.1,它应该如下:

<xs:complexType name="animals">
  <xs:all>
    <xs:element name="cat" minOccurs="1" maxOccurs="unbounded"/>
    <xs:element name="dog" minOccurs="1" maxOccurs="unbounded"/>
  </xs:all>
</xs:complexType>

使用XSD 1.0,它有点棘手。 但是,我们可以观察到任何有效的 <animals>的序列必须以<cat><dog>元素开头。 第一个元素可能会重复,但有一点, 必须有另一个元素的第一个实例。 因此,这可以选择两种可能的序列。 在我们确保至少有一个<cat>和一个<dog>元素之后, 可以有任意数量的附加元素:

<xs:complexType name="animals">
  <xs:sequence>
    <xs:choice>
      <!-- At least one <cat> followed by one <dog> -->
      <xs:sequence>
        <xs:element name="cat" maxOccurs="unbounded"/>
        <xs:element name="dog"/>
      </xs:sequence>
      <!-- At least one <dog> followed by one <cat> -->
      <xs:sequence>
        <xs:element name="dog" maxOccurs="unbounded"/>
        <xs:element name="cat"/>
      </xs:sequence>
    </xs:choice>
    <!-- Any remaining number of <cat> and <dog> -->
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="cat"/>
      <xs:element name="dog"/>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

对于更复杂的元素类型,建议一次声明元素, 然后在复杂类型中使用<xs:element ref="elementName"/>