Порядок элементов в унаследованном сложном типе

У меня есть схема XSD, которую я использую для проверки файлов XML.

В схеме XSD я создал сложный тип, содержащий группу атрибутов и выбор, который сам содержит «_output», повторяющийся элемент.

Мой сложный тип:

<xs:complexType name="base_action">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="_output" minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
    <xs:attributeGroup ref="action"/>
</xs:complexType>

У меня также есть другие элементы (с собственными дочерними элементами), наследующие от этого сложного типа.

Пример такого наследующего элемента:

<xs:element name="ex_elem" minOccurs="0">
    <xs:complexType>
        <xs:complexContent>
            <xs:extension base="cockpit_base_action">
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element name="to" minOccurs="0"/>
                    <xs:element name="from" minOccurs="0"/>
                </xs:choice>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:element>

Теперь в XML это будет работать:

<ex_elem>
    <_output/>
    <from>0</from>
    <to>1</to>
</ex_elem>

Но не это:

<ex_elem>
    <from>0</from>
    <_output/>
    <to>1</to>
</ex_elem>

Или это :

<ex_elem>
    <from>0</from>
    <to>1</to>
    <_output/>
</ex_elem>

Насколько я понимаю, выбор из сложного типа не может смешиваться с выбором наследуемого элемента. Это проблема для меня, потому что есть ситуации, когда я хотел бы поместить _output где-нибудь еще, кроме как вверху.

Я хотел бы иметь возможность использовать элемент, не беспокоясь о последовательности. Есть ли способ сделать это?


person Guillaume Voisine    schedule 20.02.2013    source источник


Ответы (1)


В XSD 1.0 любое расширение базового типа создает последовательность, первым элементом которой является старая модель содержимого, а вторым элементом является вершина дополнения расширения к модели содержимого. Таким образом, эффективная модель содержимого вашего расширения cockpit_base_action такова:

<xs:sequence>
  <xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element name="_output" 
                minOccurs="0" 
                maxOccurs="unbounded"/>
  </xs:choice> 
  <xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element name="to" minOccurs="0"/>
    <xs:element name="from" minOccurs="0"/>
  </xs:choice>
</xs:sequence>

В XSD 1.1 вы можете изменить базовый тип, чтобы использовать xs:all, и использовать xs:all в расширении, чтобы получить желаемый эффект.

Или (в версии 1.0 или 1.1) вы можете изменить расширение, чтобы принять нужный язык. Что-то вроде этого должно иметь эффект, который вы, кажется, желаете:

<xs:extension base="cockpit_base_action">
  <xs:sequence minOccurs="0">
    <xs:choice>
      <xs:element name="to">
      <xs:element name="from"/>
    </xs:choice>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="_output"/>
      <xs:element name="to">
      <xs:element name="from"/>
    </xs:choice>
  </xs:sequence>
</xs:extension>

Я опустил индикаторы появления в дочерних элементах выбора, так как они не влияют на принимаемый язык: они обязательно необязательны, когда опциональным является содержащий выбор (или содержащая его последовательность); они обязательно могут повторяться без ограничений, когда это может сделать содержащий выбор.

person C. M. Sperberg-McQueen    schedule 20.02.2013