我目前正在使用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)。我發現這種行爲令人困惑,因爲它使得難以看到真正的問題(錯誤的值,而不是失敗的斷言)。
有什麼辦法來「捕捉」聲明中的錯誤類型,這樣的說法在這個例子不失敗?
感謝您的反饋。能夠看到撒克遜的一些擴展可以更容易地處理這個問題,這將是非常好的。讓我知道我是否可以在這裏得到任何幫助。 –