1

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

4

2 回答 2

1

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

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

为什么我能够“重新分配”临时工?

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

我可以推断我没有收到错误以及为什么 temp 会输出 false 的唯一方法是有一个全局临时变量和一个局部临时变量

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

于 2019-02-15T21:16:53.940 回答
1

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

XSLT 1.0 规范

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

于 2019-02-15T21:18:04.020 回答