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

テキスト ノードを抑制するためのテンプレートは、一致するテンプレートが求められているすべてのテキスト ノードを抑制しています。ただし、適用テンプレートを使用してすべてのテキスト ノードが処理されるわけではないため、すべてのテキスト ノードが抑制されるわけではありません。いくつかのノード (match-patterns/*/*/a/*および/*/*/*に一致するノード) に遭遇すると、テンプレートを適用せずにすべての子ノードをコピーします。それらの子ノードの一部がテキスト ノードである場合、またはそれらの子ノードの他のノードがテキスト ノードの子孫を持っている場合、それらはテキストノードはあなたの鎌を逃れています. copy-of 呼び出しを取り除き、apply-templates を使用してコピーに固執します.

于 2013-06-22T22:17:21.637 に答える