2011-07-06 36 views
6

是否有可能在XML模式中做這樣的事情?XML模式在單個complexType中可以有多種選擇?

<xsd:complexType name="ItemsType"> 
    <xsd:choice minOccurs="0" maxOccurs="unbounded"> 
    <xsd:element ref="shirt"/> 
    <xsd:element ref="hat"/> 
    <xsd:element ref="umbrella"/> 
    </xsd:choice> 
    <xsd:choice minOccurs="1" maxOccurs="3"> 
    <xsd:element ref="apple"/> 
    <xsd:element ref="banana"/> 
    <xsd:element ref="strawberry"/> 
    </xsd:choice> 
</xsd:complexType> 

雖然這顯然無效。我希望能有0個或更多的第一選擇。可能會有襯衫元素和帽子元素,或者根本沒有衣服元素(因爲minOccurs =「0」),其次是至少1個水果元素(我想使它至少必須有一個,因爲的minOccurs = 「1」)。

是有辦法做到這一點?

感謝您的任何幫助。

+1

看起來有效的給我;你是否簡化了示例並錯誤地隱藏了一個問題?如果第二個選項包含一個也出現在第一個選項中的元素,這將變爲無效...... – xcut

回答

11

<xsd:complexType>預計將只有一個子元素。在一個<xsd:sequence>內包裝你的兩個選擇。

<xsd:complexType name="ItemsType"> 
    <xsd:sequence> 
    <xsd:choice minOccurs="0" maxOccurs="unbounded"> 
     ... clothes ... 
    </xsd:choice> 
    <xsd:choice minOccurs="1" maxOccurs="3"> 
     ... fruits ... 
    </xsd:choice> 
    </xsd:sequence> 
</xsd:complexType> 
+0

哦,我明白了,非常感謝! – Jimmy

+0

@jasso但是這需要在xml的水果選擇之前指定衣服選擇,對嗎?有沒有辦法不要求訂購? –

+0

@DavidDoria我想到的第一個解決方案是創建只有內容交換順序的序列副本,然後將這兩個序列包含在選擇元素中。通常在這種情況下,您應該使用組來簡化代碼。同樣在這種情況下,你應該小心不要讓結構不確定,因爲衣服的選擇是可選的。這可以通過使衣服選擇是強制性的,如果它們首先出現並且在水果首先出現的交換序列中是可選的,則可以解決這個問題。 – jasso