У меня есть выбор complexType с именем abType
:
<xs:complexType name="abType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="a"/>
<xs:element name="b"/>
</xs:choice>
</xs:complexType>
Этот тип может использоваться для создания элементов с узлами a
и b
в любом порядке, например:
<ab>
<b/>
<a/>
</ab>
Теперь я хочу создать производный тип с именем abcType
, чтобы позволить узлам a
, b
и c
в любом порядке. Поэтому я создал новый complexType на основе abType
:
<xs:complexType name="abcType">
<xs:complexContent>
<xs:extension base="abType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="c"/>
</xs:choice>
</xs:extension>
</xs:complexContent>
</xs:complexType>
После этого я создал abc
node:
<abc>
<c/>
<b/>
<a/>
</abc>
Но это node недействительно! Недействительно помещать a
или b
после c
. Причина в том, что получение типа из базового типа создает последовательность имплицитов, хотя оба типа являются выборами. XMLspy иллюстрирует это следующим образом:
Этот результат совершенно бесполезен для типов выбора.
Итак, мой вопрос: как расширить тип выбора без выбора выбора?
Вот полный XSD и тестовый XML файл для воспроизведения проблемы:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element ref="ab"/>
<xs:element ref="abc"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ab" type="abType"/>
<xs:complexType name="abType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="a"/>
<xs:element name="b"/>
</xs:choice>
</xs:complexType>
<xs:element name="abc" type="abcType"/>
<xs:complexType name="abcType">
<xs:complexContent>
<xs:extension base="abType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="c"/>
</xs:choice>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Пример:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="inherit-choice.xsd">
<ab>
<b/>
<a/>
</ab>
<abc>
<c/>
<b/>
<a/>
</abc>
</root>