I have XML which is huge with more than 50,000
<Line xmlns="">
tags. I need to group them by
<line_type>
and then by
<linegroup_number>
but limit number of <grpitem> to 3000 under each
<line_type>
. Also need to ensure, if
<linegroup_number>
has more than 3000, they should come under single
<Line xmlns="">
Example shown below I tried to show with group limit to 2 instead of 3000.
you will see,
<linegroup_number>63306</linegroup_number>
has 3 lines so they all are under single
<Line xmlns="">
if
<line_type>
has more than one
<linegroup_number>
, they should come under same
<Line xmlns="">
as long as number of
<GrpItem>
are less then defiend group limit. In this case 2 (in real world 3000)
Sample XML
<Lines xmlns="http://mynamespace">
<Line xmlns="">
<line_type>PA</line_type>
<line_number>00080</line_number>
<linegroup_number>48611</linegroup_number>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<line_number>00080</line_number>
<linegroup_number>62877</linegroup_number>
</Line>
<Line xmlns="">
<line_type>PA</line_type>
<line_number>00080</line_number>
<linegroup_number>62877</linegroup_number>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<line_number>00080</line_number>
<linegroup_number>65151</linegroup_number>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<line_number>00080</line_number>
<linegroup_number>62877</linegroup_number>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<line_number>00080</line_number>
<linegroup_number>63063</linegroup_number>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<line_number>00080</line_number>
<linegroup_number>63063</linegroup_number>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<line_number>00082</line_number>
<linegroup_number>63306</linegroup_number>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<line_number>00082</line_number>
<linegroup_number>63306</linegroup_number>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<line_number>00082</line_number>
<linegroup_number>63306</linegroup_number>
</Line>
</Lines>
Expected result:
<Lines xmlns="http://mynamespace">
<Line xmlns="">
<line_type>PA</line_type>
<GrpItem>
<line_number>00080</line_number>
<linegroup_number>48611</linegroup_number>
</GrpItem>
<GrpItem>
<line_number>00080</line_number>
<linegroup_number>62877</linegroup_number>
</GrpItem>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<GrpItem>
<line_number>00080</line_number>
<linegroup_number>62877</linegroup_number>
</GrpItem>
<GrpItem>
<line_number>00080</line_number>
<linegroup_number>65151</linegroup_number>
</GrpItem>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<GrpItem>
<line_number>00080</line_number>
<linegroup_number>62877</linegroup_number>
</GrpItem>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<GrpItem>
<line_number>00080</line_number>
<linegroup_number>63063</linegroup_number>
</GrpItem>
<GrpItem>
<line_number>00080</line_number>
<linegroup_number>63063</linegroup_number>
</GrpItem>
</Line>
<Line xmlns="">
<line_type>TC</line_type>
<GrpItem>
<line_number>00082</line_number>
<linegroup_number>63306</linegroup_number>
</GrpItem>
<GrpItem>
<line_number>00082</line_number>
<linegroup_number>63306</linegroup_number>
</GrpItem>
<GrpItem>
<line_number>00082</line_number>
<linegroup_number>63306</linegroup_number>
</GrpItem>
</Line>
</Lines>
What I have tried:
I tried using recursive
<xsl:call-template
. It worked for me but for smaller file with records under 1000. Anything above that, XSLT compiler throwing stack overflow error. I tried with multiple call -template as well as
<xsl:for-each>
loop. I could get it working to certain point not able to track when limit reaches to 3000. I am trying to avoid recursive call so not to get stackOver flow error.
Please suggest a solution