2

对于这个 XSLT:

    <xsl:variable name="source0" select="number(num2)"/>
    <xsl:variable name="source1" select="number(num3)"/>
    s0 plain: <xsl:value-of select="$source0"/>
    s1 plain: <xsl:value-of select="$source1"/>
    test11: <xsl:value-of select="format-number($source0, '#.#')"/>
    test12: <xsl:value-of select="format-number($source0, '#.###############')"/>
    test21: <xsl:value-of select="format-number($source1, '#.#')"/>
    test22: <xsl:value-of select="format-number($source1, '#.###############')"/>

对于 XML:

<num2>123456.1234</num2>
<num3>1234567.1234</num3>

我得到这个输出(使用 Saxon 9.2,XSLT 2.0)

    s0 plain: 123456.1234
    s1 plain: 1.2345671234E6
    test11: 123456.1
    test12: 123456.123399999996764
    test21: 1234567.1
    test22: 1234567.123399999924004

首先...我很好奇为什么当它超过小数点左侧6位时,它会突然在标准和科学记数法之间切换?这是我的问题,我想避免使用科学记数法。在提出各种其他问题之后,我发现我显然坚持将格式编号放在任何地方。

但是格式编号似乎也不起作用。尽管“s1 plain”的输出证明处理器知道有效位数(我了解转换为双精度和返回可能会丢失精度,但是在这样的转换之后有正确的数字,所以...?),似乎没有办法以标准的非科学计数法输出该值。有没有?

4

1 回答 1

2

这是我的问题,我想避免使用科学记数法。在提出各种其他问题之后,我发现我显然坚持将格式编号放在任何地方。

但是格式编号似乎也不起作用。

显然您没有使用 XSLT 2.0/XPath 2.0 的适当功能

这种转变:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output method="text"/>

 <xsl:template match="/*">
  <xsl:variable name="vs0" as="xs:decimal"
  select="xs:decimal(num2)"/>

  <xsl:variable name="vs1" as="xs:decimal"
  select="xs:decimal(num3)"/>

    s0 plain: <xsl:value-of select="$vs0"/>
    s1 plain: <xsl:value-of select="$vs1"/>
    test11: <xsl:value-of select="format-number($vs0, '#.#')"/>
    test12: <xsl:value-of select="format-number($vs0, '#.###############')"/>
    test21: <xsl:value-of select="format-number($vs1, '#.#')"/>
    test22: <xsl:value-of select="format-number($vs1, '#.###############')"/>

 </xsl:template>
</xsl:stylesheet>

应用于此 XML 文档时

<nums>
    <num2>123456.1234</num2>
    <num3>1234567.1234</num3>
</nums>

产生准确的结果

s0 plain: 123456.1234
s1 plain: 1234567.1234
test11: 123456.1
test12: 123456.1234
test21: 1234567.1
test22: 1234567.1234

结论:当需要良好的精度时,请始终尝试使用xs:decimal数据类型。

于 2010-07-30T04:26:17.913 回答