XML Schema(XSD):如何表达“A组中最多一个元素,b组中最多一个元素”?

时间:2009-12-10 19:48:12

标签: xml xpath xsd schema unique

假设我有两组XML元素:

<One/>
<Two/>
<Three/>

<A/>
<B/>
<C/>

我想让他们成为一个桶元素的孩子:

<Bucket>
   <A/>
   <One/>
</Bucket>

或者

<Bucket>
   <C/>
   <Two/>
</Bucket>

但我不想从任何一组元素中允许多个元素。即:

<Bucket>
   <A/>
   <B/>
   <One/>
</Bucket>

<Bucket>
   <A/>
   <One/>
   <Two/>
</Bucket>

无效。我如何在XML Schema中表达这一点?

我想尝试xs:unique,但这会阻止字段或选择器中使用name()local-name()

更新

完整的解决方案是:

<xs:element name="Bucket">
  <xs:complexType>
    <xs:sequence>
      <xs:choice minOccurs="0">
        <xs:element name="A"/>
        <xs:element name="B"/>
        <xs:element name="C"/>
      </xs:choice>
      <xs:choice minOccurs="0">
        <xs:element name="One"/>
        <xs:element name="Two"/>
        <xs:element name="Three"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
</xs:element>

1 个答案:

答案 0 :(得分:3)

我会选择类似的东西,

<xs:element name="Bucket">
  <xs:complexType>
    <xs:sequence>
      <xs:choice>
        <xs:element name="A"/>
        <xs:element name="B"/>
        <xs:element name="C"/>
      </xs:choice>
      <xs:choice>
        <xs:element name="One"/>
        <xs:element name="Two"/>
        <xs:element name="Three"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
</xs:element>

但可能有更好的类型定义来代表选择,而不是让它们像那样内联。但总体思路是一样的。

默认情况下,minOccursmaxOccurs设置为1,因此默认情况下不允许存在每种类型的倍数。这也意味着它们不是可选的。如果您希望任一组都是可选的,则应将minOccurs='0'添加到<xs:choice>元素。