XPath 2.0前导'/'无法选择包含上下文项的树的根节点:上下文项不是节点

时间:2017-08-01 21:09:38

标签: saxon xpath-2.0

尝试检查一个值(一旦被标记化)与我的文档中的另一个值不匹配:

/foo/bar/baz/tokenize(value,',')[not(. =(/foo/biz/value/string(),'bing'))]

具体来说,检查/ foo / bar / baz / value('ding,dong,bing')与/ foo / biz / value / string()或值'bong'不匹配。

但我得到“Leading”/“无法选择包含上下文项的树的根节点:上下文项不是节点”

我有什么方法可以在XPath中做到这一点,还是我需要进入XQuery并开始担心变量?

1 个答案:

答案 0 :(得分:1)

鉴于您正在使用Saxon,您可以利用XPath 3.0允许您绑定变量的事实:

let $foo := /foo return $foo/bar/baz/tokenize(value,',')
    [not(. =($foo/biz/value/string(),'bing'))]

或者你可以将表达式从谓词中拉出来:

let $exceptions := (/foo/biz/value/string(),'bing') 
return /foo/bar/baz/tokenize(value,',')[not(. = $exceptions)]

如果你想要纯粹的XPath 2.0,你可以用一个丑陋的"来实现同样的目标。结合:

for $foo in /foo return $foo/bar/baz/tokenize(value,',')
   [not(. =($foo/biz/value/string(),'bing'))]

如果你在XSLT中,当然可以使用current()