Вы можете сохранить результат первого вычисления в переменной, а затем суммировать значения из переменной (и вывести их:
<xsl:template match="/">
<xsl:variable name="counts" as="element(count)*">
<xsl:for-each select="/foo/bar/AAA[Owned = 1]">
<xsl:variable name="vOP" select="Instancing"/>
<xsl:for-each select="/foo/bar/BBB[Owned = $vOP]">
<xsl:variable name="vTO" select="Instancing"/>
<xsl:for-each select="/foo/bar/CCC[Owned = $vTO]">
<xsl:variable name="vIE" select="Instancing"/>
<count>
<xsl:value-of select="count(/foo/buzz/DDD[Owned = $vIE])"/>
</count>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$counts/concat('COUNT:', .), concat('SUM:', sum($counts))" separator=","/>
</xsl:template>
Что касается работы с более компактным кодом, вы можете использовать ключиследовать перекрестным ссылкам:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:key name="ref" match="bar/*" use="Owned"/>
<xsl:key name="buzz" match="buzz/DDD" use="Owned"/>
<xsl:template match="/">
<xsl:variable name="counts" as="element(count)*">
<xsl:for-each select="key('ref', key('ref', key('ref', '1')/Instancing)/Instancing)">
<count>
<xsl:value-of select="sum(count(key('buzz', Instancing)))"/>
</count>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$counts/concat('COUNT:', .), concat('SUM:', sum($counts))" separator=","/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / nc4NzRs / 4
Я не знаю, насколько переменны ваши входные данные,возможно, вам потребуются разные ключи для разных дочерних элементов bar
, для ваших примеров данных достаточно одного ключа.