如何修正XSL模板中匹配值不与任何<a>元素值相等的<b>元素的XPath表达式?
修正你的XPath表达式
你找对问题点啦!原表达式. != //a的逻辑确实不对——在XPath 2.0里,当你拿当前<b>的值和节点集//a做不等于比较时,只要有一个<a>的值和它不一样,这个表达式就会返回true,这完全不是你要的「的值完全不匹配任何一个元素值」的效果。
正确的XPath表达式有两种写法,都能精准实现你的需求:
写法一(简洁常用)
b[not(. = //a)]
原理很直接:. = //a会返回true如果当前<b>的值等于任意一个<a>的值,对这个结果取反,就得到了「不等于所有值」的<b>元素。
写法二(更直白,XPath 2.0专属)
b[every $a in //a satisfies . != $a]
这是XPath 2.0的量化表达式,直白表达了「对于每一个<a>元素,当前<b>的值都不等于它」的逻辑,可读性更强。
把你的XSL模板替换成下面这样就能正常工作了:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:template match="b[not(. = //a)]"> <xsl:text>found!</xsl:text> </xsl:template> </xsl:stylesheet>
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

