XSL 获取元素值并忽略嵌套元素

XSL get the element value and ignore the nested element

如何只获取元素值而不获取子节点值?

例如

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>

输出为:“父值子值” 我只想显示“父值”

有什么建议吗?

谢谢!

<xsl:value-of select="text()"/> 为您提供上下文节点的所有子文本节点的值,所以我不确定您为什么需要命名模板,我会在上下文中使用 <xsl:value-of select="text()"/> a 元素,即 for-each 内部。 value-of 采用默认为单个 space.

的分隔符属性

使用其中之一:

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

或:

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

取决于您是想获取作为 a 子节点的所有文本节点的值,还是仅获取其中第一个节点的值。

您向我们展示了一个测试用例以及该测试用例的预期输出,但您没有解释一般问题:样式表必须处理哪些其他输入,以及一般规则是什么申请。

仅靠猜测,我的猜测是正确的解决方案是使用模板规则。类似于:

<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"/>

但实际的规则集取决于可能在源文档中找到的所有内容,而不是本示例中出现的内容。