December 30, 2001 - Formatting Numbers in XSLT | WebReference

December 30, 2001 - Formatting Numbers in XSLT

Yehuda Shiran December 30, 2001
Formatting Numbers in XSLT
Tips: December 2001

Yehuda Shiran, Ph.D.
Doc JavaScript

When you want to convert numeric data in XML into formatted strings in HTML, there are several ways to do it. First, you can just copy the data as is. If, for example, the XML file includes this line:

<week number="3" dvds_rented="18000" />
you can extract the value of the number attribute as follows:

<xsl:value-of select="@number"/>
The other way to convert numeric data is by specifying the target format. You have to use the format-number() method. The first parameter is the numeric data, while the second parameter is the format specification. You put a "#" sign for each digit, and any other characters in between. For example, you can allocate printing space for a six-digit number, and a comma every three digits, starting from the right hand side, as follows:

format-number(@dvds_rented, "###,###");
Here is an XSL file that converts the XML file at the bottom of this tip (try it):

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="https://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE><xsl:value-of select="//summary/heading"/></TITLE>
</HEAD>
<BODY>
<H1><xsl:value-of select="//summary/heading"/></H1>
<H2><xsl:value-of select="//summary/subhead"/></H2>
<P><xsl:value-of select="//summary/description"/></P>
<TABLE>
<TR>
<TH>Month\Week</TH>
<xsl:for-each select="//data/month[1]/week">
<TH>W<xsl:value-of select="@number"/></TH>
</xsl:for-each>
<TH>Total</TH>
</TR>
<xsl:for-each select="//data/month">
  <tr>
    <th style="text-align:left"><xsl:value-of select="name"/></th>
    <xsl:for-each select="week">
      <td style="text-align:right">
        <xsl:value-of select="format-number(@dvds_rented, '###,###')"/>
      </td>
    </xsl:for-each>
  </tr>
</xsl:for-each>
</TABLE>    
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
Here is the output (the Total column is not computed here on purpose -- we will present it in one of our future tips):

Here is the XML file:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="011230.xsl"?>
  <sales>
    <summary>
      <heading>MyDVD Rental Store</heading>
      <subhead>Periodical Sales Report</subhead>
      <description>Sales Report for January, February, and March of 2001</description>
    </summary>
	<data>
      <month>
        <name>January 2001</name>
        <week number="1" dvds_rented="12000" />
        <week number="2" dvds_rented="15000" />
        <week number="3" dvds_rented="18000" />
        <week number="4" dvds_rented="11800" />		  
      </month>
      <month>
        <name>February 2001</name>
        <week number="1" dvds_rented="11500" />
        <week number="2" dvds_rented="12390" />
        <week number="3" dvds_rented="19050" />
        <week number="4" dvds_rented="11200" />		  
      </month>
      <month>
        <name>March 2001</name>
        <week number="1" dvds_rented="15300" />
        <week number="2" dvds_rented="12390" />
        <week number="3" dvds_rented="10050" />
        <week number="4" dvds_rented="11230" />		  
      </month>
    </data>
  </sales>