xsl copy函数似乎偏离了copy-of的功能层次模式,因为它在应用函数操作之前不评估选择条件(如果条件是XPath轴)。
所以xsl:copy select="ancestor::*"
的行为与xsl:copy-of select="ancestor::*"
不同
至少在XSLT 1.0中,xsl:copy
没有有一个select属性:它只复制当前节点。
来自规范(强调我的):
copy元素提供了将复制到当前节点的简单方法。实例化xsl:copy元素将创建当前节点的副本。当前节点的名称空间节点也会自动复制,但不会自动复制节点的属性和子节点。copy元素的内容是所创建节点的属性和子节点的模板;内容仅为具有属性或子类型(即根节点和元素节点)的节点实例化。
编辑:XSLT2.0 xsl:copy
的行为方式相同
嗯,copy
和copy-of
的目的是做非常不同的事情。copy
总是在当前节点上工作,并且不支持select
属性。参见http://zvon.org/xxl/XSLTreference/Output/xslt_copy.html vs http://zvon.org/xxl/XSLTreference/Output/xslt_copy-of.html
在XSLT 3.0中向xsl:copy添加了一个select属性,以允许复制上下文节点以外的节点(例如在函数中很有用)。对于XSLT 1.0和2.0,我真的不知道您是什么意思。