Это обобщенный пример того, с чем я сталкиваюсь.
Я создал производные типы в своей схеме и хочу создать элемент, представляющий собой неограниченный список (последовательность), который имеет ограничение, в котором допускается только два из трех производных типов.
Проще говоря, «у меня есть события, в которых в одной ситуации могут быть только два типа событий».
Вот как я определил свои события и последующего владельца последовательности. (Это все работает и действует).
Абстрактный элемент представляет собой сложный тип с именем «Event Base» и имеет общий атрибут с именем Name:
<xs:complexType name="EventBase">
<xs:annotation><xs:documentation>***Abstract Event***</xs:documentation></xs:annotation>
<xs:attribute name="Name"/>
</xs:complexType>
Тогда у меня есть три события, выведенные из аннотации следующим образом
<xs:complexType name="DerivedEvent1">
<xs:complexContent>
<xs:extension base="EventBase">
<xs:attribute name="Alpha" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="DerivedEvent2">
<xs:complexContent>
<xs:extension base="EventBase">
<xs:attribute name="Beta"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="DerivedEvent3">
<xs:complexContent>
<xs:extension base="EventBase">
<xs:attribute name="Gamma"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Чтобы облегчить сложный объект для хранения производных событий, я создаю конкретное «общее» событие, производное от абстрактного комплекса
<xs:element name="Event" type="EventBase">
<xs:annotation><xs:documentation>A generic event derived from abstract.</xs:documentation></xs:annotation>
</xs:element>
Затем я хочу иметь возможность хранить события, поэтому я создаю новый сложный объект для хранения «общего» события, показанного выше, но на самом деле будет содержать производные события конечным потребителем.
<xs:complexType name="EventsCollectionType">
<xs:annotation><xs:documentation>Holds derived events</xs:documentation></xs:annotation>
<xs:sequence>
<xs:element ref="Event" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
Наконец, я создаю элемент, производный от типа коллекции, который будет содержать фактические события:
<xs:element name="Events"><xs:annotation><xs:documentation>Concrete holder of events.</xs:documentation></xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="Event" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Полученный xml выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<Events xsi:noNamespaceSchemaLocation="file:///C:/StackOverflow.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Event xsi:type="DerivedEvent1" Name="D1" Alpha="Content1"/>
<Event xsi:type="DerivedEvent3" Name="D1" Gamma="Content3"/>
</Events>
Итак, вопрос в том, как мне создать финальный элемент Event * s *, который будет содержать только определенные элементы типа xsi: typed?
Таким образом, в случае, когда установлено ограничение, что действительными будут только производные типы 1 и 3 (как указано выше); но если бы он имел производный тип 2, он был бы недействительным.
Я создал общедоступный GIST ( Ограничение или ограничение для xsi: тип )