合并具有相同路径的两个xml节点并打印它们的总和

时间:2016-04-07 08:45:01

标签: java xml xslt

我需要有关xmls的逻辑之一的帮助。我有四个节点如下:

<Root>
<Element>
<ElementId>Fruits</ElementId>
<ElementDes>Apple</ElementDes>
<ElementValue>100</ElementValue>
</Element>
<Element>
<ElementId>Fruits</ElementId>
<ElementDes>Mango</ElementDes>
<ElementValue>200</ElementValue>
</Element>
<ElementId>Vegetables</ElementId>
<ElementDes>Potato</ElementDes>
<ElementValue>300</ElementValue>
</Element>
<Element>
<ElementId>Vegetables</ElementId>
<ElementDes>Brinjal</ElementDes>
<ElementValue>400</ElementValue>
</Element>
</Root>

我需要输出如下:(相同类型的元素ID的总和):

<Root>
<Element>
<ElementId>Fruits</ElementId>
<ElementDes>AppleMango</ElementDes>
<ElementValue>300</ElementValue>
</Element>
<ElementId>Vegetables</ElementId>
<ElementDes>PotatoBrinjal</ElementDes>
<ElementValue>700</ElementValue>
</Element>
</Root>

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

假设您的输入数据是有效的XML(您的示例不是),这将产生预期的结果:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output indent="yes"/>

   <xsl:template match="Root">
      <xsl:copy>
         <xsl:for-each-group select="Element" group-by="ElementId">
            <Element>
               <xsl:apply-templates select="@* | ElementId"/>
               <ElementDes><xsl:value-of select="current-group()/ElementDes" separator=""/></ElementDes>
               <ElementValue><xsl:value-of select="sum(current-group()/ElementValue)"/></ElementValue>
            </Element>
         </xsl:for-each-group>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="@* | node()">
      <xsl:copy>
         <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>