Ошибка XSL: изображение формата числа: пассивный символ не должен появляться между активными символами в дополнительном изображении - PullRequest
0 голосов
/ 28 января 2020

Необходимо прочитать числа и отформатировать их.

Ввод:

<InitialReading>500</InitialReading>
<InitialReading>620,25</InitialReading>
<InitialReading>1 200,5</InitialReading>
<InitialReading>1 100</InitialReading>

XSL:

<xsl:call-template name="formatNumber3">
    <xsl:with-param name="number"
                        select="format-number(number(InitialReading/translate(., ',', '.')), '# ###0.000')"/>
</xsl:call-template>
<xsl:template name="formatNumber3">
    <xsl:param name="number"/>
    <xsl:call-template name="formatNumber">
        <xsl:with-param name="number" select="$number"/>
        <xsl:with-param name="format" select="'# ##0,000'"/>
    </xsl:call-template>
</xsl:template>
<xsl:decimal-format name="SUM_FORMAT" grouping-separator=" " decimal-separator=","/>
<xsl:template name="formatNumber">
    <xsl:param name="number"/>
    <xsl:param name="format"/>
    <xsl:if test="normalize-space($number)">
        <xsl:value-of select="format-number(number(normalize-space($number)), $format, 'SUM_FORMAT')"/>
    </xsl:if>
</xsl:template>

Ожидаемый результат:

<p>500,000</p>
<p>620,250</p>
<p>1 200,500</p>
<p>1 100,000</p>

Обновление:

select="format-number(number(InitialReading/translate(., ',', '.')), '##0.000')" печать NaN для последнего 2 значения. Все остальные значения отображаются правильно.

Решение должно быть совместимо с реализациями saxon и xalan.

Обновление 2:

После тщательного расследования оно оказалось из-за того, что символ пробела был на самом деле &nbsp; или &#160;.

Спасибо за помощь @Martin Honnen и @Michael Ka, рабочий фрагмент выглядит так:

<xsl:variable name="number" select="number(translate(., ', &#160;', '.'))"/>
        <xsl:value-of select="format-number($number, '# ##0,000', 'SUM_FORMAT')"/>

Ответы [ 2 ]

1 голос
/ 28 января 2020

Здесь есть две проблемы: ввод и вывод.

number(), примененный к строке, даст вам NaN, если строка ввода имеет неправильный формат для преобразования в число. Это означает, что вам нужно не только перевести "," в ".", вам также нужно избавиться от встроенного пробела. Вы можете сделать это за один go с translate($in, ", ", ".").

Для вывода, я думаю, ваш вызов на format-number() должен работать. Я не знаю, почему вы получаете сообщение об ошибке формата изображения. Но вы обновили вопрос несколько раз, поэтому я не знаю, по-прежнему ли вы получаете эту ошибку.

1 голос
/ 28 января 2020

Следующее работает для меня с процессорами XSLT 1 и 3:

  <xsl:decimal-format name="SUM_FORMAT" 
    grouping-separator=" " 
    decimal-separator=","/>

  <xsl:template match="InitialReading">
      <xsl:variable name="number"
        select="number(translate(., ', ', '.'))"/>
      <p>Parsed value : <xsl:value-of select="$number"/></p>
      <p>Formatted value: <xsl:value-of select="format-number($number, '# ##0,000', 'SUM_FORMAT')"/></p>
  </xsl:template>

Выход на https://xsltfiddle.liberty-development.net/6rexjhV/2:

<p>Parsed value : 500</p>
    <p>Formatted value: 500,000</p>
<p>Parsed value : 620.25</p>
    <p>Formatted value: 620,250</p>
<p>Parsed value : 1200.5</p>
    <p>Formatted value: 1 200,500</p>
<p>Parsed value : 1100</p>
    <p>Formatted value: 1 100,000</p>


Parsed value : 500

Formatted value: 500,000

Parsed value : 620.25

Formatted value: 620,250

Parsed value : 1200.5

Formatted value: 1 200,500

Parsed value : 1100

Formatted value: 1 100,000
...