如何在XPath 1.0中执行set操作

Ian*_*ips 12 xpath

我已经在SO和其他地方看到以下内容应该可以工作(这个例子直接取自O'Reilly的XSLT Cookbook):

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

(: difference :)
$set1[count(. | $set2) != count($set2)]
Run Code Online (Sandbox Code Playgroud)

它看起来应该没问题,但是当与实际路径而不是变量一起使用时,这似乎失败了.例如,给出以下文档

<a>
  <new>
    <val>1</val>
    <val>2</val>
  </new>
  <old>
    <val>2</val>
    <val>3</val>
  </old>
</a>
Run Code Online (Sandbox Code Playgroud)

和XPath表达式/a/new/val[count(. | /a/old/val)=count(/a/old/val)]/text()我希望得到节点集,{ 2 }但我得到了{ 1 2 }.我有什么想法我做错了吗?

Dim*_*hev 9

节点集交集的公式使用节点标识,而不是值标识.

当且仅当时,两个节点是相同的 count($n1|$n2) =1

但是,您希望基于值标识进行交叉.

方案:

用途:

/a/new/val[. = /a/old/val]
Run Code Online (Sandbox Code Playgroud)

这将选择/a/new/val存在至少一个/a/old/val元素的任何元素,使得这两个元素的字符串值相同.