2013-01-09 51 views
1

我試圖檢查的XML子元素的順序子元素的順序,XSD:請根據屬性

我的XML是

<main> 
<col name="name1">test1</col> 
<col name="name2">test2</col> 
<col name="name3">test3</col> 
<col name="name4">test4</col> 
<col name="num1">true</col> 
</main> 

,我需要驗證,如果孩子元素正在以正確的順序顯示。我的文件中的子元素都具有相同的名稱但屬性不同。

<xs:element minOccurs="0" maxOccurs="unbounded" name="col"> 
<xs:complexType> 
<xs:simpleContent> 
<xs:extension base="xs:string"> 
<xs:attribute name="name" type ="OrderCheck" use="required" /> 
</xs:extension> 
</xs:simpleContent> 
</xs:complexType> 
</xs:element> 

我非常喜歡做

<xs:complexType name="OrderCheck"> 
    <xs:sequence> 
    <xs:element name="name1" type="xs:string"/> 
    <xs:element name="name2" type="xs:string"/> 
    <xs:element name="name3" type="xs:string"/> 
    <xs:element name="name4" type="xs:string"/> 
    <xs:element name="num1" type="xs:boolean"/> 
    </xs:sequence> 
    </xs:complexType> 

對於我來說,能夠使用的xs:序列我需要定義一個XS:複雜類型,但我不能下定義一個複雜類型的「屬性「類型,我只能定義一個簡單的類型。但我不能在simpleType下使用xs:sequence。我怎樣才能解決這個問題?

回答

1

不幸的是,你想要做的是不可能與XSD 1.0。使用sequence您可以指定不同類型的所需順序,但不同類型的數據不同。我認爲Schematron可以用於此。

3

如果您可以使用XSD 1.1(在Xerces測試版和Saxon-EE中實現),那麼您可以使用聲明來執行此操作。

另一種有時可用於此類情況的技術是將驗證過程實現爲兩階段管道,其中包含一個轉換,後跟一個驗證步驟。轉型通常會轉換

<col name="name1">test1</col> 

<name1>test1</name1> 

,然後你有一個結構,它是易於進行XSD 1.0驗證。