|
Subject: Re: [xsl] how to apply sum to a comma delimited list From: Mike Brown <mike@xxxxxxxx> Date: Wed, 15 May 2002 12:05:16 -0600 (MDT) |
Florin Dragu wrote:
> is there any way that I can use sum() functions in XSLT on a comma separated
> list (received as an output from a template)?
It would be easiest if when you built the comma-separated list, you created a
result tree fragment in which each value you want in the total is in a
separate element. The string-value of the fragment can still give you the list
output that you want, but you can also use XPath/XSLT's sum function on the
node-set equivalent of the fragment. xalan:nodeSet() (or exsl:node-set() if
you're using a more recent snapshot of Xalan) will convert the RTF to a
node-set.
The most portable alternative is to use a recursive template to dissect the
string.
Given XML:
<?xml version="1.0"?>
<some>
<data>1</data>
<data>2</data>
<data>3</data>
<data>5</data>
<data>7</data>
<data>11</data>
</some>
Here's a stylesheet that demonstrates both solutions:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
xmlns:xalan="http://xml.apache.org/xalan"
exclude-result-prefixes="xalan exsl">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:variable name="list">
<xsl:for-each select="some/data">
<dummyElement>
<xsl:value-of select="."/>
</dummyElement>
<xsl:if test="position() != last()">
<comma>,</comma>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:text>The list is: </xsl:text>
<xsl:value-of select="$list"/>
<xsl:text> The sum is: </xsl:text>
<xsl:choose>
<xsl:when test="function-available('exsl:node-set')">
<xsl:value-of select="count(exsl:node-set($list)/dummyElement)"/>
</xsl:when>
<xsl:when test="function-available('xalan:nodeSet')">
<xsl:value-of select="sum(xalan:nodeSet($list)/dummyElement)"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="sum">
<xsl:with-param name="str" select="string($list)"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="sum">
<xsl:param name="str"/>
<xsl:param name="total" select="0"/>
<xsl:choose>
<xsl:when test="contains($str,',')">
<xsl:call-template name="sum">
<xsl:with-param name="str" select="substring-after($str,',')"/>
<xsl:with-param name="total" select="$total + substring-before($str,',')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$total + $str"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
- Mike
____________________________________________________________________________
mike j. brown | xml/xslt: http://skew.org/xml/
denver/boulder, colorado, usa | resume: http://skew.org/~mike/resume/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] how to apply sum to a comma d, Florin Dragu | Thread | Re: [xsl] A better way to build a c, John Sands |
| RE: [xsl] reposting.extension libra, David Nelson | Date | [xsl] Bug in treating an RTF by Sax, Dimitre Novatchev |
| Month |