Hi I want to do some aggregation within the XSLT. For example I have the following xml file.
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<reporting:root xmlns:reporting="testing">
<reporting:default0 reporting:type="Portfolio">
<reporting:window reporting:Id="1" reporting:level="0" reporting:name="TEST" reporting:parentId="-1">
<reporting:folio reporting:Id="2" reporting:criteria="0" reporting:level="1" reporting:name="topfolder1" reporting:parentId="1">
<reporting:folio reporting:Id="37" reporting:criteria="0" reporting:level="2" reporting:name="folder2" reporting:parentId="2">
<reporting:folio reporting:Id="38" reporting:criteria="0" reporting:level="3" reporting:name="folder3" reporting:parentId="37">
<reporting:folio reporting:Id="196" reporting:criteria="0" reporting:level="4" reporting:name="folder4" reporting:parentId="38">
<reporting:line reporting:Id="123456" reporting:level="5" reporting:name="element1" reporting:parentId="196" reporting:positionType="0">
<reporting:reference>element1</reporting:reference>
<reporting:number>625</reporting:number>
</reporting:line>
<reporting:line reporting:Id="223456" reporting:level="5" reporting:name="element2" reporting:parentId="196" reporting:positionType="7">
<reporting:reference>element2</reporting:reference>
<reporting:number>475</reporting:number>
</reporting:line>
<reporting:folio reporting:Id="209" reporting:criteria="0" reporting:level="5" reporting:name="delta" reporting:parentId="196">
<reporting:line reporting:Id="223456" reporting:level="6" reporting:name="element2" reporting:parentId="209" reporting:positionType="0">
<reporting:reference>element2</reporting:reference>
<reporting:number>190</reporting:number>
</reporting:line>
</reporting:folio>
</reporting:folio>
</reporting:folio>
</reporting:folio>
</reporting:folio>
<reporting:folio reporting:Id="4" reporting:criteria="0" reporting:level="1" reporting:name="topfolder2" reporting:parentId="1">
<reporting:folio reporting:Id="39" reporting:criteria="0" reporting:level="2" reporting:name="folder24" reporting:parentId="4">
<reporting:folio reporting:Id="40" reporting:criteria="0" reporting:level="3" reporting:name="folder34" reporting:parentId="39">
<reporting:folio reporting:Id="296" reporting:criteria="0" reporting:level="4" reporting:name="folder44" reporting:parentId="40">
<reporting:line reporting:Id="123456" reporting:level="5" reporting:name="element3" reporting:parentId="296" reporting:positionType="0">
<reporting:reference>element3</reporting:reference>
<reporting:number>65525</reporting:number>
</reporting:line>
<reporting:folio reporting:Id="309" reporting:criteria="0" reporting:level="5" reporting:name="delta" reporting:parentId="296">
<reporting:line reporting:Id="2234567" reporting:level="6" reporting:name="element4" reporting:parentId="309" reporting:positionType="0">
<reporting:reference>element4</reporting:reference>
<reporting:number>490</reporting:number>
</reporting:line>
</reporting:folio>
</reporting:folio>
</reporting:folio>
</reporting:folio>
</reporting:folio>
</reporting:window>
</reporting:default0>
</reporting:root>
then I want to do some aggregation on ‘level 2’. i.e anything inside ‘reporting:line’ should be returned and it’s level 1 and level 2 parent ‘reporting:folio’ should also be returned. Also for the same element under anysubfolder of level2 folder should be aggregated as one. and the sum(number) is also calculated.
Also the no. of sub folios can be 200 before there is a reporting:line tag.
so for this xml I want the result to be:
topfolder,folder2,element1,625
topfolder,folder2,element2,665
topfolder2,folder24,element3,65525
topfolder2,folder24,element4,490
Hope I explained it correctly. Really appreciate your help.
In this case, you need to do grouping first and then aggregation. You need to group elements by folio level 1, folio level 2, and element name. To do this, you usually use a method of Muenchian grouping.
Firstly, you define a xsl:key which can be used to group all matching elements together
Next, you need to select the first matching element in each group.
Then, it is a “simple” case of summing up all elements that match the look-up key
Putting this altogether gives
When applied to your sample XML, the output is as follows: