xsl:variable scope in xsl:for-each



这个问题是在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>。

这对我来说仍然有点奇怪;它并不是真正的词汇或动态范围界定。我在发布这个问题之前就想好了,但还是继续发布了,以防有人和我一样困惑。

相关内容

  • 没有找到相关文章

最新更新