count in XSLT, Need Help Please !!!

Here should go questions about transforming XML with XSLT and FOP.
techza
Posts: 9
Joined: Thu Dec 11, 2008 10:15 pm

count in XSLT, Need Help Please !!!

Post by techza »

Hi,
I am creating a report using a xml (Input File(Source).
In the xml I have Parents Source , Then I have ID, S_ID, Name , Discription, DATE, TIME and STATUS , For Each ID I will be having 96 DATE and TIME, some time I may have 80 or 70 also , But max count will be 96.
I am getting all the column correct in the report, now I am trying to get a new column TOTAL COUNT ( which count all the Date / Time / Status, STATUS value will be "1" by default. If I sum the STATUS.

Below is the XSLT iam trying to right , but If I use count it is displaying 2796 in each, I didn't put the whole xml here I just added 4 - 5 count here as an example.
why I am getting 2796 ( becuase I pulled 1 month i data means 31 days each day will have 96 S_ID , DATE, TIME, STATUS) so the XSLT is count 96 * 31 and displaying 2796 in each row.
The ID is also unique for 96 Measure

MY XML :
<?xml version="1.0" encoding="UTF-8"?>
<envelope>
<sources>
<source>
<data>
<xml_transfer xmlns="" version="V1.2">
<REPORT>
<EM_ESOURCE>
<MEASURE>
<ID>1403157</ID>
<S_ID>1017502</S_ID>
<AMOUNT>13.446961</AMOUNT>
<DATE>2007-01-01</START_DATE>
<TIME>05:44:00</START_TIME>
<STATUS>1</STATUS>
<MATERIAL_TEXT>
<NAME>BBB</NAME>
</MATERIAL_TEXT>
</MEASURE>
<MEASURE>
<ID>1403158</ID>
<S_ID>1017502</S_ID>
<AMOUNT>13.211704</AMOUNT>
<DATE>2007-01-01</DATE>
<TIME>05:59:00</TIME>
<STATUS>1</STATUS>
<MATERIAL_TEXT>
<NAME>ABC</NAME>
</MATERIAL_TEXT>
</MEASURE>
<MEASURE>
<ID>1403159</ID>
<S_ID>1017502</S_ID>
<AMOUNT>13.432246</AMOUNT>
<DATE>2007-01-01</DATE>
<TIME>06:14:00</TIME>
<STATUS>1</STATUS>
<MATERIAL_TEXT>
<NAME>JJJ</NAME>
</MATERIAL_TEXT>
</MEASURE>
<MEASURE>
<ID>1403160</ID>
<S_ID>1017502</S_ID>
<AMOUNT>13.805982</AMOUNT>
<DATE>2007-01-01</DATE>
<TIME>06:29:00</TIME>
<STATUS>1</STATUS>
<MATERIAL_TEXT>
<NAME>KKK</NAME>
<MATERIAL_TEXT>
</MEASURE>

.***********<96 MEASURE> element*********
<MEASURE>
<ID>1403160</ID>
<S_ID>1017502</S_ID>
<AMOUNT>13.805982</AMOUNT>
<DATE>2007-01-02</DATE>
<TIME>06:29:00</TIME>
<STATUS>1</STATUS>
<MATERIAL_TEXT>
<NAME>KKK</NAME>
<MATERIAL_TEXT>
</MEASURE>
*********************************
( 96 <MEASURE>)
**********
MY XSLT :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="text()|@*"/>
<xsl:key name="fact" match="MEASURE" use="concat(S_ID, ' ', DATE)"/>
<xsl:template match="//rep:envelope/rep:sources/rep:source/rep:data/xml_transfer/REPORT">
<HTML>
<!-- Headers -->
<table><tr><td align="left" colspan="7"><font size="5"><b><i><u>My Report</u></i></b></font></td></tr> <!-- Report title -->
<tr><td/></tr></table>
<table><tr><td/></tr></table>

<table border="1"> <!-- Headers -->
<tr>
<th colspan="7">Parent Facility</th>
<th>NAME</th>
<th>DESCRIPTION</th>
<th>TYPE</th>
<th>IDENTIFIER</th>
<th>PARAMETER</th>
<th>DATE</th>
<th>TOTAL COUNT</th>
</tr>
</table>
<xsl:for-each select="ESOURCE">
<table border="1"><tr>
<td><xsl:value-of select="descendant::ESOURCE_TEXT[last()]/NAME"/></td>
<td><xsl:value-of select="descendant::ESOURCE_TEXT[last() - 1]/NAME"/></td>
<td><xsl:value-of select="descendant::ESOURCE_TEXT[last() - 2]/NAME"/></td>
<td><xsl:value-of select="descendant::ESOURCE_TEXT[last() - 3]/NAME"/></td>
<td><xsl:value-of select="descendant::ESOURCE_TEXT[last() - 4]/NAME"/></td>
<td><xsl:value-of select="descendant::ESOURCE_TEXT[last() - 5]/NAME"/></td>
<td><xsl:value-of select="descendant::ESOURCE_TEXT[last() - 6]/NAME"/></td>
<td><xsl:value-of select="ESOURCE_TEXT/NAME"/></td>
<td><xsl:value-of select="ESOURCE_TEXT/DESCRIPTION"/></td>
<td><table><xsl:for-each select="MEASURE[count(. | key('fact', concat(S_ID, ' ', MAT_ID, ' ', DATE))[1]) = 1]">
<xsl:sort select="MATERIAL_TEXT/NAME"/>
<xsl:sort select="DATE"/>
<tr>
<td><xsl:value-of select="MATERIAL_TEXT/NAME"/></td>
<td><xsl:value-of select="START_DATE"/></td>
<td><xsl:value-of select="count(//STATUS[.=current()/STATUS])"/></td>
</tr>
</xsl:for-each></table></td>
</tr></table>
</xsl:for-each>
</HTML>
</xsl:template>
</xsl:stylesheet>
george
Site Admin
Posts: 2095
Joined: Thu Jan 09, 2003 2:58 pm

Re: count in XSLT, Need Help Please !!!

Post by george »

Both the instance and the stylesheet are invalid. Please try posting correct samples and simplified as much as possible to show where you have difficulties.

Regards,
George
George Cristian Bina
jkmyoung
Posts: 89
Joined: Mon Mar 06, 2006 10:13 pm

Re: count in XSLT, Need Help Please !!!

Post by jkmyoung »

My guess. Change:
<td><xsl:value-of select="count(//STATUS[.=current()/STATUS])"/></td>
to
<td><xsl:value-of select="count(.//STATUS[.=current()/STATUS])"/></td>
Post Reply