这个问题是在XSL1.0的上下文中提出的;特别是因为局部变量的阴影是不允许的。
鉴于XSL变量是词汇范围的,我不明白为什么这个例子,取自Michael Kay的书(第338页,第2/e页,第509页,第4/e页):
XML:
<program>
<opera>
<title>The Magic Flute</title>
<composer>Mozart</composer>
<date>1791</date>
</opera>
<opera>
<title>Ernani</title>
<composer>Verdi</composer>
<date>1843</date>
</opera>
...
<composer name="Mozart">
<fullname>Wolfgang Amadeus Mozart</fullname>
<born>1756</born>
<died>1791</died>
</composer>
...
</program>
XSL:
...
<xsl:for-each select="program/composer">
<h2><xsl:value-of select="fullname"/></h2>
<xsl:variable name="c" select="."/>
<xsl:for-each select="program/opera[composer=$c/@name]">
<p><xsl:value-of select="title"/></p>
</xsl:for-each>
</xsl:for-each>
...
为什么不在同一个词汇上下文中多次声明变量c呢?我显然错过了什么;xsl:for-each很可能会创建多个虚拟词汇上下文?不过,这开始感觉更像是动态范围界定。我一定没有正确地思考这个问题。
我发现Michael Kay总是有答案的,你(或者至少我)只需要经常重读一些东西,你/我就会明白。在这种情况下,从以下效果的解释:
<xsl:for-each>指令是为所选节点集中的每个节点实例化一次包含的模板主体。
因此,这就是答案:局部变量在词法上是由<xsl:for-each>。
这对我来说仍然有点奇怪;它并不是真正的词汇或动态范围界定。我在发布这个问题之前就想好了,但还是继续发布了,以防有人和我一样困惑。