Как объявить специальный случай XML-схемы (XSD)

Мне нужна ваша помощь, чтобы определить особый случай в схеме XML: последовательность, которая содержит два элемента: «x» и «y», тогда как:

  • Элемент <x> может появляться от 0 до несвязанных раз в последовательности

  • Элемент <y> может появляться в последовательности от 0 до 1 раза

  • Расположение <x> и <y> может быть где угодно, то есть возможно иметь несвязанное умножение на элемент <x>, затем один элемент <y>, а затем несвязанное умножение на элемент <x>.

Примеры XML этой проблемы:

Пример №1

<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

Пример #2

<y>stuff</y>
<x>stuff</x>
<x>stuff</x>

Пример №3

<x>stuff</x> 
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

Спасибо!


person ogee    schedule 04.01.2009    source источник


Ответы (4)


По разным причинам ни один из образцов Юваля, Мо или Дэвидшелдона не работает. Вот один из них.

    <xs:complexType name="myComplexType">
    <xs:sequence>
        <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        <xs:sequence minOccurs="0">
            <xs:element name="y" type="xs:string"/>
            <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:sequence>
    </xs:complexType>
person Alohci    schedule 04.01.2009
comment
Здравствуйте, Alohci - мне любопытно, почему мое решение не работает. Не могли бы вы поделиться своими опасениями по этому поводу? - person Mo.; 04.01.2009

РЕДАКТИРОВАТЬ: Как упомянул Алохчи, мое решение неверно. Согласно спецификации, элемент в xs:all может встречаться только один раз или ноль. Приносим извинения за неудобства

Я думаю, что вы хотите, это не последовательность. Последовательность определяет не только элементы, но и порядок. А в вашем случае порядок может измениться. Вы пробовали xs: все?

<xs:complexType name="myComplexType">
  <xs:all>
    <xs:element name="x" type="xs:string" maxOccurs="unbounded"/>
    <xs:element name="y" type="xs:string" maxOccurs="1"/>
  </xs:all>
</xs:complexType>

Другой подход может заключаться в том, чтобы сделать это последовательностью, но пометить последовательность как maxOccurs="unbounded"

person Mo.    schedule 04.01.2009
comment
maxOccurs=unbounded не допускается в группе xs:all. - person Alohci; 04.01.2009

Прошло некоторое время с тех пор, как я использовал схему, но я думаю, что последовательности - ваш ответ здесь.

У вас должно быть неограниченное количество вариантов выбора между (x) или (y, за которым следует x).

<xsd:element name="parent">
  <xsd:complexType>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="x" type="xs:string"/>
      <xsd:sequence>
        <xsd:element name="y" type="xsd:string" />
        <xsd:element name="x" type="xsd:string" />
      </xsd:sequence>
    </xsd:choice>
  </xsd:complexType>  
</xsd:element>  
person davidsheldon    schedule 04.01.2009
comment
Это не позволяет группе быть одним элементом y, но допускает y-x-y-x как допустимую последовательность, которую нельзя допускать. - person Alohci; 04.01.2009

Не слишком сложно. В голове должно быть что-то вроде этого:

<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 

Поскольку каждый элемент в XSD является необязательным по умолчанию, этот XSD будет соответствовать заданной вами структуре XML с элементом y, появляющимся в любом месте до, после или между элементами x, с максимальным появлением 1

person Yuval Adam    schedule 04.01.2009
comment
Спасибо за ваш ответ, однако я думаю, что это сложнее, чем это. У меня ошибка: cos-nonambig: x и x (или элементы из их группы замещения) нарушают уникальное атрибутирование частиц. (обратите внимание, что все ваши предложения относятся к xsd:sequence) У вас есть другая идея? Спасибо! - person ogee; 04.01.2009
comment
Элементы в XSD не являются необязательными по умолчанию. По умолчанию minOccurs=1. Добавлено minOccurs=0 к каждой проблеме, о которой говорит Огер в своем комментарии. - person Alohci; 04.01.2009