检查兄弟元素中的重复属性数据 - Schematron

时间:2013-12-16 18:35:56

标签: validation xpath schematron

我正在尝试在Schematron中编写一个检查,以确保没有元素包含重复的属性数据。这些元素位于XML文档中的特定位置,我有定位它们的XPATH。

例如:

应该失败,因为它有重复的foo和bar属性值。

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

这应该通过,因为foo属性不相同。

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

我不确定Schematron是否过于复杂。

有什么想法吗?

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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>

您还可以在此处添加bar属性检查。