2015-06-21 73 views
0

我目前正在使用XML Schema 1.1中的斷言掙扎。 XML Schema 1.1建議states如果在執行過程中發生錯誤,則斷言違反了斷言。這種行爲似乎是合理的,但在試圖瞭解評估結果時可能會造成一些混淆。讓我來解釋:XML Schema 1.1聲明:如何捕獲動態類型錯誤?

下面的例子說明了XSD定義了兩個元素:STR及(分解)。元素str必須具有值「A」或「B」。元素dec必須是一個數字。另外,如果str的值爲「A」,則dec必須爲正數。我試圖通過使用斷言定義這最後一個屬性:

<?xml version="1.0" encoding="utf-8"?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="data"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="str"> 
      <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="A"/> 
       <xs:enumeration value="B"/> 
      </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
     <xs:element name="dec" type="xs:decimal"/> 
     </xs:sequence> 
     <xs:assert test="str != 'A' or dec gt 0"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

下面的XML文件是無效的,因爲該元素具有海峽值「X」,這是不允許的。

<?xml version="1.0" encoding="utf-8" ?> 
<data> 
    <str>X</str> 
    <dec>5</dec> 
</data> 

當我現在使用驗證撒克遜9.6.0.6我得到以下輸出XML文件:

Validation error on line 3 column 16 of test.xml: 
    XSD: The content "X" of element <str> does not match the required simple type. Value "X" 
    contravenes the enumeration facet "A, B" of the type of element str 
    Validating /data[1]/str[1] 
    See http://www.w3.org/TR/xmlschema11-2/#cvc-datatype-valid clause 1 
Warning: on line 1 
    Internal error: value doesn't match its type annotation. Value "X" contravenes the 
    enumeration facet "A, B" of the type of element str 
Validation error at data on line 5 column 8 of test.xml: 
    XSD: Element data does not satisfy assertion str != 'A' or dec gt 0 
    Validating /data[1] 

正如你所看到的,我得到的報告只是一個問題(非法值兩個錯誤元素str)。我發現這種行爲令人困惑,因爲它使得難以看到真正的問題(錯誤的值,而不是失敗的斷言)。

有什麼辦法來「捕捉」聲明中的錯誤類型,這樣的說法在這個例子不失敗?

回答

2

有趣。像大多數驗證人一樣,撒克遜人會嘗試通過在單次運行中捕獲儘可能多的驗證錯誤來提供幫助。但是這隻在錯誤彼此獨立時纔有用。對已知無效的值測試斷言並不十分有用:但當然,斷言是由不知道已經報告了哪些錯誤的XPath處理器「盲目」執行的。

那撒克遜報告一個「內部錯誤」這裏的事實是一個線索,它不應該以這種方式工作。我會記錄一個錯誤,看看我們能做些什麼。

斷言是相當奇怪的,因爲它們對已經半驗證的數據進行操作:這使得有關他們是否是在類型化或無類型值操作相當複雜的規則。在這種情況下,我懷疑你更堅定地編碼你的斷言可能會有很大的幫助。但是,如果str的值「A」更直接爲「if(str ='A')then dec> 0 else true()」,則代碼'dec必須爲正值。

+0

感謝您的反饋。能夠看到撒克遜的一些擴展可以更容易地處理這個問題,這將是非常好的。讓我知道我是否可以在這裏得到任何幫助。 –