Сохранить количество цифр во время обработки ввода-> число-> вывода во время обработки XSLT - PullRequest
2 голосов
/ 30 июля 2010

Для этого 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 и обратно может потерять точность, но после такого преобразования есть правильное число, поэтому...?), кажется, нет способа вывести это значение в стандартной ненаучной записи.Есть ли?

1 Ответ

2 голосов
/ 30 июля 2010

Это моя проблема, я хочу избежать научная нотация. После различных другие вопросы, я выясняю, по-видимому Я застрял с введением числа формата во всем мире.

Но номер формата не отображается работать либо.

Очевидно, вы не используете соответствующие функции 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.

...