Как выполнить операции над множествами в XPath 1.0 - PullRequest
12 голосов
/ 24 августа 2011

Я видел в SO и других местах, что должно работать следующее (этот пример взят непосредственно из XSLT Cookbook от O'Reilly):

(: intersection :)
$set1[count(. | $set2) = count($set2)]

(: difference :)
$set1[count(. | $set2) != count($set2)]

и похоже, что все должно быть в порядкеОднако это, похоже, не работает при использовании с реальными путями, а не переменными.Например, учитывая следующий документ

<a>
  <new>
    <val>1</val>
    <val>2</val>
  </new>
  <old>
    <val>2</val>
    <val>3</val>
  </old>
</a>

и выражение XPath /a/new/val[count(. | /a/old/val)=count(/a/old/val)]/text(), я ожидаю получить набор узлов { 2 }, но вместо этого получаю { 1 2 }.Есть идеи, что я делаю не так?

Ответы [ 2 ]

9 голосов
/ 25 августа 2011

В формулах для пересечения набора узлов используется идентификатор узла, а не значение.

Два узла идентичны тогда и только тогда, когда count($n1|$n2) =1

Однако вы хотите пересечь, основываясь на значении идентичности.

Решение

Используйте

/a/new/val[. = /a/old/val]

выбирает любой /a/new/val, для которого существует хотя бы один элемент /a/old/val, так что строковые значения этих двух элементов совпадают.

1 голос
/ 24 августа 2011

Замечание , что пересечение всегда приводит к единственному набору узлов, составленному из узлов общего между двумя исходными наборами узлов.

Также обратите внимание , что два узла с одинаковым именем и содержимым должны рассматриваться как два отдельных узла.Таким образом, /a/new/val/text() и /a/old/val/text() имеют одинаковое значение, но они представляют собой совершенно разные текстовые узлы.

Таким образом, ваше текущее пересечение:

/a/new/val[count(. | /a/old/val)=count(/a/old/val)]

должно вычисляться как пустой набор узлов, потому что выпересекаются два набора узлов без какого-либо общего узла (операция count() никогда не будет совпадать).Вы делаете что-то вроде этого:

/a/new/val/a/old/val = ∅

В то время как /a/new/a/old/preceding::new будет производить new.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...