xsl:变量分配说明

时间:2019-02-15 21:08:50

标签: xslt xsl-variable

我的理解是<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

2 个答案:

答案 0 :(得分:1)

  

我的理解是,这是不变的,不能重新分配。

这个假设是正确的。 XSLT是functional language,并且不可变变量在这种类型的语言中很常见。

  

为什么我可以“重新分配”温度?

发生的原因由术语Scope定义。这意味着您对变量temp的第二个定义将覆盖/覆盖第一个变量-除非您保留其范围(此处为模板)。但是这里(如@ michael.hor257k在评论中所提到的),范围只能是样式表范围或模板范围的-因此,禁止在同一xsl:template中重新定义变量-甚至在另一个代码块中-

  

我能解释我没有收到错误以及temp为什么会输出false的唯一方法是有一个全局temp变量和一个本地temp变量

实际上,这两个变量都是局部变量,但在另一个层次上。第一个定义在xsl:stylesheet级别,第二个定义在xsl:template级别。第一个变量可能被视为global变量,但这仅是定义问题。

答案 1 :(得分:1)

您可以“重新分配”(更确切地说,是阴影)变量,因为第一个绑定位于样式表的顶层,而第二个绑定位于模板中。

来自XSLT 1.0 specification

  

一个绑定阴影,如果该绑定发生在其他绑定可见的位置,并且这些绑定具有相同的名称。如果模板中由xsl:variablexsl:param元素建立的绑定遮盖了模板中也由xsl:variablexsl:param元素建立的另一个绑定,则是错误的。如果模板中的xsl:variablexsl:param元素建立的绑定遮盖了xsl:variablexsl:param顶级元素建立的另一个绑定,这不是错误。