Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 对于具有不同节点名称的XSLT 1.0,求和中的每个值_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

Xml 对于具有不同节点名称的XSLT 1.0,求和中的每个值

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<

您能否帮助我使用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</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>