Конструкция выбора XSD «один или оба» приводит к неоднозначной модели содержимого - PullRequest
17 голосов
/ 03 марта 2010

Я пытаюсь создать простую конструкцию выбора XSD, допускающую один или оба из двух ссылочных элементов, но не ни одного. Конструкция похожа на приведенную ниже, но я продолжаю получать ошибку неоднозначности. Чего мне не хватает?

<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 ]

32 голосов
/ 03 марта 2010

Обычный способ сделать это так:

<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 голос
/ 18 октября 2017

Некоторый дополнительный совет, если у вас есть несколько связанных элементов, и вы хотите один пакет элементов или другой пакет, или оба, вы можете сделать это так:

<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>

На всякий случай, если некоторые из вас столкнутся с той же проблемой !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...