我的理解是<xsl:variable>
是不可变的,不能重新分配。
我是XSL的新手,遇到了以下示例中所示的情况。
<xsl:stylesheet>
<xsl:variable name="temp" select="true()"/>
<xsl:template name="example">
<xsl:variable name="temp" select="false()"/>
<p><xsl:value-of select="$temp"/></p>
</xsl:template>
</styleheet>
我没有找到任何确定这种情况发生的确切原因。我可以断定我没有出错以及为什么temp
将输出false
的唯一方法是,存在一个全局temp
变量和一个本地temp
变量(而且不发生碰撞)。
为什么我可以“重新分配” temp
?
答案 0 :(得分:1)
我的理解是,这是不变的,不能重新分配。
这个假设是正确的。 XSLT是functional language,并且不可变变量在这种类型的语言中很常见。
为什么我可以“重新分配”温度?
发生的原因由术语Scope定义。这意味着您对变量temp
的第二个定义将覆盖/覆盖第一个变量-除非您保留其范围(此处为模板)。但是这里(如@ michael.hor257k在评论中所提到的),范围只能是样式表范围或模板范围的-因此,禁止在同一xsl:template
中重新定义变量-甚至在另一个代码块中-
我能解释我没有收到错误以及temp为什么会输出false的唯一方法是有一个全局temp变量和一个本地temp变量
实际上,这两个变量都是局部变量,但在另一个层次上。第一个定义在xsl:stylesheet
级别,第二个定义在xsl:template
级别。第一个变量可能被视为global
变量,但这仅是定义问题。
答案 1 :(得分:1)
您可以“重新分配”(更确切地说,是阴影)变量,因为第一个绑定位于样式表的顶层,而第二个绑定位于模板中。
一个绑定阴影,如果该绑定发生在其他绑定可见的位置,并且这些绑定具有相同的名称。如果模板中由
xsl:variable
或xsl:param
元素建立的绑定遮盖了模板中也由xsl:variable
或xsl:param
元素建立的另一个绑定,则是错误的。如果模板中的xsl:variable
或xsl:param
元素建立的绑定遮盖了xsl:variable
或xsl:param
顶级元素建立的另一个绑定,这不是错误。