[英]How to get an elements order constraint in XML Schema?
我有一個XML Schema(xsd文件)片段,其中我希望NAME
和ADRESS
元素以任何順序出現,但始終在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/ ,然后發表評論:
<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.