XSD - нужны два отдельных варианта выбора

Я пишу XSD, и у меня есть только базовое понимание тега <choice>. У меня он работает с одним разделом, но не с другим разделом, имеющим attribute.

Например, все элементы являются необязательными, но если у меня нет одного, мне нужно иметь другой. Это нормально, если есть 2 элемента, но у меня их 3.

Посмотрите на раздел схемы ниже. У меня может быть либо message, либо scan, но не include, либо я могу иметь include, но не message или scan.

       <xs:element name="messages">
        <xs:complexType>
          <xs:sequence>
            <xs:element minOccurs="0" ref="n:properties"/>

        <xs:choice>
          <xs:sequence>
            <xs:element ref="n:message" maxOccurs="unbounded"/>
            <xs:element ref="n:scan" minOccurs="0"/>
          </xs:sequence>

          <xs:element ref="n:scan"/>
        </xs:choice>

              <xs:attribute name="include"/>
          </xs:sequence>
        </xs:complexType>

  </xs:element>

На данный момент это работает для message и scan, но, очевидно, выдает ошибку на include, потому что у меня еще нет выбора.

Может ли кто-нибудь показать мне несколько примеров того, как я буду делать (message OR scan) OR include?

Спасибо


person eoinzy    schedule 21.08.2012    source источник
comment
Что мешает вам сделать атрибут include элементом?   -  person Lukas Eder    schedule 21.08.2012
comment
Суть в том, чтобы включить еще один файл, определяющий любое количество элементов message, например <messages include="messages/moreMessages.xml"/>. Таким образом, это самозакрывающийся тег, и он просто более удобочитаем, особенно при включении нескольких файлов.   -  person eoinzy    schedule 21.08.2012


Ответы (1)


Безусловно, самый простой способ сказать «либо A, либо B, либо C» — это сделать A, B и C элементами и написать

<xs:choice>
  <xs:element ref="A"/>
  <xs:element ref="B"/>
  <xs:element ref="C"/>
</xs:choice>

В качестве альтернативы можно было бы сказать, что «включение сообщений из другого файла — это не то же самое, что указание сообщения», и определить как n:messages (который содержит либо message, либо scan), так и n:message-inclusion (который указывает на другой файл). В родительском элементе разрешить либо. Или определите абстрактный элемент message-thingy и поместите n:messages и n:message-inclusion в его группу замещения.

Второй вариант: перейти на XSD 1.1 и использовать утверждение для принудительного применения правила, согласно которому атрибут include присутствует, если дочерние элементы отсутствуют.

person C. M. Sperberg-McQueen    schedule 21.08.2012