Click here to Skip to main content
15,887,283 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
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
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900