XSLT中匹配排除指定type属性值的c节点异常问题求解
解决XSLT模板match中排除多个属性值的问题
嗨,我懂你遇到的问题了——这其实是XPath里!=运算符和集合比较时的逻辑陷阱!
问题原因
你原来写的匹配条件:
<xsl:template match="entry/p/c[@type != ('_Table Blue grid ALL' , '_Table Light Blue grid ALL' , '_Table Light Blue')]">
在XPath中的逻辑并不是“@type不等于这三个值中的任何一个”,而是“@type不等于这三个值中的至少一个”。举个例子:
- 对于
type="_Table Light Blue grid ALL"的节点,它确实不等于_Table Blue grid ALL和_Table Light Blue,所以整个表达式返回true,会被选中; - 对于
type="_Table Blue grid ALL"的节点,它不等于_Table Light Blue grid ALL和_Table Light Blue,表达式同样返回true,也会被选中。
这就是为什么你所有的c节点都被匹配到了。
正确解决方案
要实现“排除这三个指定type值的节点”,应该用not()配合等于判断——因为XPath中@type = ('值1','值2','值3')的逻辑是“@type等于其中任意一个值”,用not()包裹后就变成了“@type不等于这三个值中的任何一个”,完美符合你的需求:
<xsl:template match="entry/p/c[not(@type = ('_Table Blue grid ALL' , '_Table Light Blue grid ALL' , '_Table Light Blue'))]">
这样修改后,只有type属性不在你列出的三个值里的c节点才会被这个模板匹配,正好达到你想要的排除效果。
内容的提问来源于stack exchange,提问作者Xpathforlife
相关产品推荐
相关产品推荐

