在处理输入期间保留位数 - 在XSLT处理期间输出> number->输出

时间:2010-07-29 21:28:41

标签: xslt xslt-2.0 number-formatting

对于这个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”的输出证明了处理器已知有效位数(我理解转换为double和back可能会失去精度,但是在转换后有正确的数字,所以......?),似乎无法用标准的非科学记数法输出该值。有吗?

1 个答案:

答案 0 :(得分: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数据类型。