這是我反對的一個廣義示例。xsi上的約束或限制:類型
我已經在我的模式中創建了派生類型,並且想要創建一個無限列表(序列)的元素,該列表有一個限制,其中只允許三個派生類型中的兩個。
要從頂級視圖說「我有事件發生在一種情況下只能有兩種類型的事件」。
這是我如何定義我的事件和序列的後續持有者。 (這一切都有效並且有效)。
抽象的項目是一個複雜類型命名爲「活動基地」,並有一個名爲名稱的屬性相同:
<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>
所以問題是,我怎樣才能創建一個最終的事件* s *我只持有特定的xsi:輸入的項目?
因此,在限制認爲只有派生類型1和3有效的情況下(如上);但是如果它有一個派生類型2,它將是無效的。
我創建了一個公共GIST(Constraint or Restriction on xsi:type)
我同意 - 我認爲你對派生的使用只會增加複雜性,而我看不到真正的收益。分別爲每個事件類型製作序列。 – gilligan