我正在尝试在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是否过于复杂。
有什么想法吗?
答案 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属性检查。