Можете ли вы помочь мне суммировать значения для каждого с помощью XSLT 1.0.Который содержит разные имена узлов.
У меня есть XML:
<root>
<object>
<NUM-105>AAA</NUM-105>
<NUM-105>3755.45</NUM-105>
<NUM-60>BBB</NUM-60>
<NUM-60>817633.21</NUM-60>
<NUM-107>AAA</NUM-107>
<NUM-107>200.03</NUM-107>
<NUM-1107>CCC</NUM-1107>
<NUM-1107>20</NUM-1107>
<NUM-90>BBB</NUM-90>
<NUM-90>13072806.23</NUM-90>
<NUM-1107>AAA</NUM-1107>
<NUM-1107>10</NUM-1107>
</object>
</root>
И сейчас мой XSL выглядит так:
<?xml version="1.0"?>
<xsl:template match="root/object/*[starts-with(name(),'NUM-')]">
<xsl:if test="not(number(text())) and text() != '0'">
<xsl:variable name="numNumber">
<xsl:value-of select="substring-after(name(),'NUM-')"/>
</xsl:variable>
<xsl:variable name="numName">
<xsl:value-of select="text()"/>
</xsl:variable>
<xsl:if test="not(preceding-sibling::*[starts-with(name(),'NUM-')]/text() = $numName)">
<output name="{$numName}" id="{$numNumber}">
<xsl:for-each select="ancestor::root/object/*[text() = $numName]">
<xsl:variable name="sum">
<xsl:value-of select="number(following-sibling::node()/text())"/>
</xsl:variable>
<sum value="{$sum}"/>
</xsl:for-each>
</output>
</xsl:if>
</xsl:if>
</xsl:template>
Что возвращает OUTPUT следующим образом:
<output name="AAA" id="105">
<sum value="3755.45"/>
<sum value="200.03"/>
<sum value="10"/>
</output>
<output name="BBB" id="105">
<sum value="817633.21"/>
<sum value="13072806.23"/>
</output>
<output name="CCC" id="105">
<sum value="20"/>
</output>
Вместо того, чтобы иметь несколько строк "sum", мне нужна только одна строка с суммой всех значений.Так, например, для «AAA» это будет: 3965.48 и т. Д. Как видите, вы не можете пройти через все узлы, потому что у них разные имена узлов (): NUM - ****, который уникален только дляимя и значение.