Не ясно, нужно ли вам группировать (потому что внутри division
есть дублирующие элементы division
и / или дубликаты subdivision
), если у вас нет дубликатов, которые вы можете использовать (XQuery 3.1)
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method 'text';
declare option output:item-separator ' ';
for $d in divisions/division,
$sd in $d/subdivisions/subdivision
return $d/divisionName/data() || ' ' || $sd/subdivisionName/data() || ' ' || sum($sd/values/value)
https://xqueryfiddle.liberty -development.net / bFukv8j
Если вам нужно сгруппировать, тогда XQuery в виде group-by
, например,
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method 'text';
declare option output:item-separator ' ';
for $d in divisions/division
group by $dn := $d/divisionName
for $sd in $d/subdivisions/subdivision
group by $dn, $sdn := $sd/subdivisionName
return $dn || ' ' || $sdn || ' ' || sum($sd/values/value)
https://xqueryfiddle.liberty -development.net / bFukv8j / 2
Что касается производительности, вам может потребоваться проверка с выбранным вами процессором XQuery, в базе данных XQuery это в любом случае зависит от организации базы данных и индексов, я думаю.
XSLT 3 имеет потоковую обработку, но поскольку у ваших элементов есть ключи группировки в дочерних элементах, вам необходимо скопировать элементы:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode streamable="yes"/>
<xsl:output method="text" />
<xsl:template match="divisions">
<xsl:for-each-group select="division!copy-of()!subdivisions/subdivision" composite="yes" group-by="ancestor::division/divisionName, subdivisionName">
<xsl:value-of select="current-grouping-key(), sum(current-group()/values/value)" separator=" "/>
<xsl:text> </xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / gWvjQeJ