XSLT删除所有文本节点

时间:2013-06-22 21:47:40

标签: xslt textnode

我正在尝试从XML文档中删除文本节点但没有成功,这是我正在使用的XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml"/>

    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates select="node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*/*">
        <xsl:element name="x">
            <xsl:attribute name="attr">
                <xsl:value-of select="name()"/>
            </xsl:attribute>
            <xsl:apply-templates select="node()" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="/*/*/a">
        <xsl:copy>
            <xsl:apply-templates select="node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*/*/a/*">
        <xsl:copy-of select="node()"/>
    </xsl:template>

    <xsl:template match="/*/*/*">
        <xsl:copy-of select="node()"/>
    </xsl:template>

    <xsl:template match="/*/*/*[not(self::a)]" />
    <xsl:template match="text()" />

</xsl:stylesheet>

<xsl:template match="text()">可能不起作用,因为其他行更具体(我认为),我该如何删除所有文本节点?

1 个答案:

答案 0 :(得分:3)

用于抑制文本节点的模板会抑制要搜索匹配模板的所有文本节点。但它并没有抑制所有文本节点,因为并非所有文本节点都使用apply-templates处理。当您遇到一些节点(那些匹配匹配模式/*/*/a/*/*/*/*的节点时,您正在复制它们的所有子节点而不向它们应用模板;如果这些节点中的一些是文本节点,或其他这些孩子有文本节点的后代,那些文本节点正在逃避你的镰刀。去掉那些调用的副本,然后坚持使用apply-templates进行复制。