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

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










