2016-07-11 4 views
0

Ich habe eine Beispielnachricht, in der ich doppelte innerhalb des Parteiblocks entfernen muss.Entfernen Sie doppelte innerhalb Knoten und kopieren Sie komplette XML-Struktur in XSLT

Die Probe Nachricht ist

<document> 
<body> 
    <party> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <gtin>1000909090</gtin> 
        <attr name="temperatureCode">STORAGE</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">STORAGE</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value>      
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 

       </row> 
      </attrGroupMany> 
     </pos> 
    </party>  
    <party> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <gtin>1000909091</gtin> 
        <attr name="temperatureCode">STORAGE1</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">STORAGE1</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value>      
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
       </row> 
      </attrGroupMany> 
     </pos> 

    </party> 
</body> 
</document> 

Die erwartete Ausgabe ist

<document> 
<body> 
    <party> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <gtin>1000909090</gtin> 
        <attr name="temperatureCode">STORAGE</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value>      
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr>       
       </row> 
      </attrGroupMany> 
     </pos> 
    </party>  
    <party> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <gtin>1000909091</gtin> 
        <attr name="temperatureCode">STORAGE1</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value>      
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
       </row> 
      </attrGroupMany> 
     </pos> 

    </party> 
</body> 
</document> 

Wie Sie das Duplikat mit temperatureCode STORAGE und storage1 sehen können entfernt werden.

Ich benutze die unten XSLT. Es entfernt nur das Duplikat vom ersten Knoten der Partei, verarbeitet den zweiten Knoten jedoch nicht vollständig. Die XSLT, die ich verwende ist

<?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:template match="/document/body"> 
    <xsl:element name="body"> 

     <xsl:for-each select="party"> 
      <xsl:element name="party"> 

       <xsl:for-each select="pos"> 

        <xsl:element name="pos"> 

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

       </xsl:for-each> 

      </xsl:element> 

     </xsl:for-each> 
    </xsl:element> 
</xsl:template> 

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

Bitte lassen Sie mich wissen, wo ich in XSLT

+0

Bitte wählen Sie entweder XSLT 1.0 oder 2.0 - nicht beides. –

Antwort

1

Anpassung der Code nicht korrekt werde von Ihnen https://stackoverflow.com/a/38265314/252228

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:key name="group" match="party/pos/attrGroupMany[@name = 'temperatureInformation']/row" 
     use="concat(generate-id(ancestor::pos), '|', 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(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature']))[1])]"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

versuchen können, wie Sie zu wollen scheinen Ignoriere die <gtin>1000909090</gtin> beim Suchen nach "Duplikaten" beachte, dass das obige Stylesheet einfach das erste identifizierte "Duplikat" kopiert, basierend auf den attr[@name = 'temperatureCode'] und attrQualMany[@name = 'temperature'] innerhalb einer einzigen pos, Wenn es weitere row s mit anderen gtin untergeordneten Elementen oder zusätzlichen untergeordneten Elementen gibt, werden diese nicht in das Ergebnis kopiert.

+0

Großartig !!! es funktionierte. – Victor

Verwandte Themen