2014-09-23 432 views
5

假設我有一個看起來像這樣的XML文件:XML模式如何要求按屬性排序元素?

<Transactions> 
<Transaction OrderID="5"> ... </Transaction> 
<Transaction OrderID="6"> ... </Transaction> 
<Transaction OrderID="11"> ... </Transaction> 
<Transaction OrderID="7"> ... </Transaction> 
</Transactions> 

使用XML Schema,這可能表明,訂單#11是不正確的順序?每個Transaction元素都單獨通過驗證,但OrderID應該按升序排列。

而且,一個相關的問題:驗證規則是否可以指示數字是否可以跳過? 例如,沒有事務#8,9或10

回答

1

如果您的驗證支持XSD 1.1,你可以使用XS:斷言否認這樣的特定屬性值:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified" 
      vc:minVersion="1.1"> 
    <xs:element name="Transactions"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Transaction" maxOccurs="unbounded"> 
       <xs:complexType mixed="true"> 
        <xs:attribute name="OrderID" type="xs:integer"/> 
        <xs:assert test="empty(index-of((8,9,10),@OrderID))"/> 
       </xs:complexType>         
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

這應該回答你的第二個問題。

至於你的第一個問題,我不認爲訂單驗證是可能的。但是,您可以使用XSLT對XML文檔進行排序。

-----添加了回答第一個問題-----

謝謝你,邁克爾·凱。那麼......這是你的第一個問題的答案。

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Transactions"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Transaction" maxOccurs="unbounded"> 
        <xs:complexType mixed="true"> 
         <xs:attribute name="OrderID" type="xs:integer"/> 
         <xs:assert test="empty(index-of((8,9,10),@OrderID))"/> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:assert test="every $x in Transaction satisfies 
          (empty($x/preceding-sibling::*) or 
          ($x/@OrderID gt $x/preceding-sibling::*[1]/@OrderID))"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
+2

是的,訂單驗證是可能的。例如'' – 2014-09-23 07:20:35

+0

感謝Chong Lip Phang。老實說,我不明白你的回答是否足以知道它是否解決了我的問題。當你寫大概8,9,10是指OrderID的具體值?我正在處理的文件大約有30K個事務。任何適用於我的方法都需要在不引用OrderID的特定值的情況下工作。第二個 Selecter 2014-09-30 01:13:58

+0

是的,如果OrderID的值是8,9或10,將導致驗證失敗。 XML數據很多,那麼你可能需要一個規則來匹配特定的模式。如果您省略此斷言規則並且OrderID跳過8,9或10,驗證仍將通過。 – 2014-09-30 02:52:40