2016-06-22 59 views
1

我知道一旦初始化XSLT变量就不能更改它们各自的值。
撒克逊PE 9.2.0.6允许的语法如下:在同一范围内声明多个相同名称的XSLT变量

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text" /> 
    <xsl:template match="/"> 
     <xsl:variable name="myVar" select="'asdex upgrade'" /> 
     <xsl:value-of select="$myVar" /><xsl:text>&#xA;</xsl:text> 
     <xsl:variable name="myVar" select="'Wendelstein'" /> 
     <xsl:value-of select="$myVar" /><xsl:text>&#xA;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

与此输出:

asdex upgrade 
Wendelstein 

所以这里发生了什么?很显然,这段代码与变量在XSLT中不可变的事实并不矛盾,否则Saxon处理器不会处理它。我在这里创建了两个具有相同名称的变量(其范围局限于给定的模板)?如果是这样,我是否有办法在创建第二个变量后访问第一个变量,或者它是否停止存在,或者它在XSLT处理器的符号表中被掩盖了?或者是什么给了?

感谢您的任何启示!

回答

2

参见https://www.w3.org/TR/xslt20/#scope-of-variables的详细说明,它说明了

对于任何可变结合元件,有一个区域(更 具体地说,一组元素节点)的样式表的其内 的结合是可见的。 XPath表达式的范围内的变量绑定集包含样式表中发生表达式的 点处可见的那些绑定。

局部变量绑定元素是所有以下的兄弟姐妹 及其后代可见,有两个例外:它不是在它被另一个变量绑定阴影任何 区域可见,并且它不是在以xsl:fallback指令为根的子树内可见的 , 是变量绑定元素的同级。对于xsl:variable或xsl:param元素本身,绑定不是 。

[定义:如果绑定发生在另一个绑定可见的位置,并且绑定具有相同名称 的位置,则绑定会隐藏另一个绑定。 ]如果由局部xsl:变量或xsl:param建立的绑定影响全局绑定,则不会发生错误。在此 的情况下,全局绑定在 样式表的区域中将不可见,其中该区域被其他绑定隐藏。

所以第二个xsl:variable name="myVar"影子第一个。

+0

啊,谢谢。该规范说得很清楚。感谢您的链接,我显然必须在那里阅读。 – rexford

相关问题