XSLT: SUM function how to

Here should go questions about transforming XML with XSLT and FOP.
jamalf
Posts: 3
Joined: Fri Apr 03, 2009 11:41 am

XSLT: SUM function how to

Post by jamalf » Fri Apr 03, 2009 11:55 am

Hi,

who can help me :?

i want to count the position of the td

xml:

Code: Select all

   <table>
<tbody>
<tr>
<td>10</td>
<td>10</td>
</tr>
<tr>
<td>20</td>
<td>1000</td>
</tr>
<tr>
<td>30</td>
<td>10</td>
</tr>
</tbody>
</table>

xslt:

Code: Select all

  <xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="table">
<table border="1">
<tbody>
<xsl:for-each select="tbody/tr">
<tr>
<xsl:apply-templates select="th | td"/>
</tr>
</xsl:for-each>
<xsl:call-template name="columnTotal1"/>
</tbody>
</table>
</xsl:template>
<xsl:template match="th">
<th>
<xsl:value-of select="."/>
</th>
</xsl:template>
<xsl:template match="td">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
<xsl:template name="columnTotal1">
<tr>
<xsl:for-each select="//tr[1]/td">
<td style="bgcolor:orange">
<xsl:value-of select="sum(//tr/td[position])"/>
</td>
</xsl:for-each>
</tr>
</xsl:template>
</xsl:stylesheet>

I need this output

TD1 TD2
10 10
20 1000
30 10
total 60 1020

JohnBampton
Posts: 14
Joined: Tue Feb 10, 2009 1:50 pm

Re: XSLT: SUM function how to

Post by JohnBampton » Fri Apr 03, 2009 1:49 pm

Code: Select all

<xsl:template name="columnTotal1">
<tr>
<xsl:for-each select="//tr[1]/td">
<xsl:variable name="position" select="position()"></xsl:variable>
<td style="bgcolor:orange">
<xsl:value-of select="sum(. + sum(following::tr/td[position() = $position]))"/>
</td>
</xsl:for-each>
</tr>
</xsl:template>
Cheers, John Bampton.

jamalf
Posts: 3
Joined: Fri Apr 03, 2009 11:41 am

Re: XSLT: SUM function how to

Post by jamalf » Fri Apr 03, 2009 2:47 pm

This is great :D Thank you so much John!

Cheers,

jamalf
Posts: 3
Joined: Fri Apr 03, 2009 11:41 am

Re: XSLT: SUM function how to

Post by jamalf » Fri Apr 03, 2009 5:16 pm

It works now in the right way only if there are blank cells, you get a NAN

xml:

Code: Select all

   <table>
<tbody>
<tr>
<td></td>
<td>10</td>
<td>10</td>
</tr>
<tr>
<td>20</td>
<td>1000</td>
<td>1000</td>
</tr>
<tr>
<td>30</td>
<td>10</td>
<td>10</td>
</tr>
</tbody>
</table>
xslt:

Code: Select all

	<xsl:template name="columnTotal">
<tr>
<xsl:for-each select="//tr[1]/td">
<xsl:variable name="position" select="position()"/>
<td bgcolor="Orange">
<xsl:value-of select="sum(. + sum(following::tr/td[position() = $position]))"/>
</td>
</xsl:for-each>
</tr>
</xsl:template>
output:

Code: Select all

<table border="1">
<tbody>
<tr>
<td></td>
<td>10</td>
<td>10</td>
</tr>
<tr>
<td>20</td>
<td>1000</td>
<td>1000</td>
</tr>
<tr>
<td>30</td>
<td>10</td>
<td>10</td>
</tr>
<tr>
<td bgcolor="Orange">NaN</td>
<td bgcolor="Orange">1020</td>
<td bgcolor="Orange">1020</td>
</tr>
</tbody>
</table>

10 10
20 1000 1000
30 10 10
NaN 1020 1020

JohnBampton
Posts: 14
Joined: Tue Feb 10, 2009 1:50 pm

Re: XSLT: SUM function how to

Post by JohnBampton » Sat Apr 04, 2009 2:35 pm

Code: Select all

<xsl:template name="columnTotal1">
<tr>
<xsl:for-each select="//tr[1]/td">
<xsl:variable name="position" select="position()"></xsl:variable>
<td style="bgcolor:orange">
<xsl:value-of select="sum( (if(. = '') then 0 else .)
+ sum(following::tr/td[position() = $position]))"/>
</td>
</xsl:for-each>
</tr>
</xsl:template>

Post Reply