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】:

&lt;xsl:value-of select="text()"/&gt; 为您提供上下文节点的所有子文本节点的值,所以我不确定您为什么需要命名模板,我会在 a 元素的上下文中使用 &lt;xsl:value-of select="text()"/&gt; 即在里面你的for-eachvalue-of 采用默认为单个空格的分隔符属性。

【讨论】:

【参考方案2】:

使用任一:

<xsl:value-of select="$elem/text()"/>

或:

<xsl:value-of select="$elem/text()[1]"/>

取决于您是要获取所有属于a 子节点的文本节点的值,还是只获取其中第一个节点的值。

【讨论】:

感谢您的回答,这对我有用&lt;xsl:value-of select="($elem/text()[last()])" /&gt; 外括号是多余的。【参考方案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 获取元素值并忽略嵌套元素的主要内容,如果未能解决你的问题,请参考以下文章

获取元素的值并使其成为 XSLT 中属性的值?

XSLT - 如何仅输出属性值并忽略元素的值

如果祖先的属性使用 xsl 持有某个值,我如何删除属性和元素

我们如何组合来自相同 data_type 的数据帧的两列的值并获取每个元素的计数?

如何使用 XSL 在 XML 转换中查找随机元素

从clob列中提取xml元素时出错