我需要求出纬度和经度的平均值。请在下面找到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水平真的很差,我希望能在这里找到一些帮助。
谢谢,Martin
这会得到
<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>
在每次迭代中,去掉两个数字并累加两个连续的总数,然后递归,直到剩余值的字符串为空。
为了完整起见,当使用支持EXSLT str:tokenze((函数的处理器(如Xalan(时,这可以很快完成,并且很简单:
XSLT 1.0(+EXSLT str:tokenze(((
<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