在输出数值运算结果时,如何让XSLT停止使用科学记数法?

时间:2010-01-07 00:49:22

标签: java xslt saxon

我有一些XSLT,它对整数数据库标识符执行一些魔术。相关代码snippit是

      <xsl:variable name="releaseId" select="@ID + $contentOffsetId"/>
      <xsl:attribute name="OLD_ID"> <xsl:value-of select="@ID" /> </xsl:attribute>
      <xsl:attribute name="RELEASE_ID"> <xsl:value-of select="$releaseId" />      

不幸的是,这个输出看起来像这样:

<ALBUM.RELEASE_LOCALE LOCALE_CODE="en_US" OLD_ID="6597512" RELEASE_ID="6.597513E6">

这个结果对我来说没用,因为我无法使用科学记数法作为我的数据库导入实用程序的输入。我已经在变量声明上尝试了许多函数,例如string(@ID + $contentOffsetId),但似乎没有任何效果达到预期效果。

正在使用Saxon 8.7执行XSL。

2 个答案:

答案 0 :(得分:7)

使用format-number(详细参考:here

答案 1 :(得分:0)

我怀疑@ID$contentOffsetId都是伪装成双精度的整数,最好的策略是使用整数算术而不是浮点算术。然后,转换为字符串将使用整数规则而不是双精度规则,这将避免使用科学计数法。

您尚未向我们展示$contentOffsetId的来源,但是如果我的猜测正确,请在变量声明中使用as="xs:integer"将其声明为整数。

对于@ID,我的猜测是您的样式表不了解架构,因此@ID是无类型的;您可以使用xs:integer(@ID)将其转换为整数。在算术表达式中使用无类型原子值时,默认值是转换为xs:double,但这在很大程度上是XSLT 1.0的遗产,并且通常是不合适的。

在XSLT 2.0中您可以替换

<xsl:attribute name="x"><xsl:value-of select="Y"/></xsl:attribute>

作者

<xsl:attribute name="x" select="Y"/>