2013-03-08 66 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)])