我以XML格式接收XML文件中的坐标数据 纬度:3876570 经度:-9013376
我使用XSL将Lon / lat转换为8位而不是7位(如上所述),所以我需要在上面坐标的末尾附加一个零。即我需要 纬度:38765700 经度:-90133760
我正在尝试使用format-number()函数,但不确定我是否正确使用它。我试过了
<xsl:value-of select='format-number(longitude, "########")'/>
和
<xsl:value-of select='format-number(longitude, "#######0")'/>
我最终获得了7位数字。请帮忙!
答案 0 :(得分:3)
您对format-number
的来电无法提供您想要的结果,因为它无法更改其代表的数字值。
您可以将该值乘以10(只要您使用XSLT 1.0就不需要format-number
调用)
<xsl:value-of select="longitude * 10" />
或追加零
<xsl:value-of select="concat(longitude, '0')" />
答案 1 :(得分:-1)
已经提出了明显的答案 - 乘以10或与'0'
连接。
这是一个更通用的解决方案:
对于latitude
小于8的任何值,此转换会在longitude
和string-length()
末尾添加必要零的确切数量:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="
*[self::latitude or self::longitude
and
not(string-length() >= 8)
or
(starts-with(., '-') and not(string-length() >= 9))
]">
<xsl:copy>
<xsl:value-of select=
"concat(.,
substring('00000000',
1,
8 + starts-with(., '-') - string-length())
)
"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
应用于此XML文档:
<coordinates>
<latitude>3876570</latitude>
<longitude>-9013376</longitude>
</coordinates>
产生了想要的正确结果:
<coordinates>
<latitude>38765700</latitude>
<longitude>-90133760</longitude>
</coordinates>
应用于此XML文档时:
<coordinates>
<latitude>123</latitude>
<longitude>-99</longitude>
</coordinates>
再次生成想要的正确结果:
<coordinates>
<latitude>12300000</latitude>
<longitude>-99000000</longitude>
</coordinates>
请注意:
在表达式中:
substring('00000000',
1,
8 + starts-with(., '-') - string-length())
我们使用的事实是,只要布尔值是算术运算符的参数,就会使用以下规则将其转换为数字:
number(true()) = 1
和
number(false()) = 0
因此,如果当前节点的值为负,则上面的表达式再提取一个零 - 考虑减号并得到我们必须附加到该数字的确切零数。