簡體   English   中英

如何在XML Schema中獲取元素順序約束?

[英]How to get an elements order constraint in XML Schema?

我有一個XML Schema(xsd文件)片段,其中我希望NAMEADRESS元素以任何順序出現,但始終在FILM序列之前。

所以我一直試圖這樣做:

  <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>標簽不能是同一子級別的其他元素的元素的一部分......但是找不到出路......

有什么建議 ? 提前致謝 !

這是XSD架構的限制。 我將引用: http//www.w3.org/TR/2001/REC-xmlschema-0-20010502/ ,然后發表評論:


存在用於約束組中元素的第三選項:組中的所有元素可以出現一次或根本不出現,並且它們可以以任何順序出現。 all group(提供SGML和-Connector的簡化版本)僅限於任何內容模型的頂級。 此外,組的子項必須都是單獨的元素(沒有組),並且內容模型中的任何元素都不會出現多次,即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> 

根據這個定義,注釋元素可以選擇出現在purchaseOrder中,它可以出現在任何shipTo,billTo和items元素之前或之后,但它只能出現一次。 此外,所有小組的規定不允許我們在小組外宣布諸如評論之類的元素作為使其不止一次出現的手段。 XML Schema規定,所有組必須作為內容模型頂部的唯一子項出現。 換句話說,以下是非法的:帶有“全部”組的非法示例

 <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如果它的限制比這個要小,那么xsd:all太復雜了。 它很快擴展到非確定性解析模型。 所以限制是0或1,沒有兄弟姐妹。

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

編輯如果您希望在此級別驗證XML,可以使用Schematron作為模式之后的第二個驗證器。 它基於XSLT,這種類型的約束更容易表達。

好吧,看起來我最終找到了一條路:

  <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個元素做這個,你必須指定所有的排列......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM