2013-06-03 63 views
1

我想要完成的是創建一個XML模式,它描述了一個可以採用兩種形式之一的XML文件。兩者之間有一段共同的元素,然後是一個不同的小部分。喜歡的東西:沒有嵌套的XML選擇

<Dessert> 
    <Identifier> Hot Fudge Sundae </Identifier> 
    <SaleDate> 2013-06-03 </SaleDate> 
    <Duration> 2 </Duration> 
    <Size> SuperScooper </Size> 
</Dessert> 

<Dessert> 
    <Identifier> Dutch Apple Pie </Identifier> 
    <SaleDate> 2013-06-03 </SaleDate> 
    <Duration> 1 </Duration> 
    <AlaMode> 1 </AlaMode> 
    <IceCreamFlavor> Vanilla </IceCreamFlavor> 
</Dessert> 

因此,對於冰淇淋甜點有隻是一個大小而對於餡餅有一個AlaMode指標和IceCreamFlavor符。

我要完成什麼是使用xs:choice符,以表明Dessert XML要麼有一個或另一個(SizeAlaModeIceCreamFlavor),這樣我就可以驗證它們。

我一直試圖做的是創建兩種類型,做這樣的事情:

,然後做一些事情,如:

<xs:choice> 
    <xs:element name="Sundae" type="SundaeType" /> 
    <xs:element name="Pie" type="PieType" /> 
</xs:choice> 

而且但由此產生的XML,當然,有一個佈局,像這樣:

<Dessert> 
    <Identifier> Hot Fudge Sundae </Identifier> 
    <SaleDate> 2013-06-03 </SaleDate> 
    <Duration> 2 </Duration> 
    <Sundae> 
    <Size> SuperScooper </Size> 
    <Sundae> 
</Dessert> 

不匹配現有的文件結構。

我可以簡單地將所有可能的元素聯合起來,並廢除xs:choice的東西,但這並不能表達格式的期望(例如,它不適用於聖代有AlaMode元件)。

有什麼辦法可以做到這一點?我懷疑如果我只有一個不同的領域,我可以用xs:choice(也許)來完成這個任務,而沒有那個額外的等級。或者我可能只是在這裏錯過了一些東西。

是的,我意識到佈局不是最好的,但它是一個現有的格式,我可以在這一點上真正改變。

回答

2

如果你不介意在源文件中的元素強加的訂單,你可以使用XS使這項工作:順序:

<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="Dessert"> 
     <xs:sequence> 
      <xs:element name="Identifier" type="xs:string"/> 
      <xs:element name="SaleDate" type="xs:int"/> 
      <xs:element name="Duration" type="xs:int"/> 
      <xs:choice> 
       <xs:element name="Size" type="xs:string"/> 
       <xs:sequence> 
        <xs:element name="AlaMode" type="xs:int"/> 
        <xs:element name="IceCreamFlavor" type="xs:string"/> 
       </xs:sequence> 
      </xs:choice> 

     </xs:sequence> 
    </xs:complexType> 

    <xs:element name="Dessert" type="Dessert"/> 
</xs:schema> 
+0

感謝您的回答。這對我有幫助。 – itsmatt