Группировка и ограничение размера элемента группы в 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.
Пожалуйста, предложите решение