如何引用XPath点运算符的原始值?非保留书籍XPath查询求助
这个问题我碰到过!核心是你嵌套谓词的时候把上下文搞混了,而且其实完全可以简化写法来解决~
首先说为什么你的原表达式不生效:你在/library/reserved/book[.=current()]这个内层谓词里,current()的作用域并没有你想的那样稳定指向外层的/library/all/book节点(或者说,你根本没必要这么嵌套判断)。其实XPath里直接比较节点集的字符串值就可以实现你的需求。
直接用这个表达式就行:
/library/all/book[not(. = /library/reserved/book)]
解释一下:/library/reserved/book是一个节点集,.=节点集的逻辑是“当前节点的字符串值等于这个节点集中任意一个节点的字符串值”,加上not()就正好筛选出那些内容不在reserved列表里的书籍。用你的文档测试的话,会准确排除Don Quixot,留下War and Peace。
如果是更复杂的场景,必须要明确引用外层上下文的节点,那分两种情况处理:
- 如果你用的是XPath 2.0及以上版本,可以用
let来绑定外层节点为变量,彻底避免上下文混淆:/library/all/book[let $outer-book := . return not(/library/reserved/book[. = $outer-book])] - 如果是XPath 1.0(或是XSLT环境),可以先把外层的书籍节点绑定到变量再处理,比如在XSLT里:
<xsl:variable name="all-books" select="/library/all/book" /> <xsl:for-each select="$all-books"> <xsl:if test="not(. = /library/reserved/book)"> <!-- 这里处理未被保留的书籍 --> </xsl:if> </xsl:for-each>
这样就完全解决你的问题啦~
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

