Xml 如何将十进制形式的坐标拆分为度分秒XSLT 42.171035-2.07781

Xml 如何将十进制形式的坐标拆分为度分秒XSLT 42.171035-2.07781,xml,xslt,coordinates,Xml,Xslt,Coordinates,我正在尝试将坐标从十进制形式拆分并重新计算为度分秒,我正在使用xslt。。。 我是xslt新手,你能帮我吗? 感谢您尝试将PHP代码从转换为我提出的XSLT2.0 <gml:pos>42.171035 -2.07781</gml:pos> 因此,使用一个示例XML <xsl:function name="mf:decimal-to-DMS"> <xsl:param name="input" as="xs:decimal"/> <

我正在尝试将坐标从十进制形式拆分并重新计算为度分秒,我正在使用xslt。。。 我是xslt新手,你能帮我吗?
感谢您尝试将PHP代码从转换为我提出的XSLT2.0

<gml:pos>42.171035 -2.07781</gml:pos>

因此,使用一个示例XML

<xsl:function name="mf:decimal-to-DMS">
  <xsl:param name="input" as="xs:decimal"/>
  <xsl:param name="type" as="xs:boolean"/>
  <xsl:variable name="direction" as="xs:string"
    select="if ($type) then (if ($input gt 0) then 'N' else 'S')
            else (if ($input gt 0) then 'E' else 'W')"/>
  <xsl:variable name="degrees" select="floor(abs($input))"/>
  <xsl:variable name="seconds" select="(abs($input) - $degrees) * 3600"/>
  <xsl:variable name="minutes" select="floor($seconds div 60)"/>
  <xsl:variable name="seconds" select="floor($seconds - ($minutes * 60))"/>
  <xsl:sequence select="$degrees, $minutes, $seconds, $direction"/>
</xsl:function>
42.171035-2.07781
和样式表

<data>42.171035 -2.07781</data>


输出为
42 10 15 N 2 4 40 W

在XSLT 1.0中,尝试以下操作:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:mf="http://example.com/mf"
  exclude-result-prefixes="xs mf"
  version="2.0">

<xsl:function name="mf:decimal-to-DMS">
  <xsl:param name="input" as="xs:decimal"/>
  <xsl:param name="type" as="xs:boolean"/>
  <xsl:variable name="direction" as="xs:string"
    select="if ($type) then (if ($input gt 0) then 'N' else 'S')
            else (if ($input gt 0) then 'E' else 'W')"/>
  <xsl:variable name="degrees" select="floor(abs($input))"/>
  <xsl:variable name="seconds" select="(abs($input) - $degrees) * 3600"/>
  <xsl:variable name="minutes" select="floor($seconds div 60)"/>
  <xsl:variable name="seconds" select="floor($seconds - ($minutes * 60))"/>
  <xsl:sequence select="$degrees, $minutes, $seconds, $direction"/>
</xsl:function>

<xsl:template match="data">
  <xsl:variable name="tokens" select="tokenize(., '\s+')"/>
  <xsl:variable name="latitude" select="xs:decimal($tokens[1])"/>
  <xsl:variable name="longitude" select="xs:decimal($tokens[2])"/>
  <xsl:value-of select="mf:decimal-to-DMS($latitude, true()), mf:decimal-to-DMS($longitude, false())"/>
</xsl:template>

</xsl:stylesheet>

º 
' 
" 
西南
不适用
应用于您的示例,结果应为:

<xsl:template match="gml:pos">
    <coordinates>
        <lat>
            <xsl:call-template name="decimal-degrees-to-DMS">
                <xsl:with-param name="decimal-degrees" select="substring-before(., ' ')"/>
            </xsl:call-template>
        </lat>       
        <lon>
            <xsl:call-template name="decimal-degrees-to-DMS">
                <xsl:with-param name="decimal-degrees" select="substring-after(., ' ')"/>
            </xsl:call-template>
        </lon>   
    </coordinates>
</xsl:template>


<xsl:template name="decimal-degrees-to-DMS">
    <xsl:param name="decimal-degrees"/>

    <xsl:variable name="dec" select="translate($decimal-degrees * 3600, '-', '')" />
    <xsl:variable name="deg" select="floor($dec div 3600)" />
    <xsl:variable name="min" select="floor($dec div 60) mod 60" />
    <xsl:variable name="sec" select="$dec mod 60" />

    <xsl:value-of select="$deg" />
    <xsl:text>º </xsl:text>
    <xsl:value-of select="$min" />
    <xsl:text>' </xsl:text>
    <xsl:value-of select="format-number($sec, '0.00')" />
    <xsl:text>" </xsl:text>
    <xsl:choose>
        <xsl:when test="$decimal-degrees &lt; 0">S/W</xsl:when>
        <xsl:otherwise>N/E</xsl:otherwise>
    </xsl:choose>   
</xsl:template>

东北42º10'15.73英寸
2º4'40.12英寸西南

您能使用XSLT 2.0吗?欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。适用于此处。在您发布代码并准确描述问题之前,我们无法有效帮助您。StackOverflow不是编码或教程服务。您缺少一个组件:如果原始坐标为negative,然后是“S/E”,否则为“N/W”“---P.S.我想知道使用xs:time函数是否会更优雅。@michael.hor257k,我已经尝试添加方向。我目前不确定是否有一种直接的方法可以从十进制输入值构造一个
xs:time
来提取组件。我的意思是:实际上,我想用
hours-from-duration()
来表示度,但不幸的是结果是mod 24。尽管你可以这样做:@michael.hor257k,看起来不错,正如维基百科所说,“正纬度在赤道以北,负纬度在赤道以南。正经度在本初子午线以东,负经度在本初子午线以西。”。是不是应该是
?非常感谢:)但我有另一个问题,我想更换项目,例如42º10'15.73英寸N/W 2º4'40.12英寸/E@SimonaFrankova我不明白这个问题。请编辑您的问题并发布您现有的样式表(最小化到演示问题所需的程度)和预期输出。
<coordinates>
  <lat>42º 10' 15.73" N/E</lat>
  <lon>2º 4' 40.12" S/W</lon>
</coordinates>