我正在尝试创建一个 XSLT 映射,该映射将文本字段中通过的相当大的整数值正确转换为适当的整数值。 问题是由于 1.0 仅支持转换为类型数字,因此我得到一个像 1.234567890E9
这样的值来输入"1234567890"
我正在使用带有XSLT1.0的Altova MapForce作为编码平台。 XSLT2.0 似乎不是一个选项,因为 XSLT 必须使用仅支持 XSLT1.0 的预先存在的例程进行处理
。默认情况下,Mapforce 生成 <xsl:value-of select="string(floor(number(string(.))))"/>
我已经尝试了我能想到的所有函数组合,但总是为大值获得浮点数。
进一步的测试表明问题出在 Mapforce 上,它在从文本映射到 int 时坚持使用 number() 函数。
让我试着通过回答一个你没有问但也许应该问的问题来推进这个问题。假设您有以下输入:
.XML
<input>
<value>1234567890000000.9</value>
<value>9876543210000000</value>
</input>
并且您要确保输入值(都是数字,但其中一些不是整数)在输出处转换为整数,您可以应用以下转换:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<output>
<xsl:for-each select="input/value">
<value><xsl:value-of select="format-number(., '#')"/></value>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
获取以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<output>
<value>1234567890000001</value>
<value>9876543210000000</value>
</output>
请注意,此处的结果是四舍五入的,而不是地板。
你确定mapforce没有使用xslt-2.0吗?
如果我在 XSLT-1.0 中这样做(使用 saxon 或 Altova 的处理器):
<xsl:value-of select="number('1234567890')"/>
我得到-> 1234567890
如果我使用 XSLT-2.0,我会得到 -> 1.23456789E9
所以我认为 XSLT 1 转换应该返回数字的浮点表示形式是非常奇怪的。
使用 format-number(1.23456789E9,'#')
设置数字格式将始终为您提供 XSLT-1.0 和 2.0 中的1234567890
。 编辑:撒克逊不会将 1.23456789E9 转换为 xslt-1.0 中的数字,但 altova 的处理器会。
问题出在 Mapforce 中,所以我决定让 mapforce 生成它的代码,然后覆盖导致所有麻烦的这个字段。
@Tobias @Michael 感谢你们俩的帮助。 自从您的帮助导致答案以来,我已经+1您的答案和一些评论。