【问题标题】:XSL get the element value and ignore the nested elementXSL 获取元素值并忽略嵌套元素
【发布时间】: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>

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

有什么建议吗?

谢谢!

【问题讨论】:

    标签: xml xslt xpath xslt-2.0


    【解决方案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"/>
      

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

      【讨论】:

        猜你喜欢
        • 2022-11-30
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 2020-07-23
        • 1970-01-01
        • 2021-01-03
        • 1970-01-01
        • 2014-01-23
        相关资源
        最近更新 更多