2013-03-08 9 views
1

В xPath, если у вас есть последовательность1 = sequence2, он возвращает true, если в последовательности 1 есть хотя бы один элемент, который также находится в последовательности2. Мне нужно что-то, что позволяет мне проверить, существуют ли все элементы последовательности1 в последовательности2 (набор значений последовательности 1 является подмножеством набора значений в последовательности 2).Подмножество в XPath

Возможно ли это?

+0

Было бы чтобы дать конкретный пример. Вы спрашиваете о последовательностях * node * или о каких-либо последовательностях? Как определяется «равенство»? Имеет ли она семантику на основе идентичности или имеет ли она семантику на основе значений? –

+0

Кроме того, точнее говорить о «подмножестве». Подпоследовательность подразумевает тот же порядок, и это * не * то, о чем вы просите. –

ответ

1

Используйте double negation law:

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

Alternativ Ely, и гораздо более эффективно - для последовательности узлов и узлов идентичности семантики на основе равенства: (O (N) против O (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

0

Вы могли бы использовать каждый, чтобы проверить, если каждый элемент находится в sequence2

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

Правда, но неэффективна. –

+0

@DimitreNovatchev: ну, это была бы задача оптимизатора запросов, чтобы изменить его на самую эффективную версию. – BeniBela

+0

BeniBela: Вы действительно считаете, что Optimizer может заменить это выражение O (N^2) на O (N)? :) –

1

Это должно работать в XPath 1.0:

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

 Смежные вопросы

  • Нет связанных вопросов^_^