我尝试通过使用当前和上一个跟踪点的经度和纬度计算xsl文件的第9行中的两个跟踪点之间的距离。
<xsl:value-of select="6378.388 * math:acos(math:sin(@lat) *
math:sin(preceding-sibling::@lat) + math:cos(preceding-sibling::@lat)
* math:cos(preceding-sibling::@lon-@lon))"/>
使用Saxon9处理它只是说轴名后面有一个意外的标记“@”。 (第9行数学:sin(前兄弟:: @ lat ))
我不太确定如何访问前一节点或后一节点的给定@ -value,因为它在当前节点上的工作方式与此类似。
帮助或提示表示赞赏。
我将为您提供我的GPX和完整的XSL文件
我的GPX文件:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<trk>
<name>ACTIVE LOG140135</name>
<trkseg>
<trkpt lat="48.750527" lon="10.001063">
<ele>632.169</ele>
<time>2008-08-09T13:01:31Z</time>
</trkpt>
<trkpt lat="48.750499" lon="10.001105">
<ele>629.469</ele>
<time>2008-08-09T13:02:05Z</time>
</trkpt>
<trkpt lat="48.750539" lon="10.000982">
<ele>634.398</ele>
<time>2008-08-09T13:03:07Z</time>
</trkpt>
<trkpt lat="48.750561" lon="10.000870">
<ele>643.272</ele>
<time>2008-08-09T13:18:38Z</time>
</trkpt>
<trkpt lat="48.750560" lon="10.000927">
<ele>641.713</ele>
<time>2008-08-09T13:18:50Z</time>
</trkpt>
...
这是我的xsl文件:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://www.topografix.com/GPX/1/1"
xmlns:math="http://www.w3.org/2005/xpath-functions/math">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="trkseg">
<xsl:for-each select="trkpt">
<xsl:value-of select="6378.388 * math:acos(math:sin(@lat) * math:sin(preceding-sibling::@lat) + math:cos(preceding-sibling::@lat) * math:cos(preceding-sibling::@lon-@lon))"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
答案 0 :(得分:0)
您想要的语法是这个......
preceding-sibling::*[1]/@lat
请注意使用[1]
仅获取前面的第一个兄弟。如果没有这个,表达式preceding-sibling::*
将获得所有前面的兄弟(以及那些兄弟姐妹的所有属性),这将导致math:sin
失败并出现错误“不允许多个项目的序列数学的第一个参数:sin()“