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桁を超えると急に標準表記と科学表記が切り替わるのが気になります。これは私の問題です。科学表記を避けたいのです。他のさまざまな質問の後、どうやらフォーマット番号をどこにでも配置することに固執しているようです。

しかし、 format-number も機能していないようです。「s1plain」の出力は、有効桁数がプロセッサに認識されていることを証明しているという事実にもかかわらず(倍精度に変換して元に戻すと精度が失われる可能性があることは理解していますが、そのような変換後に正しい数値があるため、 ...?)、その値を標準的な非科学的表記法で出力する方法はないようです。ある?

4

1 に答える 1

2

これは私の問題です。科学表記を避けたいのです。他のさまざまな質問の後、どうやらフォーマット番号をどこにでも配置することに固執しているようです。

しかし、 format-number も機能していないようです。

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 に答える