0

我正在尝试创建一个 XSLT 映射,将文本字段中的相当大的整数值正确转换为适当的整数值。问题是,由于 1.0 只支持转换为数字类型,我得到一个类似于1.234567890E9back 的值作为输入"1234567890"

我使用带有 XSLT1.0 的 Altova MapForce 作为编码平台。XSLT2.0 似乎不是一个选项,因为必须使用仅支持 XSLT1.0 的预先存在的例程来处理 XSLT

默认情况下,Mapforce 会生成 <xsl:value-of select="string(floor(number(string(.))))"/> 并且我已经尝试了我能想到的所有函数组合,但对于大值总是得到一个浮点数。

进一步的测试表明问题出在 Mapforce 上,它在从 text 映射到 int 时坚持使用 number() 函数。

4

3 回答 3

2

让我尝试通过回答一个您没有问但也许应该问的问题来推动这一进程。假设您有以下输入:

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>

请注意,此处的结果是四舍五入的,而不是下限的。

于 2014-04-01T19:07:11.880 回答
1

你确定 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,'#')始终为您1234567890提供 XSLT-1.0 和 2.0。 编辑: saxon 不会将 1.23456789E9 转换为 xslt-1.0 中的数字,但是 altova 的处理器会。

于 2014-04-01T19:14:11.673 回答
0

问题出在 Mapforce 内部,所以我决定让 mapforce 生成它的代码,然后为这个导致所有麻烦的字段覆盖它。

@Tobias @Michael 感谢你们的帮助。自从您的帮助导致答案后,我已经 +1 了您的答案和一些评论。

于 2014-04-01T21:27:44.023 回答