xsd:choice中的元素的minOccurs和maxOccurs

时间:2015-01-23 14:40:22

标签: xml xsd

我有一个根元素<a>及其子<b>, <c>, <d>

这就是我需要的:

  • 子元素可以按任何顺序出现
  • 仅1 <b>
  • 超过1 <c>
  • 0或1 <d>

例如:

<a>
    <c />
    <b />
    <c />
    <d /> 
</a>

这是我的XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
  <xs:element name="a">
    <xs:complexType>
      <xs:choice>
        <xs:element name="b" />
        <xs:element name="c" minOccurs="1" maxOccurs="unbounded"/>
        <xs:element name="d" minOccurs="0" maxOccurs="1"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

minOccurs中的maxOccursxs:element可能不起作用。当我运行该示例时,我收到一个错误:

  

在元素<b>下的此位置不允许使用元素<a>

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

以下是您的XSD所说的内容:a内,您可以选择以下选项之一:

  1. 单个b元素。
  2. 一个或多个c元素。
  3. 零个或一个d元素。
  4. 您的XML选择选项#2。它没有第二个选择,当解析器遇到b元素时,它会正确报告违规行为。

    您可能认为可以通过授予多种选择来解决此问题:

      <xs:choice maxOccurs="unbounded">
    

    现在可以说:a内您可以重复选择以下选项之一:

    1. 单个b元素。
    2. 一个或多个c元素。
    3. 零个或一个d元素。
    4. 您的XML现在将选择选项#2,然后选择选项#1,然后选择选项#2,然后选择选项#3,然后声明您的XML有效。成功?

      不,不是,例如,如果您希望确保只有一个 b元素子元素,因为重复选择本身,并且可以重复选择选项#1,每次允许单个b元素,但总的来说,有效地允许多个b元素。

      出于这个原因,xsd:choice,实际上 XSD 1.0通常不能用于表示您的约束。

      您的选项?在XSD以外的代码中检查此约束,或使用XSD 1.1&#39; xsd:assert

      XSD 1.1解决方案

      <?xml version="1.0" encoding="UTF-8"?>
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                 xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
                 vc:minVersion="1.1">
        <xs:element name="a">
          <xs:complexType>
            <xs:choice maxOccurs="unbounded">
              <xs:element name="b" />
              <xs:element name="c"/>
              <xs:element name="d"/>
            </xs:choice>
            <xs:assert test="count(b) = 1 and count(c) > 1 and count(d) >= 0"/>
          </xs:complexType>
        </xs:element>
      </xs:schema>