用于确定所有节点的Xquery是唯一的

时间:2016-04-15 10:33:15

标签: xpath xquery

假设文件如:

<a>
 <b>TEST1</b>
 <b>TEST2</b>
 <b>TEST1</b>
</a>

是否有任何Xquery一个衬垫可用于检查b的所有值是否唯一,而无需在doc上运行for-each?因此,例如在上面的文档中它将返回false,而在下面的文档中它将返回true

<a>
 <b>TEST1</b>
 <b>TEST2</b>
 <b>TEST3</b>
</a>

3 个答案:

答案 0 :(得分:1)

类似的方法,但使用empty()可能会更有效:

empty(/a/b[. = following-sibling::b])
如果参数表达式产生空序列,则

empty()返回true,否则返回false。因此,在这种情况下,如果找到具有相同值的同级b a.k.a a dupe,则empty()将返回false

答案 1 :(得分:0)

您可以查找具有相同值e,g:

的兄弟姐妹
 count(b[preceding-sibling::b = .])

或得到真或假:

not(b[preceding-sibling::b = .])

答案 2 :(得分:0)

效率最高的可能是

count(b) = count(distinct-values(b))

您给出的其他解决方案可能是测试元素数量的二次方,而这可能是O(n log n)。

(但是,这是假设重复是罕见的。如果重复是非常常见的,那么某种折叠操作可能会发现它们更快,特别是使用XQuery 3.0)。