XSLT格式化编号给错误的千位分组分隔符

时间:2016-04-19 07:29:05

标签: xml xslt number-formatting

我有一个XSLT页面,需要提供区域感知功能。我通过会话参数将千位和小数分隔符传递给我的页面。我把它们放在xsl:decimal格式中,并尝试在我的金额字段上调用它。

    <xsl:param name="userNumberFormat"/>
    <xsl:param name="userThousandSeparator"/>
    <xsl:param name="userDecimalSeparator"/>
    <xsl:decimal-format NaN="" decimal-separator="$userDecimalSeparator" grouping-separator="$userThousandSeparator" name="userFormat"/>
    ...
    <xsl:value-of select="format-number(number(Payment:InstructedAmount/System:Amount), '#,###.00', 'userFormat')"/>

但是我在部署时遇到问题,字符格式错误。

例如,指示金额字段获得以下输入: 0.12

我的千位分隔符是逗号而我的小数点分隔符是一个点。

但是这给出了输出:00,。

我测试了会话变量$ userDecimalSeparator和$ userThousandSeparator,通过在硬编码的页面上打印它们并正确获取它们的值。 我做错了什么?

2 个答案:

答案 0 :(得分:1)

您无法在xsl:decimal-format的任何属性中使用变量。

预定义多个xsl:decimal-format元素,并使用参数按名称选择其中一个元素。

添加了示例:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:param name="decimal-format">EU</xsl:param>

<xsl:decimal-format name="US" decimal-separator="." grouping-separator="," />
<xsl:decimal-format name="EU" decimal-separator="," grouping-separator="." />
<xsl:variable name="decimal-format-pattern">
    <xsl:choose>
        <xsl:when test="$decimal-format='US'">#,###.00</xsl:when>
        <xsl:when test="$decimal-format='EU'">#.###,00</xsl:when>
    </xsl:choose>
</xsl:variable>

<xsl:template match="/">
    <xsl:value-of select="format-number(1234.567, $decimal-format-pattern, $decimal-format)"/>  
</xsl:template>

</xsl:stylesheet>

1,234.57参数为&#34; US&#34;以及num-format时参数为&#34; EU&#34;。

请注意,1.234,57函数的 pattern 参数是根据使用的十进制格式解释的 - 因此它也必须进行参数化。

答案 1 :(得分:-1)

另外两个观察结果:

(a)当您指定decimal-separator="$userDecimalSeparator"时,您的XSLT处理器应该给您一条错误消息,因为该值必须是单个字符。

(b)XSLT 3.0允许您使用阴影属性参数化xsl:decimal-format,可以将其设置为静态参数的值:

<xsl:param name="userThousandSeparator" static="yes"/>
<xsl:param name="userDecimalSeparator" static="yes"/>
<xsl:decimal-format name="userFormat"
   NaN="" 
   _decimal-separator="{$userDecimalSeparator}" 
   _grouping-separator="{$userThousandSeparator}" />