XSLT 格式化数字给出了错误的千位分组分隔符
XSLT Formatting number gives wrong thousand an grouping separator
我有一个 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,方法是将它们打印在硬编码的页面上,并且它们正确地获取了它们的值。
我做错了什么?
您不能在 xsl:decimal-format
的任何属性中使用变量。
预定义几个 xsl:decimal-format
元素,并使用参数 select 其中一个按名称。
添加示例:
<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>
当num-format
参数为"US"时,这将return 1,234.57
,当参数为"EU"时,1.234,57
。
请注意,format-number()
函数的 pattern 参数是根据使用的十进制格式解释的 - 因此它也必须被参数化。
两个进一步的观察:
(a) 当您指定 decimal-separator="$userDecimalSeparator"
时,您的 XSLT 处理器应该给您一条错误消息,因为该值必须是单个字符。
(b) XSLT 3.0 允许您使用影子属性对 xsl:decimal 格式进行参数化,可以将其设置为静态参数的值:
<xsl:param name="userThousandSeparator" static="yes"/>
<xsl:param name="userDecimalSeparator" static="yes"/>
<xsl:decimal-format name="userFormat"
NaN=""
_decimal-separator="{$userDecimalSeparator}"
_grouping-separator="{$userThousandSeparator}" />
我有一个 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,方法是将它们打印在硬编码的页面上,并且它们正确地获取了它们的值。 我做错了什么?
您不能在 xsl:decimal-format
的任何属性中使用变量。
预定义几个 xsl:decimal-format
元素,并使用参数 select 其中一个按名称。
添加示例:
<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>
当num-format
参数为"US"时,这将return 1,234.57
,当参数为"EU"时,1.234,57
。
请注意,format-number()
函数的 pattern 参数是根据使用的十进制格式解释的 - 因此它也必须被参数化。
两个进一步的观察:
(a) 当您指定 decimal-separator="$userDecimalSeparator"
时,您的 XSLT 处理器应该给您一条错误消息,因为该值必须是单个字符。
(b) XSLT 3.0 允许您使用影子属性对 xsl:decimal 格式进行参数化,可以将其设置为静态参数的值:
<xsl:param name="userThousandSeparator" static="yes"/>
<xsl:param name="userDecimalSeparator" static="yes"/>
<xsl:decimal-format name="userFormat"
NaN=""
_decimal-separator="{$userDecimalSeparator}"
_grouping-separator="{$userThousandSeparator}" />