我正在尝试从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()">
可能不起作用,因为其他行更具体(我认为),我该如何删除所有文本节点?
答案 0 :(得分:3)
用于抑制文本节点的模板会抑制要搜索匹配模板的所有文本节点。但它并没有抑制所有文本节点,因为并非所有文本节点都使用apply-templates处理。当您遇到一些节点(那些匹配匹配模式/*/*/a/*
和/*/*/*
的节点时,您正在复制它们的所有子节点而不向它们应用模板;如果这些节点中的一些是文本节点,或其他这些孩子有文本节点的后代,那些文本节点正在逃避你的镰刀。去掉那些调用的副本,然后坚持使用apply-templates进行复制。