<xsl:sequence>
在原子值(或原子值序列)上与两者相同,<xsl:copy-of>
都只是返回其输入的副本。当您考虑节点时,差异就出现了。
如果 $n 是单个元素节点,例如由类似的定义
<xsl:variable name="n" select="/html"/>
然后
<xsl:copy-of select="$n"/>
返回节点的副本,它具有相同的名称和子结构,但它是具有新标识(并且没有父节点)的新节点。
<xsl:sequence select="$n"/>
is
返回节点 $n,返回的节点与 $n 具有相同的父节点,并且通过Xpath 运算符等于它。
传统(XSLT 1 风格)模板使用中几乎完全掩盖了差异,因为您永远无法访问任一操作的结果,构造函数的结果被隐式xsl:sequence
复制到输出树,因此不进行复制的事实被掩盖了.
<xsl:template match="a">
<x>
<xsl:sequence select="$n"/>
</x>
</xsl:template>
是相同的
<xsl:template match="a">
<x>
<xsl:copy-of select="$n"/>
</x>
</xsl:template>
两者都创建一个新元素节点并将内容的结果复制x
为新节点的子节点。
但是,如果您使用函数,很快就会发现差异。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="data:,f">
<xsl:variable name="s">
<x>hello</x>
</xsl:variable>
<xsl:template name="main">
::
:: <xsl:value-of select="$s/x is f:s($s/x)"/>
:: <xsl:value-of select="$s/x is f:c($s/x)"/>
::
:: <xsl:value-of select="count(f:s($s/x)/..)"/>
:: <xsl:value-of select="count(f:c($s/x)/..)"/>
::
</xsl:template>
<xsl:function name="f:s">
<xsl:param name="x"/>
<xsl:sequence select="$x"/>
</xsl:function>
<xsl:function name="f:c">
<xsl:param name="x"/>
<xsl:copy-of select="$x"/>
</xsl:function>
</xsl:stylesheet>
生产
$ saxon9 -it main seq.xsl
<?xml version="1.0" encoding="UTF-8"?>
::
:: true
:: false
::
:: 1
:: 0
::
这里 和 的结果xsl:sequence
是xsl:copy-of
完全不同的。