XSL如何获取元素本身文本值 忽略嵌套子节点内容
XSL获取元素自身文本(排除嵌套子节点文本)解决方案
问题原因
你当前使用xsl:value-of select="$elem"的写法,默认会提取$elem节点下所有子孙节点的文本内容并拼接,所以会把子元素<b>的child value也包含到输出结果中。
可行实现方案
核心思路是通过XPath的text()节点测试,仅选中目标元素的直接子文本节点,不会递归进入嵌套子元素提取文本。
方案1:基础实现(适配单个直接文本节点场景)
如果目标元素下直接文本是连续的一段,直接修改foo模板的取值逻辑即可,搭配normalize-space()可自动去除文本前后的多余换行、空格:
<xsl:template name="foo"> <xsl:param name="elem" /> <i>Val: <xsl:value-of select="normalize-space($elem/text())"/></i> </xsl:template>
输出结果:Val: parent value,完全符合预期。
方案2:兼容多段直接文本场景
如果目标元素下存在多段分散的直接文本(比如中间穿插了多个子元素),可以遍历所有直接文本节点拼接,适配XSLT 1.0及以上版本:
<xsl:template name="foo"> <xsl:param name="elem" /> <i>Val: <xsl:for-each select="$elem/text()"> <xsl:value-of select="normalize-space(.)"/> </xsl:for-each> </i> </xsl:template>
方案3:XSLT 2.0+ 简化写法
如果使用XSLT 2.0及更高版本,可以用string-join直接拼接所有直接文本节点,写法更简洁:
<xsl:template name="foo"> <xsl:param name="elem" /> <i>Val: <xsl:value-of select="string-join($elem/text()!normalize-space(), '')"/></i> </xsl:template>
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

