Один подход XSLT 1 для этого - так называемая рекурсия брата, где вы обрабатываете первый Item
, а затем рекурсивно следующий following-sibling::Item[1]
:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="*/Item[1]"/>
</xsl:template>
<xsl:template match="Item">
<xsl:param name="sum" select="0"/>
<xsl:variable name="next" select="following-sibling::Item[1]"/>
<xsl:choose>
<xsl:when test="$next/Code = Code">
<xsl:apply-templates select="$next">
<xsl:with-param name="sum" select="$sum + Value"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(Code, $sum + Value, '-')"/>
<xsl:apply-templates select="$next"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / bdxtr6
Здесь показан подход в целом, чтобы избежать трейлинга -
после последнего значения, вам нужно вставить дополнительную проверку или сохранить результат в переменной и извлечь substring($var, 1, string-length($var) - 1)
.