xslt格式化数字

时间:2012-10-18 21:15:46

标签: xml xslt-2.0 number-formatting

我需要在xslt中格式化小数值。模板应删除小数。并显示指定的数字后跟指定的小数位数。圆形模板围绕小数点。当我尝试使用我当前的模板时,我得到了NaN。

如果digitCount = 9

,模板应将992.45转换为000000992
<xsl:template name="RoundedDecimalFormat">
    <xsl:param name="num"></xsl:param>
    <xsl:param name="digitCount"></xsl:param>
    <xsl:variable name="value" select="format-number(round($num), '#########')"></xsl:variable>
    <xsl:call-template name="format-batchnum">
      <xsl:with-param name="batchnum" select="$value"></xsl:with-param>
      <xsl:with-param name="numbatchdigit" select="$digitCount"></xsl:with-param>
    </xsl:call-template>
  </xsl:template>
如果manyDigits = 9

下面的模板应将1323.91转换为00000132391

 <xsl:template name="UnRoundedDecimalFormat">
    <xsl:param name="time"></xsl:param>
    <xsl:param name="manyDigits"></xsl:param>
    <xsl:variable name="value" select="format-number($time, '#########')"></xsl:variable>
    <xsl:call-template name="format-batchnum">
      <xsl:with-param name="batchnum" select="$value"></xsl:with-param>
      <xsl:with-param name="numbatchdigit" select="$manyDigits"></xsl:with-param>
    </xsl:call-template>
  </xsl:template>

这部分可以正常使用其他地方

<xsl:template name="format-batchnum">
    <xsl:param name="batchnum"/>
    <xsl:param name="numbatchdigit"/>
    <xsl:value-of select="concat(substring(substring($vZeroes,1,$numbatchdigit), string-length($batchnum) +1), $batchnum)"/>
  </xsl:template>

修订版 *

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:fo="http://www.w3.org/1999/XSL/Format" 
                xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
                xmlns:ns0="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:fn="http://www.w3.org/2005/02/xpath-functions " 
                xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                version="2.0">


 <xsl:call-template name="UnRoundedDecimalFormat">
      <xsl:with-param name="salary" select="$annualSalary"></xsl:with-param>
    </xsl:call-template>


<xsl:template name="RoundedDecimalFormat">
    <xsl:param name="num"></xsl:param>
    <xsl:param name="digitCount" select ="9"></xsl:param>
    <xsl:variable name="value" select="format-number(round($num), '#########')"></xsl:variable>
    <xsl:call-template name="format-batchnum">
      <xsl:with-param name="batchnum" select="$value"></xsl:with-param>
      <xsl:with-param name="numbatchdigit" select="$digitCount"></xsl:with-param>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="UnRoundedDecimalFormat">
    <xsl:param name="time"></xsl:param>
    <xsl:param name="manyDigits" select ="9"></xsl:param>

    <xsl:variable name="vTime" select="translate(string($time), '.', '')"/>

    <xsl:variable name="value" select="format-number(number(xs:string($vTime)), '#########')"></xsl:variable>
    <xsl:call-template name="format-batchnum">
      <xsl:with-param name="batchnum" select="$value"></xsl:with-param>
      <xsl:with-param name="numbatchdigit" select="$manyDigits"></xsl:with-param>
    </xsl:call-template>
 </xsl:template>


function roundedDecimalFormat(number){
try{
var n = Math.round(number);
return n;}
catch(err){return '';}
}

function removeDecimal(number){
try{
var n = number.replace('.','');
return n;}
catch(err){
return '';
}
};

1 个答案:

答案 0 :(得分:1)

只需轻轻触摸代码即可使其按预期工作:

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:variable name="vZeroes" select=
    "'0000000000000000000000000000000000000000000'"/>

 <xsl:template match="/">
     <xsl:call-template name="RoundedDecimalFormat">
      <xsl:with-param name="num" select="992.45"/>
      <xsl:with-param name="digitCount" select="9"/>
     </xsl:call-template>
=========================
     <xsl:call-template name="UnRoundedDecimalFormat">
      <xsl:with-param name="time" select="1323.91"/>
      <xsl:with-param name="manyDigits" select="9"/>
     </xsl:call-template>
 </xsl:template>

 <xsl:template name="RoundedDecimalFormat">
    <xsl:param name="num"></xsl:param>
    <xsl:param name="digitCount"></xsl:param>
    <xsl:variable name="value" select="format-number(round($num), '#########')"></xsl:variable>
    <xsl:call-template name="format-batchnum">
      <xsl:with-param name="batchnum" select="$value"></xsl:with-param>
      <xsl:with-param name="numbatchdigit" select="$digitCount"></xsl:with-param>
    </xsl:call-template>
  </xsl:template>

 <xsl:template name="UnRoundedDecimalFormat">
    <xsl:param name="time"></xsl:param>
    <xsl:param name="manyDigits"></xsl:param>

    <xsl:variable name="vTime" select="translate(string($time), '.', '')"/>

    <xsl:variable name="value" select="format-number(number(xs:string($vTime)), '#########')"></xsl:variable>
    <xsl:call-template name="format-batchnum">
      <xsl:with-param name="batchnum" select="$value"></xsl:with-param>
      <xsl:with-param name="numbatchdigit" select="$manyDigits"></xsl:with-param>
    </xsl:call-template>
 </xsl:template>

 <xsl:template name="format-batchnum">
    <xsl:param name="batchnum"/>
    <xsl:param name="numbatchdigit"/>
    <xsl:value-of select="concat(substring(substring($vZeroes,1,$numbatchdigit), string-length($batchnum) +1), $batchnum)"/>
 </xsl:template>
</xsl:stylesheet>

当对任何XML文档(未使用)应用此转换时,会生成所需的正确结果

000000992
=========================
000132391