Я бы настоятельно рекомендовал сделать такую вещь как двухфазное преобразование. Сначала преобразуйте входной XML в нечто большее в духе XML:
<reports>
<report>
<OPTYPE>EI</OPTYPE>
<REPORT_NUM>1</REPORT_NUM>
<REPORT_NAME>...</REPORT_NAME>
<CREATION_DATE>2017-01-31</CREATION_DATE>
...
</report>
<report>
...
</report>
</reports>
, а затем выполнить конкретное преобразование, включающее группировку и т. Д.
Этот конвейерный подход приводит к тому, что код становится проще и более пригоден для повторного использования. Вы обнаружите, что первый этап можно использовать независимо от того, какую обработку вы выполняете на втором этапе, поэтому все ваши манипуляции с этим типом документа XML станут проще.
Я не пытался понять обработку, которую вы на самом деле делаете, но я вижу, что логика сильно усложняется из-за неудобного формата ввода, и я уверен, что все станет намного проще, если вы отсортируете это в первую очередь.
Существует множество способов организации конвейера преобразований в XSLT. Вы можете сделать это в одной таблице стилей, записав результат первой фазы в переменную, а затем используя эту переменную в качестве входных данных для второй фазы; или вы можете использовать несколько таблиц стилей, соединенных вместе, используя различные технологии, включая XProc, Java-программы, Ant-сценарии, сценарии оболочки или любое количество основанных на XSLT каркасов приложений.