Xml 如何将十进制值转换为度、分和秒(DMS)

Xml 如何将十进制值转换为度、分和秒(DMS),xml,xslt,xpath,xslt-2.0,Xml,Xslt,Xpath,Xslt 2.0,在这里,我们尝试将十进制值转换为度、分和秒。有谁能帮我们看看下面的例子: 注意:我们遵循以下规则: <?xml version="1.0" encoding="UTF-8"?> <POSITION> <LATITUDE>36.812600015S</LATITUDE> <LONGITUDE>175.430266714E</LONGITUDE> </POSITION> &l

在这里,我们尝试将十进制值转换为度、分和秒。有谁能帮我们看看下面的例子:

注意:我们遵循以下规则:

<?xml version="1.0" encoding="UTF-8"?>
<POSITION>
<LATITUDE>36.812600015S</LATITUDE>
<LONGITUDE>175.430266714E</LONGITUDE>
</POSITION>
<?xml version="1.0" encoding="UTF-8"?>
<POSITION>
<LATITUDE>36&deg; 48' 76''S</LATITUDE>
<LONGITUDE>175&deg; 25' 82''E</LONGITUDE>
</POSITION>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="LATITUDE">
    <LATITUDE>
    <xsl:variable name="LATITUDE" select="."/>
    <xsl:variable name="DEGREE" select="substring-before($LATITUDE,'.')"/>
    <xsl:variable name="MINUTE" select="substring-before(substring-after($LATITUDE,$DEGREE),'S')"/>
    <xsl:value-of select="."/>
    </LATITUDE>
</xsl:template>

<xsl:template match="LONGITUDE">
    <LONGITUDE>
    <xsl:variable name="LONGITUDE" select="."/>
    <xsl:variable name="DEGREE" select="substring-before($LONGITUDE,'.')"/>
    <xsl:variable name="MINUTE" select="substring-before(substring-after($LONGITUDE,$DEGREE),'E')"/>
    <xsl:value-of select="."/>
    </LONGITUDE>
</xsl:template>

</xsl:stylesheet>

输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<POSITION>
<LATITUDE>36.812600015S</LATITUDE>
<LONGITUDE>175.430266714E</LONGITUDE>
</POSITION>
<?xml version="1.0" encoding="UTF-8"?>
<POSITION>
<LATITUDE>36&deg; 48' 76''S</LATITUDE>
<LONGITUDE>175&deg; 25' 82''E</LONGITUDE>
</POSITION>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="LATITUDE">
    <LATITUDE>
    <xsl:variable name="LATITUDE" select="."/>
    <xsl:variable name="DEGREE" select="substring-before($LATITUDE,'.')"/>
    <xsl:variable name="MINUTE" select="substring-before(substring-after($LATITUDE,$DEGREE),'S')"/>
    <xsl:value-of select="."/>
    </LATITUDE>
</xsl:template>

<xsl:template match="LONGITUDE">
    <LONGITUDE>
    <xsl:variable name="LONGITUDE" select="."/>
    <xsl:variable name="DEGREE" select="substring-before($LONGITUDE,'.')"/>
    <xsl:variable name="MINUTE" select="substring-before(substring-after($LONGITUDE,$DEGREE),'E')"/>
    <xsl:value-of select="."/>
    </LONGITUDE>
</xsl:template>

</xsl:stylesheet>

36.812600015S
175.430266714E
预期输出:

<?xml version="1.0" encoding="UTF-8"?>
<POSITION>
<LATITUDE>36.812600015S</LATITUDE>
<LONGITUDE>175.430266714E</LONGITUDE>
</POSITION>
<?xml version="1.0" encoding="UTF-8"?>
<POSITION>
<LATITUDE>36&deg; 48' 76''S</LATITUDE>
<LONGITUDE>175&deg; 25' 82''E</LONGITUDE>
</POSITION>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="LATITUDE">
    <LATITUDE>
    <xsl:variable name="LATITUDE" select="."/>
    <xsl:variable name="DEGREE" select="substring-before($LATITUDE,'.')"/>
    <xsl:variable name="MINUTE" select="substring-before(substring-after($LATITUDE,$DEGREE),'S')"/>
    <xsl:value-of select="."/>
    </LATITUDE>
</xsl:template>

<xsl:template match="LONGITUDE">
    <LONGITUDE>
    <xsl:variable name="LONGITUDE" select="."/>
    <xsl:variable name="DEGREE" select="substring-before($LONGITUDE,'.')"/>
    <xsl:variable name="MINUTE" select="substring-before(substring-after($LONGITUDE,$DEGREE),'E')"/>
    <xsl:value-of select="."/>
    </LONGITUDE>
</xsl:template>

</xsl:stylesheet>

36度;48'76'S
175度;东经25'82''
XSLT代码:

<?xml version="1.0" encoding="UTF-8"?>
<POSITION>
<LATITUDE>36.812600015S</LATITUDE>
<LONGITUDE>175.430266714E</LONGITUDE>
</POSITION>
<?xml version="1.0" encoding="UTF-8"?>
<POSITION>
<LATITUDE>36&deg; 48' 76''S</LATITUDE>
<LONGITUDE>175&deg; 25' 82''E</LONGITUDE>
</POSITION>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="LATITUDE">
    <LATITUDE>
    <xsl:variable name="LATITUDE" select="."/>
    <xsl:variable name="DEGREE" select="substring-before($LATITUDE,'.')"/>
    <xsl:variable name="MINUTE" select="substring-before(substring-after($LATITUDE,$DEGREE),'S')"/>
    <xsl:value-of select="."/>
    </LATITUDE>
</xsl:template>

<xsl:template match="LONGITUDE">
    <LONGITUDE>
    <xsl:variable name="LONGITUDE" select="."/>
    <xsl:variable name="DEGREE" select="substring-before($LONGITUDE,'.')"/>
    <xsl:variable name="MINUTE" select="substring-before(substring-after($LONGITUDE,$DEGREE),'E')"/>
    <xsl:value-of select="."/>
    </LONGITUDE>
</xsl:template>

</xsl:stylesheet>


参考链接:

因为您使用的是XSLT2.0,所以可以使用xsl:analyze字符串获取要使用正则表达式处理的片段

您必须将一些字符串转换为xs:decimal,但不会太复杂

XML输入(从屏幕截图中添加示例)


156.742
36.812600015S
175.430266714E
XSLT2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="LATITUDE | LONGITUDE">
    <xsl:variable name="dec" select="xs:decimal(replace(., '[NSWE]', ''))" />
    <xsl:variable name="dur" select="$dec * xs:dayTimeDuration('PT1H')" />
    <xsl:copy>
        <!-- degrees -->
        <xsl:value-of select="24 * days-from-duration($dur) + hours-from-duration($dur)"/>
        <xsl:text>° </xsl:text>
        <!-- minutes -->
        <xsl:value-of select="minutes-from-duration($dur)"/>
        <xsl:text>' </xsl:text>
        <!-- seconds -->
        <xsl:value-of select="round(seconds-from-duration($dur))"/>
        <xsl:text>"</xsl:text>
        <!-- hemisphere -->
        <xsl:value-of select="replace(., '[^NSWE]', '')"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>


我会采取完全不同的方法:

XSLT2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="LATITUDE | LONGITUDE">
    <xsl:variable name="dec" select="xs:decimal(replace(., '[NSWE]', ''))" />
    <xsl:variable name="dur" select="$dec * xs:dayTimeDuration('PT1H')" />
    <xsl:copy>
        <!-- degrees -->
        <xsl:value-of select="24 * days-from-duration($dur) + hours-from-duration($dur)"/>
        <xsl:text>° </xsl:text>
        <!-- minutes -->
        <xsl:value-of select="minutes-from-duration($dur)"/>
        <xsl:text>' </xsl:text>
        <!-- seconds -->
        <xsl:value-of select="round(seconds-from-duration($dur))"/>
        <xsl:text>"</xsl:text>
        <!-- hemisphere -->
        <xsl:value-of select="replace(., '[^NSWE]', '')"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

° 
' 
"

比仅仅按照屏幕截图中的说明操作要好得多+1@DanielHaley我相信这些说明是为那些想用纸和铅笔来做这件事的人准备的。顺便说一句,这里有一个XSLT 1.0版本:@michael.hor257k-谢谢michael,我承认。你的答案很好。但是我们使用的是XSLT 1.0,请建议!