XSL error: format-number picture: Passive character must not appear between active characters in a sub-picture
XSL error: format-number picture: Passive character must not appear between active characters in a sub-picture
需要读取数字并格式化。
输入:
<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')"
为最后 2 个值打印 NaN。所有其他值均正确呈现。
该解决方案需要与 saxon 和 xalan 实现兼容。
更新二:
仔细调查后发现空白字符实际上是
或 
。
感谢@Martin Honnen 和@Michael Ka 的帮助,工作片段如下所示:
<xsl:variable name="number" select="number(translate(., ',  ', '.'))"/>
<xsl:value-of select="format-number($number, '# ##0,000', 'SUM_FORMAT')"/>
以下内容适用于 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
这里有两个问题:输入和输出。
number()
应用于字符串,如果输入字符串的格式不正确,无法转换为数字,则会得到 NaN
。这意味着您不仅需要将 ","
转换为 "."
,还需要去除嵌入的空格。您可以使用 translate($in, ", ", ".")
.
一次性完成
对于输出,我认为您对 format-number()
的调用应该有效。我不知道你为什么会收到关于格式图片的错误。但是你已经多次更新了这个问题,所以我不知道你是否仍然遇到这个错误。
需要读取数字并格式化。
输入:
<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')"
为最后 2 个值打印 NaN。所有其他值均正确呈现。
该解决方案需要与 saxon 和 xalan 实现兼容。
更新二:
仔细调查后发现空白字符实际上是
或 
。
感谢@Martin Honnen 和@Michael Ka 的帮助,工作片段如下所示:
<xsl:variable name="number" select="number(translate(., ',  ', '.'))"/>
<xsl:value-of select="format-number($number, '# ##0,000', 'SUM_FORMAT')"/>
以下内容适用于 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
这里有两个问题:输入和输出。
number()
应用于字符串,如果输入字符串的格式不正确,无法转换为数字,则会得到 NaN
。这意味着您不仅需要将 ","
转换为 "."
,还需要去除嵌入的空格。您可以使用 translate($in, ", ", ".")
.
对于输出,我认为您对 format-number()
的调用应该有效。我不知道你为什么会收到关于格式图片的错误。但是你已经多次更新了这个问题,所以我不知道你是否仍然遇到这个错误。