将javascript变量传递给xsl条件

时间:2013-12-29 20:32:51

标签: javascript xslt

我想知道是否可以在xsl条件中包含“外部”变量(在我的情况下是javascript)。

在我的例子中,我在地图上得到一个带有一些javascript的坐标,我的xMax var。我想在“xsl:if”中使用这个xMax var来查找纬度低于或等于xMax的所有“条目”。

我的剧本摘录:

var cpt = 0;
var xMax = map.getBounds().getNorthEast().lat();

<xsl:for-each select="entries/entry">
   <xsl:if test="latitude &lt;= xMax">
        cpt++;
    </xsl:if>
</xsl:for-each>
alert(cpt);

我找到了“msxsl:script”元素,我尝试了这个:

<msxsl:script language="JScript" implements-prefix="user">
    function getXMax(){
        var xMax = map.getBounds().getNorthEast().lat();
        return xMax;
    }
</msxsl:script>

并用:

调用它
<xsl:value-of select='user:getXMax(.)'/>

但它似乎没有用。 (我也包括了

xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://localhost:8080/Projet/map"

在xsl:stylesheet中)

如果有人知道如何将js var传递给条件或如何将js var解析为xslt var, 谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

以您希望的方式混合使用JavaScript和XSLT是不可能的。

如果使用XSLT从XML转换HTML和JavaScript,则生成的JavaScript实际上并未在此时执行。就XSLT而言,它只是输出一串字符,稍后将(通过浏览器)解析为JavaScript。当浏览器开始处理JavaScript时,XSLT将被遗忘。如果您自己在记事本中键入JavaScript,则会有所不同。

如您所示,您可以在XSLT中使用JavaScript函数,但这与您输出的JavaScript完全分开,并且只能在执行过程中由XSLT使用。

所以,你需要一个稍微不同的方法。您可以通过JavaScript执行XSLT转换,并传递此XSLT转换的参数。但是,这可能不一定是理想的方法。

您可以采取的一种方法是将相关的XML(条目元素)输出为JSON,然后您可以在JavaScript中访问它。因此,纬度值小于 xMax 变量的逻辑完全在JavaScript中检查。

因此,例如,您的XSLT可能看起来像这样......

<script>
var cpt = 0;
var xMax = map.getBounds().getNorthEast().lat();

var coordinates = [
<xsl:for-each select="entries/entry">
   <xsl:if test="position() > 1">,</xsl:if>
   {
      "lat":<xsl:value-of select="latitude" />,
      "long":<xsl:value-of select="longitude" />
   }
</xsl:for-each>
];
for (var i = 0; i &lt; coordinates.length; i++)
{
   if (coordinates[i].lat &lt; xMax)
      cpt++;
}
alert(cpt);
</script>

然后,给定这个XML

<entries>
<entry>
<latitude>1</latitude>
<longitude>2</longitude>
</entry>
<entry>
<latitude>3</latitude>
<longitude>4</longitude>
</entry>
</entries>

这将生成看起来像这样的

的JavaScript
<script>
var cpt = 0;
var xMax = map.getBounds().getNorthEast().lat();

var coordinates = [
   {
      "lat":1,
      "long":2
   }
   ,
   {
      "lat":3,
      "long":4
   }
];
for (var i = 0; i < coordinates.length; i++)
{
   if (coordinates[i].lat < xMax)
      cpt++;
}
alert(cpt);
</script>

答案 1 :(得分:0)

感谢您的帮助以及关于javascript如何与xslt一起使用的解释。

我使用了JSON的方法,它运行得很好。

有一会儿我不明白为什么它不起作用,但我只需在纬度和经度不为空时添加条件,如下:

var coordinates = [
    <xsl:for-each select="entries/entry">
        <xsl:if test="latitude != '' and longitude != ''">
            <xsl:if test="position() > 1">,</xsl:if>
            {
                "lat":<xsl:value-of select="latitude" />
                "long":<xsl:value-of select="longitude" />
            }
    </xsl:for-each>
];

再次感谢你(新年快乐)。