XSD“一个或两个”选择构造导致模糊的内容模型

时间:2010-03-03 15:14:40

标签: xsd

我正在尝试创建一个简单的XSD选择构造,允许两个引用元素中的一个或两个,但不能是none。该构造类似于下面,但我不断得到歧义错误。我错过了什么?

<xs:schema xmlns:xs="...">
  <xs:element name="Number" type="xs:integer"/>
  <xs:element name="Text" type="xs:string"/>
  <xs:element name="RootStructure">
    <xs:complexType>
      <xs:sequence>
        <xs:choice>
          <xs:sequence>
            <xs:element ref="Number"/>
            <xs:element ref="Text"/>
          </xs:sequence>
          <xs:element ref="Number"/>
          <xs:element ref="Text"/>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

2 个答案:

答案 0 :(得分:32)

通常的做法是:

<xs:schema xmlns:xs="...">
  <xs:element name="Number" type="xs:integer"/>
  <xs:element name="Text" type="xs:string"/>
  <xs:element name="RootStructure">
    <xs:complexType>
      <xs:sequence>
        <xs:choice>
          <xs:sequence>
            <xs:element ref="Number"/>
            <xs:element ref="Text" minOccurs="0"/>
          </xs:sequence>
          <xs:element ref="Text"/>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

答案 1 :(得分:1)

一些额外的提示,如果你有多个元素链接,你想要一个元素束或另一个束,或两者兼而有之,你可以这样做:

<xsd:complexType name="ComplexTypeName">
    <xsd:choice>
        <xsd:sequence>
            <xsd:element name="theElement" />
            <xsd:element name="theElementIsFlagged" />
            <xsd:choice>
                <xsd:sequence>
<!-- note the empty sequence block -->
                </xsd:sequence>
                <xsd:sequence>
                    <xsd:element name="theOtherElement" />
                    <xsd:element name="theOtherElementIsFlagged" />
                </xsd:sequence>
            </xsd:choice>
        </xsd:sequence>
        <xsd:sequence>
            <xsd:element name="theOtherElement" />
            <xsd:element name="theOtherElementIsFlagged" />
        </xsd:sequence>
    </xsd:choice>
</xsd:complexType>

以防万一你遇到同样的问题!!