XSL 获取元素值并忽略嵌套元素
Posted
技术标签:
【中文标题】XSL 获取元素值并忽略嵌套元素【英文标题】:XSL get the element value and ignore the nested element 【发布时间】:2021-12-11 19:14:36 【问题描述】:没有子节点值,如何只获取元素值?
例如
XML
<root>
<a>
parent value
<b>
child value
</b>
</a>
</root>
XSL
<xsl:for-each select="a">
<xsl:call-template name="foo">
<xsl:with-param name="elem" select="." />
</xsl:call-template>
</xsl:for-each>
<xsl:template name="foo">
<xsl:param name="elem" />
<i>Val: <xsl:value-of select="$elem"/></i>
</xsl:template>
输出为:“父值子值” 我只想显示“父值”
有什么建议吗?
谢谢!
【问题讨论】:
【参考方案1】:<xsl:value-of select="text()"/>
为您提供上下文节点的所有子文本节点的值,所以我不确定您为什么需要命名模板,我会在 a
元素的上下文中使用 <xsl:value-of select="text()"/>
即在里面你的for-each
。 value-of
采用默认为单个空格的分隔符属性。
【讨论】:
【参考方案2】:使用任一:
<xsl:value-of select="$elem/text()"/>
或:
<xsl:value-of select="$elem/text()[1]"/>
取决于您是要获取所有属于a
子节点的文本节点的值,还是只获取其中第一个节点的值。
【讨论】:
感谢您的回答,这对我有用<xsl:value-of select="($elem/text()[last()])" />
外括号是多余的。【参考方案3】:
您已经向我们展示了一个测试用例以及该测试用例的预期输出,但您没有解释一般问题:样式表必须处理哪些其他输入,以及要应用的一般规则是什么。
只有猜测才能继续,我的猜测是正确的解决方案是使用模板规则。比如:
<xsl:template match="a">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="a/text()">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="a/b"/>
但实际的规则集取决于可能在源文档中找到的所有内容,而不是这个示例中的内容。
【讨论】:
以上是关于XSL 获取元素值并忽略嵌套元素的主要内容,如果未能解决你的问题,请参考以下文章
如果祖先的属性使用 xsl 持有某个值,我如何删除属性和元素