如何在XSL中使用Javascript Math函数

时间:2015-02-17 07:59:28

标签: javascript xml internet-explorer xslt

我有一个项目,我想使用GPS坐标制作地图,我想使用Javascript或至少sin和cos将坐标转换为XY值。所以,我的问题是,如何在xsl样式表中使用sin和cos。我正在使用Internet Explorer作为生成器。到目前为止一切正常。

我当前的样式表如下所示:

<?xml version="1.0"?>

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:gpx="http://www.topografix.com/GPX/1/1">
    <!-- xmlns:msxsl="urn:schemas-microsoft-com:xslt" -->

<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" />

<xsl:variable name="midx" select="800" /> <!-- longitude -->
<xsl:variable name="midy" select="1100" /> <!-- latitude -->



<xsl:template name="longitude">
    <xsl:param name="lon"/>
    <xsl:param name="lat"/>
    <!-- <xsl:value-of select="result:getResult(string(.))"/> -->
    <xsl:value-of select="($lon - 42.881) * 100000"/>
</xsl:template>

<xsl:template name="latitude">
    <xsl:param name="lon"/>
    <xsl:param name="lat"/>
    <xsl:value-of select="1700 - (($lat - 36.904) * 100000)"/>
</xsl:template>

<xsl:template match="/">
<xsl:apply-templates select="gpx:gpx"/>
</xsl:template>

<xsl:template match="gpx:gpx">
<html><body>
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" >
<xsl:apply-templates select="gpx:trk"/>
<xsl:apply-templates select="gpx:wpt"/>
</svg>
</body></html>
</xsl:template>

<xsl:template match="gpx:wpt">
<circle stroke="black" stroke-width="3" fill="red" r="10">
  <xsl:attribute name="cx">
    <xsl:call-template name="longitude"><xsl:with-param name="lon" select="@lon"/><xsl:with-param name="lat" select="@lat"/></xsl:call-template>
    <!-- <xsl:value-of select="(@lon - 42.881) * 100000"/> -->
  </xsl:attribute>
  <xsl:attribute name="cY">
    <xsl:call-template name="latitude"><xsl:with-param name="lon" select="@lon"/><xsl:with-param name="lat" select="@lat"/></xsl:call-template>
    <!-- <xsl:value-of select="1700 - ((@lat - 36.904) * 100000)"/> -->
  </xsl:attribute>
</circle>
<text>
  <xsl:attribute name="x">
    <xsl:call-template name="longitude"><xsl:with-param name="lon" select="@lon"/><xsl:with-param name="lat" select="@lat"/></xsl:call-template>
  </xsl:attribute>
  <xsl:attribute name="y">
    <xsl:call-template name="latitude"><xsl:with-param name="lon" select="@lon"/><xsl:with-param name="lat" select="@lat"/></xsl:call-template>
  </xsl:attribute>
  <xsl:value-of select="name" />
</text>
</xsl:template>
<xsl:template match="gpx:trk">
    <xsl:apply-templates select="gpx:trkseg"/>
</xsl:template>

<xsl:template match="gpx:trkseg">
 <polyline style="fill:none;stroke:black;stroke-width:1">
  <xsl:attribute name="points">
    <xsl:for-each select="gpx:trkpt">
        <!-- <xsl:value-of select="(@lon - 42.881) * 100000"/>,<xsl:value-of select="1700 - ((@lat - 36.904) * 100000)"/> -->
        <!-- <trkpt lat="36.91445553" lon="42.89106168"> -->
        <xsl:call-template name="longitude"><xsl:with-param name="lon" select="@lon"/><xsl:with-param name="lat" select="@lat"/></xsl:call-template>
        <xsl:text>,</xsl:text> 
        <xsl:call-template name="latitude"><xsl:with-param name="lon" select="@lon"/><xsl:with-param name="lat" select="@lat"/></xsl:call-template>
        <xsl:text> </xsl:text> 
    </xsl:for-each>
  </xsl:attribute>
 </polyline>
</xsl:template>

</xsl:stylesheet>

3 个答案:

答案 0 :(得分:3)

IE使用MSXML作为其XSLT处理器,确实允许使用VBScript或Javascript作为脚本语言来实现扩展功能,这里是一个使用Javascript的例子:

XML就是这样。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test2015021701.xsl"?>
<root>
  <test>3.141592653589793</test>
</root>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:svg="http://www.w3.org/2000/svg"
  xmlns:ms="urn:schemas-microsoft-com:xslt"
  xmlns:mf="http://example.com/mf"
  exclude-result-prefixes="ms mf">

<xsl:output
  method="xml"
  version="1.0"
  indent="yes"/>

<ms:script language="Javascript" implements-prefix="mf">
function sin(n) {
  return Math.sin(n);
}
</ms:script>

<xsl:template match="/">
  <html lang="en">
    <head>
      <title>Test</title>
    </head>
    <body>
      <h1>test</h1>
      <p><xsl:if test="function-available('mf:sin')">
           <xsl:value-of select="mf:sin(number(root/test))"/>
         </xsl:if>
      </p>
    </body>
  </html>
</xsl:template>

</xsl:stylesheet>

请注意,只有Microsoft JScript scripting engine提供的对象,方法和函数可用,不支持IE本身实现的DOM之类的东西。

答案 1 :(得分:0)

exslt 有一个数学包,其中包括cos和sin函数(等等)。

http://exslt.org/math/

答案 2 :(得分:0)

在XSLT中不支持Javascript。一些XSLT处理器允许您使用Javascript作为扩展 - 我不知道MSIE中的那个是否是其中之一。

在任何情况下,您都可以使用Taylor power series在XSLT 1.0中实现sin和cos函数。