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° 48' 76''S</LATITUDE>
<LONGITUDE>175° 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° 48' 76''S</LATITUDE>
<LONGITUDE>175° 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° 48' 76''S</LATITUDE>
<LONGITUDE>175° 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° 48' 76''S</LATITUDE>
<LONGITUDE>175° 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,请建议!