2009-10-30 41 views
4

我有一個XML Schema(xsd文件)片段波紋管,其中我想要NAMEADRESS元素以任何順序出現,但始終在FILM序列之前。如何獲取XML模式中的元素順序約束?

所以我一直試圖做的是這樣的:

<xs:element name="ROOM"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element ref="NAME"/> 
     <xs:element ref="ADRESS"/> 
     </xs:all> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="FILM"/> 
     </xs:sequence> 
     <xs:attribute name="group" type="xs:NCName"/> 
     <xs:attribute name="typ" use="required" type="xs:NCName"/> 
    </xs:complexType> 
    </xs:element> 

我知道<xs:all>標籤不能在同一子級別的其他元素的元素的一部分......但不能找到出路...

有什麼建議嗎?提前致謝 !

回答

1

好吧,貌似我已經找到一種方法,最終:

<xs:element name="ROOM"> 
    <xs:complexType> 

     <xs:choice> 
     <xs:sequence> 
      <xs:element ref="NAME"/> 
      <xs:element ref="ADRESS"/> 
      <xs:element maxOccurs="unbounded" ref="FILM"/> 
     </xs:sequence> 
     <xs:sequence> 
      <xs:element ref="ADRESS"/> 
      <xs:element ref="NAME"/> 
      <xs:element maxOccurs="unbounded" ref="FILM"/> 
     </xs:sequence> 
     </xs:choice> 

     <xs:attribute name="group" type="xs:NCName"/> 
     <xs:attribute name="typ" use="required" type="xs:NCName"/> 
    </xs:complexType> 
    </xs:element> 

但我認爲這不是很優化,考慮到如果你想有10個元素要做到這一點,你必須指定所有排列...

+0

正確。這個內容模型可以通過分解FILM元素來簡化,所以你有一個外部序列,其中包含一個選擇,然後是對'FILM'的引用。 – 2012-08-21 01:56:56

3

這是XSD Schema的限制。我將引用自:http://www.w3.org/TR/2001/REC-xmlschema-0-20010502/然後評論:


存在着對一組約束元素第三種選擇:該組中的所有元素可能出現一次或根本沒有,他們可以以任何順序出現。所有組(提供SGML &連接器的簡化版本)僅限於任何內容模型的頂層。此外,該小組的所有孩子都必須是單個元素(無組),並且內容模型中沒有元素可能會出現超過一次,即minOccurs和maxOccurs的允許值分別爲0和1.例如,要允許子元素purchaseOrder的出現在任何順序,我們可以重新定義PurchaseOrderType爲: 的「所有」組

<xsd:complexType name="PurchaseOrderType"> 
    <xsd:all> 
    <xsd:element name="shipTo" type="USAddress"/> 
    <xsd:element name="billTo" type="USAddress"/> 
    <xsd:element ref="comment" minOccurs="0"/> 
    <xsd:element name="items" type="Items"/> 
    </xsd:all> 
    <xsd:attribute name="orderDate" type="xsd:date"/> 
</xsd:complexType> 

根據這一定義,一個comment元素可以選擇地出現內purchaseOrder中,它可能之前或任何SHIPTO,收單方後出現和項目元素,但它只能出現一次。此外,所有團體的規定都不允許我們在團體之外宣佈諸如評論之類的要素,作爲使其不止一次出現的手段。 XML模式規定所有組必須作爲內容模型頂部的唯一子項出現。換句話說,下面是非法的: 用非法的例子「所有」集團

<xsd:complexType name="PurchaseOrderType"> 
<xsd:sequence> 
    <xsd:all> 
    <xsd:element name="shipTo" type="USAddress"/> 
    <xsd:element name="billTo" type="USAddress"/> 
    <xsd:element name="items" type="Items"/> 
    </xsd:all> 
    <xsd:sequence> 
    <xsd:element ref="comment" minOccurs="0" maxOccurs="unbounded"/> 
    </xsd:sequence> 
</xsd:sequence> 
<xsd:attribute name="orderDate" type="xsd:date"/> 
</xsd:complexType> 

我在當時的討論中回憶了那個xsd:all將是過於複雜的模型,如果它是比這更少受限制。它很快擴展到非確定性解析模型。所以限制是0或1,並且沒有兄弟姐妹。

SGML有一個使用&連接器的更強大的模型,但並不是所有的系統都實現了它。

編輯如果你想在這個水平,你可以使用的Schematron作爲模式之後的第二次驗證驗證XML。它基於XSLT,這種約束更容易表達。

+0

非常感謝您的完整解釋。非常有教育意義!事實上,我已經閱讀了XSD Schema文檔參考的這一部分。現在,我處理我在這裏發佈的解決方案。 我當然把你的答案標記爲有用:) – Clem 2009-10-31 11:49:30