Ограничение или ограничение на xsi: type - PullRequest
4 голосов
/ 12 декабря 2011

Это обобщенный пример того, с чем я сталкиваюсь.

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

Проще говоря, «у меня есть события, в которых в одной ситуации могут быть только два типа событий».

Вот как я определил свои события и последующего владельца последовательности. (Это все работает и действует).

Абстрактный элемент представляет собой сложный тип с именем «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: тип )

1 Ответ

1 голос
/ 19 декабря 2011

Я могу ошибаться, но я не думаю, что это возможно.

В коллекции Events вы, по сути, хотите иметь разные структуры, но все с одним и тем же именем элемента «Event».Это идет вразрез с принципиальным ограничением схем: http://www.w3.org/TR/xmlschema-1/#cos-element-consistent. Использование xsi: type дает процессору схемы подсказку, которая позволит ему устранить неоднозначность этого выбора структур, таким образом избегая нарушения этого правила.По сути, это обходной путь.

Не могли бы вы вызывать разные вещи, поэтому у вас есть коллекция "event1" и "event3" или внешняя коллекция, содержащая последовательность необязательных "events1" s и "event3" s?Было бы намного проще реализовать схему таким образом.Кроме того, тогда вам вообще не потребуется использовать xsi: type.Я не уверен, что вы используете xsi: type в своих экземплярах, чтобы попытаться обойти это ограничение или по другой причине, но для любого, кто использует схему, может быть проще не беспокоиться о производных типах.

В качестве альтернативы, вы могли бы потенциально использовать другую технологию (например, schematron) для обеспечения соблюдения этого ограничения.

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