Схема XML: разрешить тег, только если указан другой необязательный тег - PullRequest
1 голос
/ 08 июля 2011

Я пытаюсь определить схему XML с необязательным тегом sort_expression. Если указан этот необязательный тег, то разрешается второй необязательный тег alternate_sort_expression, но он зависит от наличия первого тега.

Например, я хочу, чтобы эти примеры подтвердили:

<indication>
    <label>A label for the item</label>
    <sort_expression>Some Value</sort_expression>
    <!-- one sort expression was provided -->
</indication>

или

<indication>
    <label>A label for the item</label>
    <!-- no sort expression was provided -->
</indication>

или

<indication>
    <label>A label for the item</label>
    <sort_expression>Some Value</sort_expression>
    <alternate_sort_expression>Some Value</alternate_sort_expression>
</indication>

но следующее не должно пройти проверку:

<indication>
    <label>A label for the item</label>
    <!-- no main sort expression was provided -->
    <alternate_sort_expression>INVALID</alternate_sort_expression>
</indication>

Я думал, что следующая схема с использованием выбора из двух последовательностей будет работать. К сожалению, сама схема не проверяется; Altova XML Spy говорит мне, что «модель содержимого индикации сложного типа неоднозначна:

<xs:complexType name="indication">
<xs:sequence>
  <xs:element name="label" type="xs:string"/>
  <xs:choice>
    <xs:sequence>
      <xs:element name="sort_expression" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:sequence>
      <xs:element name="sort_expression" type="xs:string"/>
      <xs:element name="alternate_sort_expression" type="xs:string" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:choice>
</xs:sequence>

Ответы [ 2 ]

4 голосов
/ 09 июля 2011

Создайте необязательную последовательность, которая содержит обязательный элемент <sort_expression> и необязательные элементы <alternate_sort_expression>.

Поскольку они находятся в одной и той же последовательности, <alternate_sort_expression> появляется только тогда, когда присутствует <sort_expression>, но также и <sort_expression> может быть опущено, потому что вся последовательность может быть опущена.

<xs:complexType name="indication">
  <xs:sequence>
    <xs:element name="label" type="xs:string"/>
    <xs:sequence minOccurs="0">
      <xs:element name="sort_expression" type="xs:string"/>
      <xs:element name="alternate_sort_expression" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
    </xs:sequence>
  </xs:sequence>
</xs:complexType>
1 голос
/ 08 июля 2011

Это было бы возможно с использованием вложенных последовательностей:

<xs:complexType>
    <xs:sequence>
        <xs:element name="label" type="xs:string" />
        <xs:sequence minOccurs="0" maxOccurs="1">
            <xs:element name="sort_expression" type="xs:string" />
            <xs:sequence minOccurs="0" maxOccurs="unbounded">
                <xs:element name="alternate_sort_expression" type="xs:string" />
            </xs:sequence>
        </xs:sequence>
    </xs:sequence>
</xs:complexType>

... по крайней мере, это подтверждает ваши примеры по желанию.

...