2013-12-16 66 views
0

我試圖在Schematron中編寫一個檢查來確保沒有元素包含重複的屬性數據。這些元素位於XML文檔的特定位置,我使用XPATH定位它們。檢查同級元素中重複的屬性數據 - Schematron

例如:

應該失敗,因爲它有重複的foo和酒吧的屬性值。

<id foo="test1" bar="abc" /> 
<id foo="test1" bar="abc" /> 

這應該通過,因爲foo屬性是不一樣的。

<id foo="test1" bar="abc" /> 
<id foo="test2" bar="abc" /> 

我不確定這對於Schematron來說太複雜了。

有什麼想法?

回答

0

我不知道Schematron,但如果您能夠使用XPath 2.0(這可能是at least with some implementations),deep-equal($val1, $val2)將派上用場。

not(deep-equal(<id foo="test1" bar="abc" />, <id foo="test1" bar="abc" />)) (: false :) 
not(deep-equal(<id foo="test1" bar="abc" />, <id foo="test2" bar="abc" />)) (: true :) 

如果沒有,應該有使用XSLT 1.0的解決方案,但你必須構建你自己的遞歸比較(我不知道XSLT不夠好,這樣做)。

0

我會做它的Schematron這種方式(與XML ValidatorBuddy選中):

<iso:pattern id="unique name attributes"> 
    <iso:rule context="id"> 
    <iso:assert test="count(id) = count(id[not(@foo=preceding-sibling::person/@foo)])"> 
    Not all foo attributes of the id elements are unique 
    </iso:assert> 
</iso:rule> 
</iso:pattern> 

您還可以添加一個檢查了吧屬性在這裏。

相關問題