1

我试图从 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()">可能不起作用,因为其他行更具体(我认为),我该如何删除所有文本节点?

4

1 回答 1

3

您用于抑制文本节点的模板正在抑制寻找匹配模板的所有文本节点。但它并没有抑制所有文本节点,因为并非所有文本节点都使用应用模板处理。/*/*/a/*当您遇到一些节点(与匹配模式匹配的/*/*/*节点和文本节点正在逃离你的镰刀。然后摆脱复制调用,并坚持使用应用模板进行复制。

于 2013-06-22T22:17:21.637 回答