XSLT移除XML节点的核心是身份转换加空模板:先用<xsl:apply-templates/>默认复制全部,再为要删除的节点(如temp、debug)定义空模板match="temp|debug";支持条件删除,如match="item[status='draft']";空模板会彻底移除匹配节点及其子树。

用XSLT移除XML中的某些节点,核心思路是:写一个“身份转换”(identity transform)作为基础,再为要删除的节点提供空模板(即匹配但不输出任何内容)。这样,其他节点照常复制,目标节点被静默忽略。
基础方法:身份转换 + 空模板
这是最常用、最可靠的方式。先用 <xsl:copy-of select="."/> 或递归 <xsl:apply-templates/> 复制所有内容,再针对要删除的节点定义空模板。
- 身份模板确保默认行为是“原样保留”
- 对需删除的元素(如
<temp>或<debug>)单独写<xsl:template match="temp|debug"></xsl:template> - 空模板不产生任何输出,相当于“跳过”该节点及其全部子树
按条件移除节点(带判断逻辑)
不只是删固定名称的节点,还能根据属性、值或位置动态决定是否删除。用 match 中的谓词表达式即可。
- 删掉所有
status值为"draft"的<item>:<xsl:template match="item[status='draft']"/> - 删掉没有
id属性的<user>:<xsl:template match="user[not(@id)]"/> - 删掉第二个
<note>:<xsl:template match="note[2]"/>
注意作用域和嵌套影响
空模板会同时移除匹配节点及其所有后代,不需要额外处理子节点。但如果只想删内容、保留标签(比如清空文本但留空元素),就不能用空模板,而应改用带 <xsl:copy> 但不应用子模板的写法。
- 空模板
match="price"→ 整个<price>99.9</price>消失 - 若只要清空内容,可写:
<xsl:template match="price"><xsl:copy/></xsl:template>→ 变成<price/>或<price></price> - 属性默认不被复制,如需保留属性,要在
<xsl:copy>后加<xsl:copy-of select="@*"/>
实用小技巧
调试时可先用 <xsl:message> 输出被匹配的节点,确认模板是否生效;生产环境建议用 XSLT 2.0+ 的 exclude-result-prefixes 清理冗余命名空间。
- 快速测试:把空模板改成
<xsl:template match="old-node">[REMOVED]</xsl:template>,看是否出现标记 - 批量删多个无关节点,用管道符合并:
match="meta|script|style|comment()"(连注释也删) - 用
priority解决模板冲突,例如当通用模板和具体模板都可能匹配时










