xsl-list
[Top] [All Lists]

RE: tail recursion and NaN

2004-05-08 01:56:01
Hi Susan,

If the operation is a simple sum, why not use the inherent XSLT function sum and let the XPath pick out the right nodes for you?

BTW a number(.) also returns 'NaN' if the node's string value is nothing (""), so some of the tests you do are not necessary anyway (MK's XSLT Programmers Ref. 2nd. ed., p. 532).

I would expect something like this to work:
result = <xsl:value-of select="sum(nodeset-containing-prices[number(translate(.,'$',''))!='NaN'])"/>

where nodeset-containing-prices should be exchanged with the nodeset you use in the $price parameter first time the template total_value is called.

I hope this helps

Regards,
Ragulf Pickaxe :)


From: "Susan Campbell" <SCampbell(_at_)ccla(_dot_)lib(_dot_)fl(_dot_)us>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Subject: RE: [xsl] tail recursion and NaN
Date: Fri, 7 May 2004 08:59:19 -0400

Thanks for the help. I later learned I also had to test for a dollar sign as well as empty cells. This is what I'm using. It works, but there may be a more compact/elegant way to do it.
sc

<xsl:template name="total-value">
   <xsl:param name="price"/>
         <xsl:param name="result" select="0"/>
         <xsl:param name="nodollarsign" select="translate($price,'$','')"/>
           <xsl:choose>
                <xsl:when test="$price and number($price) = number($price)">
                         <xsl:call-template name="total-value">
                        <xsl:with-param name="price" select="$price[position() &gt; 
1]"/>
                        <xsl:with-param name="result" select="$result + 
$price"/>
                        </xsl:call-template>
                </xsl:when>
                <xsl:when test="$nodollarsign">
                        <xsl:call-template name="total-value">
                        <xsl:with-param name="price" select="$price[position() &gt; 
1]"/>
                        <xsl:with-param name="result" select="$result + 
$nodollarsign"/>
                            </xsl:call-template>
                   </xsl:when>
                <xsl:when test="$price and number($price) != number($price)">
                        <xsl:call-template name="total-value">
                        <xsl:with-param name="price" select="$price[position() &gt; 
1]"/>
                        <xsl:with-param name="result" select="$result"/>
                        </xsl:call-template>
                </xsl:when>
                <xsl:otherwise><xsl:value-of select="$result"/></xsl:otherwise>
         </xsl:choose>
</xsl:template>

_________________________________________________________________
STOP MORE SPAM with the new MSN 8 and get 2 months FREE* http://join.msn.com/?page=features/junkmail



<Prev in Thread] Current Thread [Next in Thread>