Need help in counting

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

Need help in counting

Post by techza »

I have XML below, FOR EACH <ES_ID> I will have multiple <ID> in <EM_ES_MEASURE>

I want to count that ID's. I can also use STATUS, START_DATE, the counting will be same for these elemnts also.

I am using : <td><table><xsl:for-each select="EM_ES_MEASURE[count(. | key('mea-fact', concat(ES_ID, ' ', MAT_ID, ' ', START_DATE))[1]) = 1]">



<xsl:sort select="EM_MATERIAL_TEXT/NAME"/>
<xsl:sort select="START_DATE"/>
<tr>
<td name="Mea Material" align="center"><xsl:value-of select="EM_MATERIAL_TEXT/NAME"/></td>
<td name="Mea Date" align="center"><xsl:value-of select="START_DATE"/></td>

<td name="Mea Daily Ave" align="center"><xsl:value-of select="sum(../EM_ES_MEASURE[ES_ID = current()/ES_ID and START_DATE = current()/START_DATE and MAT_ID = current()/MAT_ID]/MES_AMOUNT) div count(../EM_ES_MEASURE[ES_ID = current()/ES_ID and START_DATE = current()/START_DATE and MAT_ID = current()/MAT_ID])"/></td>
<td name="Mea Unit" align="center"><xsl:value-of select="EM_UNIT/CODE"/></td>
<td><table>
<xsl:for-each select="EM_ESOURCE/EM_ES_MEASURE">
<td><xsl:value-of select="sum(./STATUS)"/></td>
</xsl:for-each></table>
</td>

How do I do that.

In the outpur file I am getting '0' If I use count, If I sum STATUS I am getting a huge total.

<EM_ES_MEASURE>
<ID>1401546</ID> <ES_ID>1017502</ES_ID> <MES_AMOUNT>13.515278</MES_AMOUNT>
<UNIT>1006561</UNIT>
<START_DATE>2007-01-14</START_DATE>
<STATUS>1</STATUS>
</EM_ES_MEASURE>
<EM_ES_MEASURE>
<ID>1401547</ID>
<ES_ID>1017502</ES_ID>
<MES_AMOUNT>13.546702</MES_AMOUNT>
<UNIT>1006561</UNIT>
<START_DATE>2007-01-14</START_DATE>
<STATUS>1</STATUS>
</EM_MATERIAL_TEXT>
george
Site Admin
Posts: 2095
Joined: Thu Jan 09, 2003 2:58 pm

Re: Need help in counting

Post by george »

I tried to look into this but is hard to figure out anything. Try posting a simplified, complete working sample that contains your input, stylesheet, actual output and expected output.
XSLT 2.0 offers you better support for grouping. For example, in case that helps, if you have an input like:

Code: Select all


<test>
<EM_ES_MEASURE>
<ID>1401546</ID>
<ES_ID>1017502</ES_ID>
<MES_AMOUNT>13.515278</MES_AMOUNT>
<UNIT>1006561</UNIT>
<START_DATE>2007-01-14</START_DATE>
<STATUS>1</STATUS>
</EM_ES_MEASURE>
<EM_ES_MEASURE>
<ID>1401547</ID>
<ES_ID>1017502</ES_ID>
<MES_AMOUNT>13.546702</MES_AMOUNT>
<UNIT>1006561</UNIT>
<START_DATE>2007-01-14</START_DATE>
<STATUS>1</STATUS>
<EM_MATERIAL_TEXT/>
</EM_ES_MEASURE>
</test>
then a stylesheet like below:

Code: Select all


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
<result>
<xsl:for-each-group select="//EM_ES_MEASURE" group-by="ES_ID">
<entry>
<count><xsl:value-of select="count(current-group())"/></count>
<ED_ID><xsl:value-of select="current-grouping-key()"/></ED_ID>
</entry>
</xsl:for-each-group>
</result>
</xsl:template>
</xsl:stylesheet>
will give you as output

Code: Select all


<?xml version="1.0" encoding="UTF-8"?>
<result>
<entry>
<count>2</count>
<ED_ID>1017502</ED_ID>
</entry>
</result>
Regards,
George
George Cristian Bina
Post Reply