2011-12-12 40 views
4

這是我反對的一個廣義示例。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

回答

1

我可能是錯的,但我不認爲這是可能的。

在Events集合中,您基本上希望擁有不同的結構,但都具有相同的元素名稱「Event」。這違背了模式的基本約束:http://www.w3.org/TR/xmlschema-1/#cos-element-consistent。使用xsi:type爲模式處理器提供了一個提示,它可以消除這種結構的選擇,從而避免違反此規則。它基本上是一個解決方法。

難道你不能調用每一個不同的東西,所以你有一個「事件1」和「事件3」的集合或包含一系列可選的「事件1」和「事件3」的外部集合?以這種方式架構執行結構會容易得多。此外,你根本不需要使用xsi:type。我不確定在實例中是否使用了xsi:type來嘗試解決此限制或其他原因,但對於使用該模式的任何人來說,不必擔心派生類型。

或者,您可以使用其他技術(例如schematron)來幫助實施此限制。

+0

我同意 - 我認爲你對派生的使用只會增加複雜性,而我看不到真正的收益。分別爲每個事件類型製作序列。 – gilligan