xsl-list
[Top] [All Lists]

RE: Is there another way to do this?

2004-03-03 06:16:54
Other possible ways to tackle this are

(a) by creating a temporary tree (result tree fragment) containing the
values to be summed, and then using sum(). This requires the node-set()
extension function

(b) implement a higher-order function using Dimitre Novatchev's FXSL library

(c) use an XPath 2.0 "for" expression:

sum(for $i in //item return $i/units * $i/unit.price)

Michael Kay

# -----Original Message-----
# From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-
# list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of Tim Lumley
# Sent: 03 March 2004 10:19
# To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
# Subject: [xsl] Is there another way to do this?
# 
# Being new to XSL tree climbing (sequential tokenising HTML/XML/SGML for
# years), I want to calculate the grand total for the saledetails.  I have
# done my home work, around 3 XSLT books later I came up with this solution:
# 
# <XML/> (note: this is only a fragment of the xml):
# 
# <saledetails>
#    <item>
#       <sku>34860</sku>
#       <description>Black felt-tip pens 0.4 mm</description>
#       <units qpu="10">3</units>
#       <unit.price gst="10">19.95</unit.price>
#    </item>
#    <item>
#       <sku>49603</sku>
#       <description>A4 Inkjet paper white</description>
#       <units qpu="500">20</units>
#       <unit.price gst="10">5.95</unit.price>
#    </item>
# </saledetails>
# 
# I use this call when I have matched="saledetails":
# 
# <xsl:call-template name="grandtotal">
#    <xsl:with-param name="nodenumber" select="1"/>
#    <xsl:with-param name="grandtotal" select="0"/>
# </xsl:call-template>
# 
# To this template:
# 
# <xsl:template name="grandtotal">
#    <xsl:param name="nodenumber"/>
#    <xsl:param name="grandtotal"/>
#    <xsl:choose>
#       <xsl:when test="not(item[$nodenumber])">
#          <xsl:value-of select="format-number($grandtotal, '#0.00')"/>
#       </xsl:when>
#       <xsl:otherwise>
#          <xsl:call-template name="grandtotal">
#             <xsl:with-param name="nodenumber" select="$nodenumber+1"/>
#             <xsl:with-param name="grandtotal"
# select="$grandtotal+(item[$nodenumber]/units *
# item[$nodenumber]/unit.price)"/>
#          </xsl:call-template>
#       </xsl:otherwise>
#    </xsl:choose>
# </xsl:template>
# 
# 
# This works but I'm just wondering is there a simpler method for doing
# this?
# 
# 
# Cheers
# Tim Lumley
# tlumley(_at_)netspeed(_dot_)com(_dot_)au
# 
# 
# 
#  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



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



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