Member 13113934 Ответов: 0

Группировка и ограничение размера элемента группы в XSLT 1.0


У меня есть XML который огромен с более чем 50 000
<Line xmlns="">
теги. Мне нужно сгруппировать их по
<line_type>
а затем
<linegroup_number>
но ограничьте количество & lt;grpitem> до 3000 под каждым
<line_type>
. Также нужно обеспечить, если
<linegroup_number>
имеет более 3000, они должны подпадать под однократное
<Line xmlns="">

Пример, показанный ниже, я попытался показать с ограничением группы до 2 вместо 3000.

вы увидите,
<linegroup_number>63306</linegroup_number>
имеет 3 линии, так что все они находятся под одной
<Line xmlns="">


если
<line_type>
имеет более одного
<linegroup_number>
, они должны подпадать под то же самое
<Line xmlns="">
до тех пор, пока количество
<GrpItem>
меньше, чем defiend group limit. В этом случае 2 (в реальном мире 3000)

Пример 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>


Ожидаемый результат:
<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>


Что я уже пробовал:

Я попробовал использовать рекурсивный метод
<xsl:call-template
. Это сработало для меня, но для меньшего файла с записями менее 1000. Все, что выше этого, XSLT-компилятор выдает ошибку переполнения стека. Я пробовал использовать несколько шаблонов вызовов, а также
<xsl:for-each>
петля. Я мог бы заставить его работать до определенного момента, когда он не сможет отследить, когда предел достигнет 3000. Я пытаюсь избежать рекурсивного вызова, чтобы не получить ошибку stackover flow.

Пожалуйста, предложите решение

0 Ответов