XSLT 1.0中带有坐标的平均经度

时间:2018-11-20 14:01:32

标签: xml xslt coordinates xslt-1.0 average

我需要平均纬度和经度。请在XML下方找到:

<gml:posList>-52.02545860348812 -173.671875 -52.02545860348812 -173.583984375 -52.18740474559968 -173.583984375 -52.18740474559968 -173.671875 -52.02545860348812 -173.671875</gml:posList>

知道我的XML是通过以下方式形成的,并且迭代/点的数量是随机的:

<gml:posList>lat1 long1 lat2 long2 lat3 long3 etc...</gml:posList>

在输出中,我想要这样的东西:

<centerOf>-52.1064317 -173.62793</centerOf>

我在XSLT中的水平确实很差,希望在这里找到帮助。

谢谢你, 马丁

2 个答案:

答案 0 :(得分:0)

得到

 <centerOf>-52.09023706033274 -173.63671875</centerOf>

来自输入

<x xmlns:gml="whatever">
 <gml:posList>-52.02545860348812 -173.671875 -52.02545860348812 -173.583984375 -52.18740474559968 -173.583984375 -52.18740474559968 -173.671875 -52.02545860348812 -173.671875</gml:posList>
</x>

和样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
        xmlns:gml="whatever"
        exclude-result-prefixes="gml">

 <xsl:template match="gml:posList">
  <centerOf>
   <xsl:call-template name="a"/>
  </centerOf>
 </xsl:template>

 <xsl:template name="a">
  <xsl:param name="n" select="0"/>
  <xsl:param name="lat" select="0"/>
  <xsl:param name="long" select="0"/>
  <xsl:param name="s" select="normalize-space(.)"/>
  <xsl:choose>
   <xsl:when test="string-length($s)=0">
    <xsl:value-of select="$lat div $n"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="$long div $n"/>
   </xsl:when>
   <xsl:otherwise>
    <xsl:variable name="s2" select="concat(substring-after($s,' '), ' ')"/>
    <xsl:call-template name="a">
     <xsl:with-param name="n" select="$n+1"/>
     <xsl:with-param name="lat" select="$lat + substring-before($s,' ')"/>
     <xsl:with-param name="long" select="$long + substring-before($s2,' ')"/>
     <xsl:with-param name="s" select="normalize-space(substring-after($s2,' '))"/>
    </xsl:call-template>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

在每次迭代中,您都会去除两个数字并累加两个运行总计,然后递归直到剩余值的字符串为空。

答案 1 :(得分:0)

为了完整起见,当使用支持EXSLT str:tokenize()功能的处理器(例如Xalan)时,可以通过以下方式简短而轻松地完成此操作:

XSLT 1.0 (+ EXSLT str:tokenize())

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:str="http://exslt.org/strings"
xmlns:gml="http://www.opengis.net/gml/3.2"
exclude-result-prefixes="str gml">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <xsl:variable name="tokens" select="str:tokenize(gml:posList, ' ')" />
    <xsl:variable name="count-points" select="count($tokens) div 2" />
    <centerOf>
        <xsl:value-of select="sum($tokens[position() mod 2 = 1]) div $count-points"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="sum($tokens[position() mod 2 = 0]) div $count-points"/>
    </centerOf>
</xsl:template>

</xsl:stylesheet>

演示http://xsltransform.hikmatu.com/3NzcBsG


请注意,平均给定坐标与计算中心点不一定相同:http://www.geomidpoint.com/methods.html