XML-схема - одно и многоэлементное вхождение - PullRequest
4 голосов
/ 16 марта 2011

У меня есть XML-схема с моим элементом video и youtube внутри:

<xs:element name="video">
  <xs:complexType>            
    <xs:sequence>     
      <xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>    
    <xs:attribute name="file" type="xs:string"/>
  </xs:complexType>  
</xs:element>

, и я хочу добавить к доступным типам видео другой элемент "param":

<xs:element name="param">
   <xs:complexType>
     <xs:attribute name="name" type="xs:string" use="required"/>
     <xs:attribute name="value" type="xs:string" use="required"/>
   </xs:complexType>
</xs:element>    

У меня будет элемент "param" рядом с "youtube".

Ограничения:

  • youtube может появляться только один раз в моем xml
  • param - может встречаться много раз в моем xml

примерно так:

<video>
<youtube file = "aaa"/>
<param name="a1" value"b1"/>
<param name="a2" value"b2"/>
</video>

Как сохранить эти ограничения в этой схеме?

Если я сделаю что-то вродеthis:

<xs:sequence>     
      <xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>    

если последовательность указана следующим образом

<xs:sequence>     
      <xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>    

, это определяет, что param должен быть после youtube - но я не хочу указывать последовательность

1 Ответ

3 голосов
/ 16 марта 2011

Вот схема XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="video">
        <xs:complexType>
            <xs:choice minOccurs="1" maxOccurs="2">
                <xs:element ref="youtube"/>
                <xs:element ref="param" minOccurs="1" maxOccurs="unbounded"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="youtube">
        <xs:complexType>
            <xs:attribute name="file" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="param">
        <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="value" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

Пример (правильно сформированный и действительный) XML:

<?xml version="1.0" encoding="UTF-8"?>
<video>
    <youtube file="aaa"/>
    <param name="a1" value="b1"/>
    <param name="a2" value="b2"/>
</video>

Существует одна проблема с вышеуказанным решением. xs: выбор позволяет два элемента YouTube . Существует элемент xs: all , который решает эту проблему, но, к сожалению, невозможно получить maxOccurm параметра больше, чем один (xs: все ограничения).

Другими словами, не существует 100% решения с использованием XML Schema 1.0. Если вышеуказанного недостаточно, вы можете использовать другой язык схемы, такой как RELAX NG или Schematron.

редактирование:

В XML Schema 1.1 (расширенный набор XML Schema 1.0) вы можете записать элемент видео как:

<xs:element name="video">
    <xs:complexType>
        <xs:all>
            <xs:element ref="youtube"/>
            <xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
        </xs:all>
    </xs:complexType>
</xs:element>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...