我想知道是否可以在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 <= 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, 谢谢你的帮助!
答案 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 < coordinates.length; i++)
{
if (coordinates[i].lat < 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>
];
再次感谢你(新年快乐)。