xsl:variable可以使用相同的名称定义两次

时间:2012-03-23 07:31:38

标签: variables xslt standards

xsl:variable可以在同一范围内使用相同的名称定义两次。 对于类似以下的代码:

<xsl:template match="\">
   <table>
   <tr><td>
     <xsl:variable name="status" select="normal"/>
   </td></tr>
   <tr><td>
     <xsl:variable name="status" select="failed"/>
   </td></tr>
   </table>
</xsl:template>

也许这取决于浏览的类型。标准是什么?

3 个答案:

答案 0 :(得分:4)

首先,两个变量永远不会有相同的范围。即使它们都是全局的,变量的范围也会排除它自己的select表达式,因此两个变量的范围是不同的。

其次,在您的示例中,两个变量的范围甚至不重叠。每个变量都限制在自己的td元素中。

对于两个全局变量,规则是您可以使用两个具有相同名称的变量,前提是它们具有不同的导入优先级,在这种情况下,所有引用都被视为对具有更高优先级的变量的引用。

如果一个变量是本地变量而另一个变量是全局变量,则局部变量如果在范围内则会获胜。

如果有两个局部变量具有重叠范围,则这是XSLT 1.0中的错误,但在XSLT 2.0中是允许的;在重叠区域内,范围较小的变量获胜。

答案 1 :(得分:1)

如果两个或多个顶级变量(在任何模板之外)具有相同的名称,则会出错。

同样,如果同一模板中的两个或多个变量具有相同的名称,则会出错。

但允许模板中的变量 shadow 顶级同名变量。

变量之间没有冲突,除非它们的范围(变量可见的样式表部分)重叠。模板内部变量的范围包括以下兄弟元素及其后代。顶级变量的范围在该变量之后的样式表中无处不在。

答案 2 :(得分:0)

我找到了钥匙。

MSXML 3.0仅支持XDR架构,它不支持XSD架构。 MSXML 4.0,MSXML 5.0和MSXML 6.0支持XSD架构。