2011-12-21 52 views
2

我想創建一個XSD,它允許子元素以任何順序。但是每個子元素都有自己的minOccurs和maxOccurs。每個元素的任何順序+約束

我的XSD:

<xsd:complexType name="Samples"> 
<xsd:sequence > 
    <xsd:element name="Sample1" minOccurs="1" maxOccurs="1"> 
    <xsd:complexType> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:boolean" /> 
     </xsd:simpleContent> 
    </xsd:complexType> 
    </xsd:element> 
    <xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded"> 
    <xsd:complexType> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:string" /> 
     </xsd:simpleContent> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:sequence> 

例如有效的XML:

<Samples> 
<Sample2></Sample2> 
<Sample1></Sample1> 
<Sample2></Sample2> 
</Samples> 

例如不是有效的XML(樣本1可以只選擇一個時間):

<Samples> 
<Sample2></Sample2> 
<Sample1></Sample1> 
<Sample2></Sample2> 
<Sample1></Sample1> 
</Samples> 

但是我不知道,我怎麼能混合順序,而所有的元素都有自己的約束。

感謝您的幫助

回答

2

如果你試試這個:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="Samples"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element name="Sample1" minOccurs="1" maxOccurs="1"/> 
     <xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

當然,你需要加入限制每個元素:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:complexType name="Sample1Type"> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:boolean" /> 
     </xsd:simpleContent> 
    </xsd:complexType> 
    <xsd:complexType name="Sample2Type"> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:string" /> 
     </xsd:simpleContent> 
    </xsd:complexType> 
    <xsd:element name="Samples"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element type="Sample2Type" name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element type="Sample1Type" name="Sample1" minOccurs="1" maxOccurs="1"/> 
     <xsd:element type="Sample2Type" name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

,甚至簡單的類型更短:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="Samples"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element type="xsd:string" name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element type="xsd:boolean" name="Sample1" minOccurs="1" maxOccurs="1"/> 
     <xsd:element type="xsd:string" name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

產品號:

不幸的是沒有像xsd:sequence這樣的XSD元素,它允許你詢問什麼。

+0

是這就是我的意思。但是我怎麼能解決這個問題,而沒有定義元素「Sample2」兩次? – Roxane 2011-12-21 13:59:36

+0

我已經更新了我的答案,舉例說明了如何使用相同的方法,但是指定了您的類型 – 2011-12-21 20:10:58

+0

好的,謝謝您的幫助。也許我必須考慮其他解決問題的方法。 – Roxane 2011-12-22 07:54:56

0

你想要什麼看起來像xsd:all;然而,因爲xsd:all只適用於maxOccurs爲1的元素,所以它不會在這裏工作。如果你可以結合選擇和序列來約束你的內容,那麼避免重複定義(避免定義兩次)的一種方法是將Sample1和Sample2定義爲全局元素,然後在你的合成器下引用它們。如果定義全局元素不是除了根元素之外的選項,那麼您至少可以定義全局類型 - 這樣您可以最​​大限度地重用,並且有點更接近您的要求「沒有定義兩次」...

+0

你有什麼建議嗎? – Roxane 2011-12-22 07:58:33

+0

我會通過EOD發佈更新。 – 2011-12-22 15:58:20