代码之家  ›  专栏  ›  技术社区  ›  Jherico

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

  •  3
  • Jherico  · 技术社区  · 15 年前

    我有一些XSLT,它在整数数据库标识符上执行一些魔力。相关代码是

          <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">
    

    这个结果对我来说是无用的,因为我将无法使用科学符号条目作为db import实用程序的输入。我在变量声明中尝试了许多函数,例如 string(@ID + $contentOffsetId) 但似乎没有什么能达到预期的效果。

    正在使用SAXON 8.7执行XSL。

    2 回复  |  直到 6 年前
        1
  •  7
  •   Raute nont    6 年前

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

        2
  •  0
  •   Michael Kay    6 年前

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

    你还没有告诉我们在哪里 $contentoffsetid 来自,但如果我的猜测正确,请使用 as="xs:integer" 在变量声明上。

    至于 @身份证 ,我猜您的样式表不知道模式,因此 @身份证 是非类型化的原子;可以使用 xs:integer(@ID) . 在算术表达式中使用非类型化原子值时,默认值是将转换为 xs:double 但这在很大程度上是来自于XSLT1.0的遗留问题,并且通常是不适当的。

    顺便说一下,在XSLT2.0中,您可以替换

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

    通过

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