[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

[no subject]

From: costempd@xxxxxxxxxx
Date: Fri, 24 Mar 2000 13:12:23 -0500
nbsp normalize space
Hi.  I have an XML file with a lot of numbers and am generating HTML
tables.  I am probably backleveled with LotusXSL and XML4J, but just
downloaded xerces 1.1.0 (with xalan.jar) and seem to get the same results.
I only know very basic XSLT so I'm hoping someone can suggest some
improvements.

One of my problems is the input elements may contain a number, may be blank
or null, or may contain text such as "N/A".  What I want to do is format
the number if it is a number, otherwise print the trimmed text, or generate
" " for an empty cell.  My approach was as follows:

(part of the XML:)
    <SR>   545000</SR>
    <SP> 49.37</SP>
    <SR>   437971</SR>
    <SP> 37.00</SP>
  .... (102 pairs of <SR> and <SP>)

(part of the XSL:)
<xsl:variable name="SR1" select="normalize-space(SR[1])"/>
<xsl:variable name="SR2" select="normalize-space(SR[2])"/>
...
 <xsl:variable name="SP1" select="normalize-space(SP[1])"/>
<xsl:variable name="SP2" select="normalize-space(SP[2])"/>
...
<td align="right">&nbsp;<xsl:if test="boolean(number($SR1))"><xsl:value-of
select="format-number($SR1,'###,###,##0')"/></xsl:if></td>
<td align="center">&nbsp;<xsl:if test="boolean(number($SP1))"><xsl:value-of
 select="format-number($SP1,'##0.00')"/></xsl:if></td>
<td align="right">&nbsp;<xsl:if test="boolean(number($SR2))"><xsl:value-of
select="format-number($SR2,'###,###,##0')"/></xsl:if></td>
<td align="center">&nbsp;<xsl:if test="boolean(number($SP2))"><xsl:value-of
 select="format-number($SP2,'##0.00')"/></xsl:if></td>
(etc)

I used "boolean(number())" to ensure only numbers would be formatted,
otherwise the "&nbsp;" remains to give me an empty cell.  Two problems:
non-numeric text is lost, and elements containing "0" are not formatted
because boolean() returns false if the number is zero.

The following will print non-numeric text but not the zero, but it's a lot
of lines for each element:
<td>
<xsl:choose>
  <xsl:when test="boolean(number($SP1))"><xsl:value-of
select="format-number($SP1,'###,###,##0')"/></xsl:when>
  <xsl:otherwise>&nbsp;<xsl:value-of select="$SP1"/></xsl:otherwise>
</xsl:choose>
</td>

I also tried adding 1 to the number(), this time resetting the variable,
hoping boolean() would return true for any number except -1, but this
didn't work:
    <xsl:variable name="SR1" select="normalize-space(SR[1])"/>
    <xsl:if test="boolean(number($SR1)+1)"><xsl:variable name="SR1"
select="format-number($SR1,'###,###,##0')"/></xsl:if>
...
    <td align="center">&nbsp;<xsl:value-of select="$SP1"/></td>

Another problem is it takes a long time to process.  I used the SR[n]
approach so my table layout would be unaffected by an incorrect number of
input elements, but I imagine this adds a lot of overhead.  I can't process
all <SR> elements first and then all <SP> elements, as I need to maintain
the pairing in the output.  Is it better to call a template, for example to
process the above <choose> block for each element, or better to repeat the
block inline hundreds of times?

Thanks for any suggestions.

Nick Ridout



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread
  • [no subject]
    • costempd - Fri, 24 Mar 2000 13:12:23 -0500 <=

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.