Средняя длина лота с координатами в XSLT 1.0 - PullRequest
0 голосов
/ 20 ноября 2018

Мне нужно сделать среднее значение широты и долготы.Пожалуйста, найдите ниже 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 голосов
/ 26 ноября 2018

Для полноты картины при использовании процессора, поддерживающего функцию 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

0 голосов
/ 23 ноября 2018

Получается

 <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>

на каждой итерации вы снимаете два числа и накапливаете два работающихитоги, затем повторять до тех пор, пока строка оставшихся значений не станет пустой.

...