2016-07-08 14 views
0

Ich habe eine Beispiel-XML-Nachricht, die mehrere Elternknoten enthält. Die Anforderung besteht darin, dass der untergeordnete Knoten zusammengeführt wird, wenn die beiden übergeordneten Knoten identisch sind.Übereinstimmung und Zusammenführung in XSLT 1.0

Probeneingangsmeldung ist

<document> 
<party> 
    <gtin>1000909090</gtin> 
    <pos> 
     <attrGroupMany name="temperatureInformation"> 
      <row> 
       <attr name="temperatureCode">STORAGE</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value> 
        <value qual="CC">20</value> 
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE1</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE2</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">STORAGE</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value> 
        <value qual="CC">20</value> 
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE3</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE4</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value>      
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE5</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE6</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE7</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE8</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
     </attrGroupMany> 
    </pos> 
</party> 
</document> 

wir den Wert von temperatureCode, Alle Werten der Temperatur (falls vorhanden) für alle Zeilen verketten müssen und wenn sie doppelte sind, dann die Zeile innerhalb temperatureStats des Kindes fusionieren im Elternteil.

Die erwartete Ausgabe hat die gleiche Struktur. Sie können der zweite Knoten sehen mit ersten

fusionierte
<document> 
<party> 
    <gtin>1000909090</gtin> 
    <pos> 
     <attrGroupMany name="temperatureInformation"> 
      <row> 
       <attr name="temperatureCode">STORAGE</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value> 
        <value qual="CC">20</value> 
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE1</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE2</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE3</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE4</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value>      
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE5</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE6</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE7</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE8</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
     </attrGroupMany> 
    </pos> 
</party> 
</document> 

Jede Eingabe sehr wertvoll sein wird.

+0

Ist die Gruppierung anders als bei früheren Fragen? Wenn Sie einige Elemente zusammenführen und die Münchische Gruppierung mit einem Schlüssel verwenden wollen, dann gibt 'key ('Schlüsselname', someKeyValueExpression)/attrGroupMany [@name = 'temperatureStats']/row 'alle gewünschten' row' Elemente verschmelzen. Die Verwendung eines Schlüssels zur Gruppierung scheint in vorherigen Fragen beantwortet zu sein. –

+0

Wie man auf optionale Knoten achtet und wie kann ich das gesamte XML in der Ausgabe drucken. Gibt es einen Kopierbefehl, den ich benutzen kann? Wenn Sie Hilfe bei der Bereitstellung von Beispiel-XSLT bieten, wäre großartig. – Victor

Antwort

1

Ich glaube, du hast eine Lösung für Gruppe in einer früheren Antwort https://stackoverflow.com/a/38240246/252228, können Sie dann bearbeiten die Elemente in einer Gruppe, die die Schlüsselfunktion aufrufen:

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

    <xsl:output indent="yes"/> 


    <xsl:key name="group" match="attrGroupMany[@name = 'temperatureInformation']/row" 
     use="concat(attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])"/> 

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

    <xsl:template match="attrGroupMany[@name = 'temperatureInformation']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="row[generate-id() = generate-id(key('group', concat(attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature']))[1])]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="attrGroupMany[@name = 'temperatureStats']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | key('group', concat(../attr[@name = 'temperatureCode'], '|', ../attrQualMany[@name = 'temperature']))/attrGroupMany[@name = 'temperatureStats']/row"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

ist jedoch zu beachten, dass der gesamte Ansatz den String-Wert des Nehmens eines Elements mit unterschiedlichen Kindelementen ist brüchig, bei einem Unterschied im Leerraum kann der Wert als unterschiedlich angesehen werden.

+0

Es funktioniert. Vielen Dank. Dieses Problem ist Teil eines größeren Problems, an dem ich versuche zu arbeiten. Dieses Beispiel wird sicher helfen. – Victor

+0

Martin. Brauchen Sie Ihre Hilfe für eine andere Frage. Können Sie bitte helfen Danke http://stackoverflow.com/questions/38993864/match-and-merge-in-xslt-with-optional-nodes – Victor

Verwandte Themen