XSD - определение нескольких обязательных элементов с разными атрибутами ID, один из которых имеет подэлементы - PullRequest
0 голосов
/ 18 ноября 2011

Я пытаюсь разработать XSD для некоторого XML, который выглядит примерно так:

<root>
  <thing id="1"/>
  <thing id="2"/>
  <thing id="3">
    <subelement>
      ...
    </subelement>
  </thing>
</root>

Если для каждого идентификатора требуется одна вещь, а для вещи с идентификатором «3» требуются определенные подэлементы.

Я смог создать требование по одной вещи для каждого идентификатора, создав абстрактный сложный тип и расширив его (хотя он еще не проверен),

<xs:element name="thing" type="tns:abstractType" minOccurs="3" maxOccurs="3">
  <xs:unique name="EachIdRequired">
    <xs:selector xpath="thing" />
    <xs:field xpath="@id"/>
  </xs:unique>
</xs:element>

<xs:complexType name="abstractType" abstract="true/>
<xs:complexType name="idOne">
  <xs:complexContent>
    <xs:extension base="tns:abstractType">
      <xs:attribute name="id" fixed="1" type="xs:integer" use="required"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:complexType name="idTwo">
  <xs:complexContent>
    <xs:extension base="tns:abstractType">
      <xs:attribute name="id" fixed="2" type="xs:integer" use="required"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:complexType name="idThree">
  <xs:complexContent>
    <xs:extension base="tns:abstractType">
      <xs:attribute name="id" fixed="3" type="xs:integer" use="required"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

Однако я не уверен, как также требовать complexType идентификатора 3, чтобы также иметь требуемые подэлементы. Единственный способ, которым я видел элемент, определенный как с атрибутом, так и с подэлементами, - это использование расширения, однако idThree уже расширяет абстрактный тип.

Возможно ли то, что я собираюсь сделать, каким-то другим способом? Я сомневаюсь, но я хочу быть уверен. XSD кажется несколько ограничивающим.

1 Ответ

1 голос
/ 18 ноября 2011

Невозможно в XML-схеме.Лучшим языком схемы для такой структуры является Relax NG.Смотри http://relaxng.org/

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