Как я уже предлагал в комментарии, это похоже на случай учебника для использования новой функции XSLT 3 for-each-group group-by composite="yes"
, то есть для использования последовательности элементов, которые вы хотите использовать в качестве ключей группировки для group-by
выражение и указать composite="yes"
, что все они образуют составной ключ для группировки элементов.
Итак, для вашего примера с кодом XSLT 3
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Records">
<xsl:copy>
<xsl:for-each-group select="Record" group-by="*[position() le 8]" composite="yes">
<xsl:copy>
<xsl:apply-templates select="* except (UD7, AMOUNT)"/>
<DeferredIncome>{ sum(current-group()[UD7 = 'DeferredIncome']/AMOUNT) }</DeferredIncome>
<OutsBalance>{ sum(current-group()[UD7 = ('OtsBalance', 'OutsBalance')]/AMOUNT) }</OutsBalance>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
который на https://xsltfiddle.liberty -development.net / bdxtqC выводит
<?xml version="1.0" encoding="UTF-8"?>
<Records>
<Record>
<ACCOUNT>460029</ACCOUNT>
<ENTITY>1851</ENTITY>
<UD1>FY17</UD1>
<UD2>457001</UD2>
<UD3>116029</UD3>
<UD4>0</UD4>
<UD5>458004</UD5>
<UD6>Dec</UD6>
<DeferredIncome>0</DeferredIncome>
<OutsBalance>3400</OutsBalance>
</Record>
<Record>
<ACCOUNT>460029</ACCOUNT>
<ENTITY>1851</ENTITY>
<UD1>FY17</UD1>
<UD2>457002</UD2>
<UD3>116029</UD3>
<UD4>0</UD4>
<UD5>458008</UD5>
<UD6>Jan</UD6>
<DeferredIncome>20</DeferredIncome>
<OutsBalance>0</OutsBalance>
</Record>
</Records>
Я не уверен, была ли необходима проверка UD7 = ('OtsBalance', 'OutsBalance')
из-за опечаток в ваших выборочных данных или в ваших реальных данных, потому что они содержат различные варианты написания значения этого элемента.