Необходимо прочитать числа и отформатировать их.
Ввод:
<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:
После тщательного расследования оно оказалось из-за того, что символ пробела был на самом деле
или  
.
Спасибо за помощь @Martin Honnen и @Michael Ka, рабочий фрагмент выглядит так:
<xsl:variable name="number" select="number(translate(., ',  ', '.'))"/>
<xsl:value-of select="format-number($number, '# ##0,000', 'SUM_FORMAT')"/>