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

StackOverflow https://stackoverflow.com/questions/410628

  •  03-07-2019
  •  | 
  •  

Вопрос

Мне нужна ваша помощь, чтобы определить особый случай в 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top