xsl:xsl中的变量范围:for-each

时间:2014-10-25 16:50:15

标签: xslt xslt-1.0

这个问题是在XSL 1.0的背景下;特别是因为不允许遮蔽局部变量。

鉴于XSL变量是词汇范围的,我不明白为什么这个例子取自Michael Kay的书(2 / e中的第338页和4 / e中的第509页):

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创建了多个虚拟词汇上下文?不过,这开始感觉更像是动态范围。我不能以正确的方式思考这个问题。

1 个答案:

答案 0 :(得分:0)

我发现Michael Kay总是有答案,你(或者至少我)必须经常在你/我得到之前重​​新阅读。在这种情况下,从对效果的解释:

  

&lt; xsl:for-each&gt; 指令的效果是为所选节点集中的每个节点实例化一次包含的模板主体。

所以,这就是答案:局部变量是由&lt; xsl:for-each&gt; 生成的每个虚拟模板中的词法范围

这对我来说仍然有些奇怪;它不是真正的词法或动态范围。我在发布问题之前想到了这一点,但是无论如何都要发布它,以防有人出现同样的困惑。