2016-04-07 2 views
-3

Ich brauche Hilfe in Bezug auf eine der Logik zu Xmls. Ich habe vier Knoten wie folgt:Mischen von zwei XML-Knoten mit dem gleichen Pfad und Drucken ihrer Summe

<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> 

Ich brauche Ausgabe wie folgt: (Summe aus der gleichen Art von Element Ids):

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

Kann jemand bitte mir dabei helfen?

+0

Es gibt mit XML in Java eine Menge von Rahmenbedingungen für die Arbeit. Zum Beispiel: https://docs.oracle.com/javase/tutorial/jaxp/stax/index.html – mrbela

+0

Siehe https://www.w3.org/TR/xslt20/#grouping-examples für einen XSLT 2.0-Ansatz. Sie können XSLT 2.0 mit Java mit Saxon 9 verwenden. –

+0

Nun, die Tags bereits vorschlagen, dass er XSLT @mrbela verwendet :-) – Vampire

Antwort

1

Angenommen, Ihre Eingangsdaten gültige XML sein würden (Ihr Beispiel ist nicht), würde dies produziert das erwartete Ergebnis:

<?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> 
+0

Vielen Dank für die Antwort wird ausprobieren! :) –

Verwandte Themen