[xsl] Recursive sums in xslt 1.0

Subject: [xsl] Recursive sums in xslt 1.0
From: Daniel O'Donnell <daniel.odonnell@xxxxxxxx>
Date: Sun, 13 Mar 2005 11:20:01 -0700
I'm returning to a problem I asked a couple of weeks ago about node tests <http://www.biglist.com/lists/xsl-list/archives/200503/msg00088.html>. I've been working through the XSL 2.0 and XSL 1.0 suggestions proposed at the time by David Carlisle <http://www.biglist.com/lists/xsl-list/archives/200503/msg00089.html> and Wendell Piez <http://www.biglist.com/lists/xsl-list/archives/200503/msg00159.html>. I've listed the problem at the end of this e-mail.

The xslt 1.0 solution proposed was:

in xslt1 if you want to store an expression that is going to be
re-evaluated you need to put it in a named template. Then you could call
that so long as you replaced sum(..) with a recursive template that
iterated over the nodes calculating the sum and calling your named

I understand the named template, of course. I don't understand the second sentence, though. How would this work? I'm raising the question here rather than privately, because it seems like an important technique that might be useful (and difficult) for others like myself you are (now) probably more than beginners but less than experts.

The problem from my original e-mail:
The context is a financial xslt file that outputs itemised monthly
reports from an unitemised year-to-date xml file.  For each item in the
output file, I need to do two tests: one for date and the other for some
other feature (usually party [i.e. payer/payee]). This would be an
example with no parameters or variables:

<xsl:variable name="actualelectricity"> <xsl:value-of select="sum(/statement/item[date >= 20050228 and party[contains('DEML')]]/amount)"/> </xsl:variable>

What I want to do is turn the two expressions in the test into independent variables so that I could do something like this:

<xsl:variable name="actualelectricity"> <xsl:value-of select="sum(/statement/item[$datetest and $electricitytest]/amount)"/> </xsl:variable>


datetest = (date >= 20050228)


electricitytest = (party[contains('DEML')])

The reason for doing this is that it allows me to reuse the category tests (i.e. the party[contains()]-type tests) independently of the date tests: for year-to-date summaries, and for a miscellaneous class that consists of anything that is not identified by an explicit category test.

Daniel Paul O'Donnell, PhD
Associate Professor of English
University of Lethbridge
Lethbridge AB T1K 3M4
Tel. (403) 329-2377
Fax. (403) 382-7191
E-mail <daniel.odonnell@xxxxxxxx>
Home Page <http://people.uleth.ca/~daniel.odonnell/>
The Digital Medievalist Project: <http://www.digitalmedievalist.org/>

Current Thread