Xml 对于具有不同节点名称的XSLT 1.0,求和中的每个值
您能否帮助我使用XSLT1.0对每个值求和。其中包含不同的节点名称 我有一个XML:Xml 对于具有不同节点名称的XSLT 1.0,求和中的每个值,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,您能否帮助我使用XSLT1.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<
<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"?>
返回的输出如下所示:
<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>
我不需要多个求和行,而只需要一行包含所有值的总和。例如,对于AAA,它将是:3965.48等等。正如您所看到的,您不能遍历所有节点,因为它们具有不同的节点名称:NUM-****,这仅对名称和值是唯一的。我更愿意分两步来完成这一操作:首先,为每对名称和编号创建一个节点,这样我们就有了类似于:
<amount name="AAA" value="3755.45"/>
<amount name="BBB" value="817633.21"/>
<amount name="AAA" value="200.03"/>
<amount name="CCC" value="20"/>
<amount name="BBB" value="13072806.23"/>
<amount name="AAA" value="10"/>
下一步是应用于结果
XSLT1.0
适用于格式良好的应用程序!输入示例:
XML
这将产生:
结果
它们总是成对出现,名称后面跟数字吗?嘿,Michael,是的,它们总是成对出现。您的XML格式不正确:开始标记的字符数少于结束标记的字符数。不匹配等等。
<amount name="AAA" value="3755.45"/>
<amount name="BBB" value="817633.21"/>
<amount name="AAA" value="200.03"/>
<amount name="CCC" value="20"/>
<amount name="BBB" value="13072806.23"/>
<amount name="AAA" value="10"/>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="amt-by-name" match="amount" use="@name" />
<xsl:template match="/root">
<!-- FIRST PASS -->
<xsl:variable name="amounts">
<xsl:for-each select="object/*[position() mod 2 = 1]">
<amount name="{.}" value="{following-sibling::*}"/>
</xsl:for-each>
</xsl:variable>
<!-- OUTPUT -->
<output>
<!-- FOR EACH DISTINCT NAME -->
<xsl:for-each select="exsl:node-set($amounts)/amount[count(. | key('amt-by-name', @name)[1]) = 1]">
<!-- SUM CURENT GROUP -->
<sum name="{@name}" value="{sum(key('amt-by-name', @name)/@value)}"/>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
<root>
<object>
<NUM-1054>AAA</NUM-1054>
<NUM-1054>3755.45</NUM-1054>
<NUM-601>BBB</NUM-601>
<NUM-601>817633.21</NUM-601>
<NUM-1072>AAA</NUM-1072>
<NUM-1072>200.03</NUM-1072>
<NUM-11072>CCC</NUM-11072>
<NUM-11072>20</NUM-11072>
<NUM-900>BBB</NUM-900>
<NUM-900>13072806.23</NUM-900>
<NUM-11074>AAA</NUM-11074>
<NUM-11074>10</NUM-11074>
</object>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<output>
<sum name="AAA" value="3965.48"/>
<sum name="BBB" value="13890439.44"/>
<sum name="CCC" value="20"/>
</output>