xsl:copy用于需控制复制过程的场景,如修改属性、跳过子节点或差异化处理;xsl:copy-of用于原样保留整段结构的场景,如提取配置或快速生成副本。

xsl:copy 只复制当前节点本身(不带子节点和属性),需配合 xsl:apply-templates 才能递归处理内容;xsl:copy-of 一次性深拷贝整个节点及其所有子节点、属性、文本内容,无需额外指令。
什么时候用 xsl:copy
适合需要**控制复制过程**的场景,比如想在复制时修改某些属性、跳过特定子节点、或对不同节点类型做差异化处理。
- 它只生成一个空壳节点(如
),不自动带内容 - 必须显式写
才能把子节点也复制过去 - 可以在
xsl:copy后加xsl:attribute或xsl:apply-templates实现“选择性增强”
什么时候用 xsl:copy-of
适合**原样保留整段结构**的场景,比如提取一段配置、转发某段数据、或快速生成副本而不做干预。
- 直接把当前节点及其全部后代(元素、属性、文本、注释、处理指令)一并复制
- 不用写 apply-templates,一行搞定
- 不能中途修改——它不走模板匹配流程,是“快照式”拷贝
一个对比小例子
假设有这段 XML:
用 :可逐层控制,比如只复制 title,过滤 price;用 :直接得到一模一样的 book 元素。
常见误区提醒
-
xsl:copy不复制属性,除非你手动 -
xsl:copy-of的select表达式可以是任意节点集,比如copy-of select="author | publisher"能合并复制多个不相邻节点 - 性能上,
copy-of更快(无模板调度开销),但灵活性差;copy更灵活,但写法略多
基本上就这些。选哪个,看你要不要“插手”复制过程。










