Xslt xsl:变量赋值澄清

Xslt xsl:变量赋值澄清,xslt,xsl-variable,Xslt,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="

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

我是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

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

这一假设是正确的。XSLT是一种语言,不可变变量在这种语言中很常见

为什么我可以“重新分配”临时工

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

唯一能说明我没有收到错误以及为什么temp输出为false的方法是有一个全局temp变量和一个局部temp变量

事实上,这两个变量都是局部变量,但在另一个层面上。第一个定义在
xsl:stylesheet
级别,第二个定义在
xsl:template
级别。第一个可以被认为是一个
全局
变量,但这只是定义问题。

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

发件人:

如果绑定发生在另一个绑定可见的点,并且绑定具有相同的名称,则绑定会隐藏另一个绑定。如果模板中由
xsl:variable
xsl:param
元素建立的绑定与模板中由
xsl:variable
xsl:param
元素建立的另一个绑定相阴影,则是错误的。如果模板中由
xsl:variable
xsl:param
元素建立的绑定与由
xsl:variable
xsl:param
顶级元素建立的另一个绑定有阴影,则这不是错误


第二个是模板本地的。您并没有在真正意义上覆盖它,但实际上是使外部版本无法访问。[Fiddle](www.xmlplaydle.xyz/9Usr9c)这并不完全正确。这不仅仅是一个范围问题。不允许重写在同一模板中定义的变量,即使是在有限的范围内。