Как объявить регистр специальной 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>
Спасибо!
Решение
По разным причинам ни один из образцов Юваля, Мо или Дэвидшельдона не работает.Вот один, который работает.
<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>
Другие советы
Редактировать:Как упоминал Алочи, мое решение неверно.Согласно спецификации, элемент в xs: all может отображаться только ноль или один раз.Приносим извинения за доставленные неудобства
Я думаю, то, что вы хотите, - это не последовательность.Последовательность определяет не только элементы, но и порядок.И в вашем случае порядок может измениться.Вы пробовали xs:all?
<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"
Прошло много времени с тех пор, как я использовал schema, но я думаю, что последовательности - это ваш ответ здесь.
У вас должно быть неограниченное количество вариантов выбора между (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>
Не слишком сложно.На мой взгляд, это должно быть что-то вроде этого:
<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