Узел XSD со смешанным содержимым, которое появляется любое количество раз в любом порядке - PullRequest
1 голос
/ 09 августа 2011

Я застрял на том, как создать и XSD, который позволяет дочерним узлам «объектов» быть либо «текстовыми», либо «графическими» узлами, и каждый из них будет отображаться любое количество раз и в любом порядке. Порядок, в котором они появляются в узле «объекты», определяет способ их визуализации, но этот порядок проверять не нужно.

Пример 1

<objects>
    <textobject x="30" y="100" value="blah1" />
    <imageobject x="0" y="0" src="/path/to/some/image1.png"/> 
    <imageobject x="0" y="0" src="/path/to/some/image2.png"/>
    <textobject x="60" y="250" value="blah2" />
    <textobject x="60" y="250" value="blah3" />
</objects>

Пример 2

<objects> 
    <imageobject x="0" y="0" src="/path/to/some/image1.png"/>
    <textobject x="30" y="100" value="blah1" />
    <textobject x="60" y="250" value="blah2" />
    <imageobject x="0" y="0" src="/path/to/some/image2.png"/>
    <textobject x="60" y="250" value="blah3" />
</objects>

спасибо!

Ответы [ 3 ]

3 голосов
/ 10 августа 2011

В этой ситуации вполне может быть целесообразно использовать группу замещения. Определите «mediaObject» как абстрактный элемент, с «textObject» и «imageObject» в качестве членов его группы замещения, а затем определите модель содержимого как <xs:element ref="mediaObject" minOccurs="0" maxOccurs="unbounded"/>. Преимущество этой конструкции в том, что она более расширяема, она обеспечивает разделение интересов, лучшее выражение семантики и большую возможность повторного использования определений. Преимущества действительно начинают проявляться, когда существует 15 видов медиа-объектов, а не два.

1 голос
/ 10 августа 2011

Вы можете использовать xs:choice с minOccurs="0" и maxOccurs="unbounded":

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="objects">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="imageobject"/>
        <xs:element ref="textobject"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
  <xs:element name="imageobject">
    <xs:complexType>
      <xs:attribute name="src" use="required"/>
      <xs:attribute name="x" use="required" type="xs:integer"/>
      <xs:attribute name="y" use="required" type="xs:integer"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="textobject">
    <xs:complexType>
      <xs:attribute name="value" use="required"/>
      <xs:attribute name="x" use="required" type="xs:integer"/>
      <xs:attribute name="y" use="required" type="xs:integer"/>
    </xs:complexType>
  </xs:element>
</xs:schema>
1 голос
/ 10 августа 2011

Используйте <xs:choice maxOccurs="unbounded">.

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