如何在xslt中访问previous-sibling的@ -values

时间:2017-04-19 10:22:03

标签: xml xslt

我尝试通过使用当前和上一个跟踪点的经度和纬度计算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>&#xA;</xsl:text>
</xsl:for-each>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

您想要的语法是这个......

preceding-sibling::*[1]/@lat

请注意使用[1]仅获取前面的第一个兄弟。如果没有这个,表达式preceding-sibling::*将获得所有前面的兄弟(以及那些兄弟姐妹的所有属性),这将导致math:sin失败并出现错误“不允许多个项目的序列数学的第一个参数:sin()“