Как объявить особый случай XML-схемы (XSD) - PullRequest
4 голосов
/ 04 января 2009

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

Спасибо!

Ответы [ 4 ]

5 голосов
/ 04 января 2009

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

    <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>
2 голосов
/ 04 января 2009

РЕДАКТИРОВАТЬ: Как упомянул Alohci, мое решение неверно. Согласно спецификации, элемент в 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"

0 голосов
/ 04 января 2009

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

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

<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>  
0 голосов
/ 04 января 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...