2016-07-11 21 views
0

Die unten angegebene XSLT funktioniert einwandfrei und entfernt doppelte Knoten, wenn wir einen einzelnen Knoten 'pos' haben, funktioniert aber nicht, wenn wir mehrere 'pos'-Knoten haben.Vergleichen und Zusammenführen in XSLT 1.0 für mehrere Knoten

Daten innerhalb des Knotens 'pos' müssen unabhängig verarbeitet werden, um doppelte Daten in Bezug auf Daten anderer 'pos'-Knoten zu entfernen. Daten innerhalb des Knotens 'pos' sind unabhängig voneinander. Wenn Sie die folgende XSLT verwenden, werden die Daten für beide Knoten "pos" mit dem Entfernen von Duplikaten zusammengeführt. Jede Eingabe von großer Hilfe

Beispiel Nachricht sein wird, 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> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <attr name="temperatureCode">STORAGE1</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> 

Die XSLT, die ich hier bin mit 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: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> 

Die erwartete Ausgabe

<?xml version="1.0" encoding="UTF-8"?> 
    <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> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <attr name="temperatureCode">STORAGE1</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> 

Jeder Eingang ist wird sehr wertvoll sein, da diese Lösung ein Teil einer größeren Problemstellung ist.

Antwort

0

Unten XSLT funktioniert, um doppelte innerhalb Knoten zu entfernen.

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

</xsl:stylesheet>