繁体   English   中英

多个XML元素的XSD架构,至少有一个以任意顺序存在

[英]XSD schema for multiple XML elements with at least one present, in any order

这是我的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/> ,它不会显示任何错误。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM