2013-03-08 110 views
1

在xPath中,如果有一个序列1 =序列2,如果序列1中至少有一个元素也在序列2中,则返回真。我需要一些东西,它允许我测试sequence1中是否存在sequence1的所有元素(sequence1的值集合是sequence2中的一组值的子集)。XPath中的子集

这可行吗?

+0

它将做一个具体的例子很好。你在问关于*节点的序列吗?或者是关于任何序列的问题? “平等”是如何定义的?它是否具有基于身份的语义,还是具有基于价值的语义? – 2013-03-09 16:14:07

+0

此外,关于“子集”的说法更为精确。子序列意味着相同的顺序,这*不是*你所要求的。 – 2013-03-09 16:29:20

回答

1

使用double negation law

not($seq1[not(. = $seq2)]) 

另类伊利,和更有效地 - 节点和节点的基于身份的平等语义序列:(VS○○(N)(N^2))

count($seq1 | $seq2) = count($seq2) 

II。的XPath 2.0

对于节点的序列(节点的身份 - 基于平等语义)

not($seq1 except $seq2) 

和值的序列的有效表达:

count(distinct-values(($seq1, $seq2))) eq count(distinct-values($seq2)) 
+0

谢谢!这工作。 – Daniel 2013-03-15 18:45:21

0

你可以使用检查一次,如果每个元素都在序列2

every $x in $sequence1 satisfies $x = $sequence2 
+0

确实,但效率低下。 – 2013-03-09 16:26:40

+0

@DimitreNovatchev:好吧,查询优化器的工作将它变成最高效的版本。 – BeniBela 2013-03-09 17:17:10

+0

BeniBela:你真的相信优化器可以用O(N)替换这个O(N^2)表达式吗? :) – 2013-03-09 19:17:37

1

这应该XPath 1.0中工作:

not($sequence1[not(. = $sequence2)])