如何在XSLT中显示某些文本节点而不在其他节点中显示

时间:2016-11-02 15:49:21

标签: xml xslt

我需要显示给定节点的文本,同时禁止子节点的文本。我试图通过为子节点创建一个空模板来处理这个问题,但它没有用。如何压制子节点的文本?

这是XML:

URLLoader

这是我的样式表:

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <item name="The Item">
        <richtext>
            <pardef/>
            <par def="20">
                <run>This text should </run>
                <run>be displayed.
                    <popup><popuptext>This text should not be displayed.</popuptext></popup>
                </run>
            </par>
        </richtext>
    </item>
</document>

2 个答案:

答案 0 :(得分:1)

您应该可以将select="."更改为select="text()" ...

<xsl:template match="run">
  <xsl:value-of select="text()"/>
</xsl:template>

此外,由于您未从run执行申请模板,因此不需要匹配popuptext的模板。

答案 1 :(得分:1)

如果您只想显示run元素的文字,请使用select="text()"

<xsl:template match="run">
     <xsl:value-of select="text()" separator=""/>
</xsl:template>

如果您使用select=".",则会选择run元素的所有内容,其中包含其子元素的内容。

我不确定这是100%最好的方法,但它确实会阻止run的子元素内容在您的特定情况下显示。

我的完整版样式表是:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:output indent="yes" method="html"/>
   <xsl:template match="/*">
        <html>
            <body>
                <table border="1">
                        <xsl:apply-templates/>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="item">
        <tr>
            <td><xsl:value-of select="@name"/></td>
            <td>
                <xsl:apply-templates/>
            </td>
        </tr>
    </xsl:template>

    <xsl:template match="run">
         <xsl:value-of select="text()" separator=""/>
    </xsl:template>

    <xsl:template match="popuptext" />

</xsl:stylesheet>