XSLT 2中XPath选择返回布尔值而非节点的问题咨询
解决XSLT中
xsl:value-of输出true而非节点内容的问题 兄弟,我太懂这种卡壳的感觉了!你遇到的问题核心很明确:你的XPath表达式返回的是布尔值(判断节点是否存在的结果),而不是你想要的节点本身。下面给你拆解原因和解决办法:
为什么会输出true?
你大概率是把XPath写成了条件判断表达式,而不是直接选择节点的路径。举两个典型错误例子:
- 错误写法1(比较表达式,返回布尔值):
这个表达式是在判断"是否存在作者为John Doe的书籍",结果是//book/author = "John Doe"true或false,用xsl:value-of输出自然就是布尔值。 - 错误写法2(变量存了布尔值):
如果你的变量定义是这样:
那变量里存的就是布尔值,输出肯定是<xsl:variable name="targetNode" select="boolean(//someNode)"/>true/false。
怎么解决?
1. 修正XPath,直接选择目标节点
把XPath改成指向具体节点或节点文本,比如:
- 要选作者为John Doe的书籍标题:
//book[author="John Doe"]/title - 要直接选节点的文本内容:
这样//book[author="John Doe"]/title/text()xsl:value-of就能输出节点的实际内容了。
2. 分开处理"判断存在"和"输出内容"
如果你需要先确认节点存在,再输出内容,别把判断和选择混在一起:
<xsl:if test="//book[author='John Doe']"> <!-- 这里的XPath是直接选节点,不是判断 --> <xsl:value-of select="//book[author='John Doe']/title"/> </xsl:if>
test属性里的XPath负责判断布尔值,select属性里的XPath负责选择要输出的节点。
3. 检查变量定义
确保你的变量存储的是节点集,而不是布尔值:
- 错误(存布尔值):
<xsl:variable name="myNode" select="boolean(//someNode)"/> - 正确(存节点):
<xsl:variable name="myNode" select="//someNode"/>
举个完整的例子
假设你的XML是:
<library> <book> <title>XSLT实战指南</title> <author>John Doe</author> </book> </library>
对应的正确XSLT代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <!-- 正确输出:XSLT实战指南 --> <xsl:value-of select="//book[author='John Doe']/title"/> </xsl:template> </xsl:stylesheet>
你可以先把你的XPath表达式单独在XmlNotepad的XPath测试工具里跑一下,看看返回的是节点还是布尔值,这样更容易定位问题~
内容的提问来源于stack exchange,提问作者Toad
相关产品推荐
相关产品推荐

