XSLT格式化数字,从最右边的数字开始,每4个数字后插入' - '

时间:2013-07-10 19:42:41

标签: xslt numbers format

我有一个长度为27位的数字,我需要格式化以便于阅读:

Input : 999967799857791961574987365

Expected output : 999-9677-9985-7791-9615-7498-7365

所以用语言来说, 从最右边开始,我需要在每4位数之后插入一个' - '

我一直在使用

<xsl:value-of select="format-number($ID, '###-####-####-####-####-####-####-####')" />

但它根本不起作用。

任何帮助或指示都会很棒。欢呼

2 个答案:

答案 0 :(得分:2)

你不能像你一样传递格式字符串并使其工作的原因是格式字符串中的字符都具有特殊意义。 “ - ”被理解为减号,而不是分组分隔符。要使其工作,您必须使用xsl:decimal-format定义格式,并使用format-number的可选第三个参数引用它。这是一个完整的样式表,您可以在任何XML文件上调用以说明:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">
  <xsl:output method="text"/>
  <xsl:decimal-format name="dashes" grouping-separator="-"/>
  <xsl:template match="/">
    <xsl:value-of select="format-number(999967799857791961574987365,
                                        '-####', 'dashes')"/>
    <xsl:text>&#x0A;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

这对我来说似乎是个黑客,但你可以试试:

<xsl:value-of select="translate(format-number($ID,',####'),',','-')"/>

这适用于我的XSLT 1.0和2.0。

注意:$ID必须是整数。您可能需要使用xs:integer($ID)(可能需要2.0处理器)。


回答评论:

请尝试使用此模板:

<xsl:template name="ReceiptId">
    <xsl:param name="RECEIPT_ID_UNFORMATTED"/>
    <xsl:variable name="RECEIPT_ID_FORMATTED" select="translate(format-number(xs:integer($RECEIPT_ID_UNFORMATTED),',####'),',','-')"/>
    <div class="line">
        <xsl:value-of select="concat($RECEIPT_ID_PREFIX,&quot; &quot;,$RECEIPT_ID_FORMATTED)"/>
    </div>
</xsl:template>

不要忘记在xsxsl:stylesheet)中声明xmlns:xs="http://www.w3.org/2001/XMLSchema"命名空间,以便您可以使用xs:integer()