2011-04-03 87 views
1

我有一個包含以下類型,基本上保持元素的列表對應於遊戲的mods,其被設計的模式:限制一個XML Schema元素包含一個更具體的類型

<xs:complexType name="OrderedModTemplateType"> 
    <xs:sequence minOccurs="1" maxOccurs="1"> 
     ... 
     <xs:element name="Mods" type="mods:ModsType" minOccurs="1"> 
      <xs:key name="modKey"> 
       <xs:selector xpath="Mods"/> 
       <xs:field xpath="@id"/> 
      </xs:key> 
     </xs:element> 
    </xs:sequence> 
    ... 
</xs:complexType> 

的ModsType類型,其正是擁有MODS的名單,看起來是這樣的:

<xs:complexType name="ModsType"> 
<xs:sequence> 
    <xs:element name="Mod" type="ModType" maxOccurs="unbounded" /> 
</xs:sequence> 
</xs:complexType> 

這是ModType類型,ModsType預計作爲其子:

<xs:complexType name="ModType"> 
    <xs:sequence minOccurs="0" maxOccurs="1"> 
     ... 
    </xs:sequence> 
    ... 
    <xs:anyAttribute/> 
</xs:complexType> 

我想創建一個更具體的OrderedModTemplateType,與上面發佈的完全相同,不同之處在於Mods元素中的Mod元素將被要求爲更具體的派生類型的Mod,具體地,Fallout3ModType:

<xs:complexType name="Fallout3ModType"> 
    <xs:complexContent> 
     <xs:extension base="mods:ModType"> 
      <xs:attribute name="requiresFose" type="xs:integer" default="0" /> 
      <xs:attribute name="foseVersion" type="xs:string" /> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

所以,我知道我可以通過指定XSI使用類型Fallout3ModType的國防部元素:在元素類型,但如果我想要的元素只包含類型Fallout3ModType的元素,但無特定沒有類型,例如就像ModType(這是默認接受的類型)?

我不希望有這樣做:

<Mods> 
    <Mod xsi:type="Fallout3ModType" ...> 
    ... 
    </Mod> 
    <Mod xsi:type="Fallout3ModType" ...> 
    ... 
    </Mod> 
</Mods> 

我可以延長ModsType到Fallout3ModsType,只接受Fallout3ModType,而不是僅僅ModType的國防部元素?如果是這樣,然後我可以使用類似:

<Mods xsi:type="Fallout3ModsType"> 
    <Mod ...> 
    ... 
    </Mod> 
    <Mod ...> 
    ... 
    </Mod> 
</Mods> 

或者,我可以採用某種擴展OrderedModTemplateType有型Fallout3ModsType代替ModsType的MODS的元素嗎?在這種情況下,我可以使用新的類型,以在XML使用簡單:

<Mods> 
    <Mod ...> 
    ... 
    </Mod> 
    <Mod ...> 
    ... 
    </Mod> 
</Mods> 

我真的搞清楚,如果我要對這個正確的方式,或者如果我失去了一些東西掙扎...

更新

這似乎驗證,但我有一種感覺這是不對的:

<xs:complexType name="Fallout3ModsType"> 
    <xs:complexContent> 
     <xs:extension base="mods:ModsType"> 
      <xs:sequence> 
       <xs:element name="Mod" type="Fallout3ModType" minOccurs="0" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

這是不是可以埃森Tially定義另一個單獨的Mod元素,它與原始的Mod元素的類型不同?如果這是合法的,那麼解析器如何知道我所指的是哪個元素,而不會深入探究嵌套元素?

或者,我是否正確地重寫了更具體類型的類型?我懷疑它......

更新2 刪除了一些與問題無關的模式信息。它還有點長,對不起...

+0

沒有什麼錯類型的擴展名。關於基類型的限制,我認爲你正在尋找[abstract element](http://www.w3.org/TR/xmlschema-0/#abstract) – 2011-04-04 19:14:21

回答

1

如果使用substitutionGroup和潛在的抽象元素,你應該能夠做這樣的事情:

<Mods> 
    <Mod /> 
    <Fallout3Mod /> 
    <Mod /> 
</Mods> 

例的xsd:

<xs:complexType name="ModsType"> 
    <xs:sequence> 
     <xs:element ref="mods:ModAbstract" maxOccurs="unbounded" ></xs:element> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="ModType"> 
    <xs:sequence minOccurs="0" maxOccurs="1"> </xs:sequence> 
    <xs:anyAttribute/> 
</xs:complexType> 


<xs:complexType name="Fallout3ModType"> 
    <xs:complexContent> 
     <xs:extension base="mods:ModType" /> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="ModAbstract" abstract="true" type="mods:ModType" /> 
<xs:element name="Mod" type="mods:ModType" substitutionGroup="mods:ModAbstract" ></xs:element> 
<xs:element name="Fallout3Mod" type="mods:Fallout3ModType" substitutionGroup="mods:ModAbstract"></xs:element> 
+0

謝謝,這非常有用!還有一個問題,是否有可能推導出一種新的類型,將序列限制爲僅使用特定的替代組?或者,是否有可能將Mod元素重新定義爲mod:Fallout3ModType來有效地覆蓋原始元素? – Ben 2011-04-06 04:22:08

+0

我認爲第一個問題實際上是在這裏。 ModsType只能從ModAbstract派生或者在其替代組中派生的項目。 – 2011-04-07 18:44:31

相關問題