XSLT中的全局变量是否争用部分匹配的值

时间:2016-12-26 23:27:16

标签: xml xslt xslt-1.0

这是我最近遇到过的最奇怪的XSLT情况,我在这里展示了一个摘录来说明结构,但创建一个独立的演示并不是真的可行。此XSLT 1.0转换在Windows 2008 Server上的MSXML下运行。这是代码,我不能简化不幸的复杂结构(不要问为什么),但我得到的似乎是关于全局变量命名的争论或混淆。

<xsl:variable name="GlobalY">501</xsl:variable>

<xsl:param name="YMax">     
    <xsl:variable name="YMax">
        <xsl:call-template name="CalculateArea"/>       
    </xsl:variable> 
    <xsl:value-of select="$YMax"/>
</xsl:param>

<xsl:template name="CalculateArea">
    <xsl:value-of select="$GlobalY"/>
</xsl:template>

<xsl:template match="/">
    YMax = <xsl:value-of select="$YMax"/>
</xsl:template>

人们会认为第一个全局变量GlobalY将在其中的所有更多本地模板或声明中可用,即使下面有多个间接层。我所看到的是,当字母Y出现在初始声明中时,变量变为不透明(零长度,无内容)但如果我自己切换到变量名Global,则参考工作良好。涉及的数据类型只是纯文本,不涉及RTF。其中有许多带有Y字母的变量。

我很难过。我已经试过并试错了我能想象到的每一个东西。 MSXML是否会因重载变量名称空间而感到困惑?谢谢你,XSLT粉丝!

2 个答案:

答案 0 :(得分:1)

基本上,您在param中使用全局变量。模板CalculateArea使用您的全局变量,并从param YMax调用CalculateArea。这意味着您的全局变量在使用之前可能无法实例化。如果您还没有这样做,请在所有内容上设置一个断点并逐步调试调试器中的代码。确保在YMax之前实例化GlobalY。

答案 1 :(得分:0)

Bluewood66提供了一个线索,可以得出答案。我重新排列了全局变量的顺序,xsl:include s,然后是模板。首先实例化全局变量,然后在包含代码引入大量引用之前是至关重要的。但是,全局变量名中的单字符更改会破坏并破坏症状,这似乎很奇怪。似乎&#34;所有&#34;全局变量不仅会被打破。在整个代码集中没有冲突的名称。谢谢,Bluewood!