Xquery,使用深度相等的额外元素

时间:2013-12-01 02:31:16

标签: xml function xquery

我使用此函数检查序列是否存在于另一个序列中: http://www.xqueryfunctions.com/xq/fn_deep-equal.html

FN:深等于()

问题在于,当它比较两个序列时,如果一个序列拥有其他序列的所有元素加上自己的序列,则返回false!

我想知道如果其中一个函数属性定义了“至少最小序列”,它是如何返回的。

干杯

2 个答案:

答案 0 :(得分:1)

不,对结构同构和值的同一性进行深度平等检查。您有两种选择:

1编写自己的递归函数contains_subseq($ a,$ b)来确定$ a是否包含$ b作为子序列(您可以对两个序列的成员使用deep-equal,具体取决于你真正想要的是什么)。

如果要求不仅仅是$ a中的所有项目都以$ b中的项目出现在同一顺序中,而且它们是连续的并且从位置1开始(即如果要求是该序列$ a出现为序列$ b)的前缀,那么Michael Kay提出的解决方案将起作用,你不需要自己的功能。如果(1, 3, 5)(1, 2, 3, 4, 5)匹配,或者(2, 3, 4)(1, 2, 3, 4, 5)匹配,那么您将需要更多。

2如果您事先知道所需的最小序列是什么,您可以编写一个函数来通过丢弃其他所有序列来规范化序列,然后使用deep-equals来测试您的规范化序列是否与最小序列匹配。

答案 1 :(得分:1)

尝试:

let $len := min((count($a), count($b)))
return deep-equal(subsequence($a, 1, $len), subsequence($b, 1, $len)) 

这假设长度差异仅适用于顶层序列,而不适用于树深处的子序列。