2016-07-14 25 views
0

So entfernen Sie Duplikate aus dem folgenden xml mit xslt. Im Folgenden wird der Code verwendet. Es funktioniert gut für die Duplikate zu entfernen, aber ich bin nicht in der Lage, die entsprechenden WerteEntfernen von Duplikaten aus xml mit xslt

<schedules> 
     <flight> 
     <Flight> 
     <fno>122</fno> 
     <acode>aa</acode> 
     <Dest1IATA>ATL</Dest1IATA> 
     <Dest1desc>Atlanta Airport</Dest1desc> 
     <Dest1town>Atlanta </Dest1town> 
     <Dest2IATA>JFK</Dest2IATA>   
     <Dest2desc></Dest2desc> 
     <Dest2town></Dest2town> 
     <Dest2cntry></Dest2cntry>    
     <Dest3IATA>LGA</Dest3IATA>   
     <Dest3desc></Dest3desc> 
     <Dest3town></Dest3town> 
     <Dest3cntry></Dest3cntry> 
     </Flight> 
      <Flight> 
     <fno>124</fno> 
     <acode>aB</acode> 
     <Dest1IATA>LCY</Dest1IATA> 
     <Dest1desc>LCY Airport</Dest1desc> 
     <Dest1town>LCY</Dest1town> 
     <Dest2IATA>DXB</Dest2IATA>   
     <Dest2desc></Dest2desc> 
     <Dest2town></Dest2town> 
     <Dest2cntry></Dest2cntry>    
     <Dest3IATA>LGA</Dest3IATA>   
     <Dest3desc></Dest3desc> 
     <Dest3town></Dest3town> 
     <Dest3cntry></Dest3cntry> 
     </Flight>   
     </flight> 
     </schedules> 

Xslt Code hinzufügen: sollte

 <xsl:for-each select="(//schedules/flight/Flight/Dest1IATA | //schedules/flight/Flight/Dest2IATA | //schedules/flight/Flight/Dest3IATA)[generate-id(.) = generate-id(key('Keycity', .))]"> 
     <xsl:sort select="//schedules/flight/Flight/Dest1IATA | //schedules/flight/Flight/Dest2IATA | //schedules/flight/Flight/Dest3IATA"/> 

     <!--<xsl:value-of select="." />--> 
     <xsl:if test="local-name() = 'Dest1IATA' and //schedules/flight/Flight/Dest1IATA != ''"> 
     <Row Action="ADD"> 
      <xsl:value-of select="." />|<xsl:value-of select="//schedules/flight/Flight/Dest1desc" />|<xsl:value-of select="//schedules/flight/Flight/Dest1town" />|<xsl:value-of select="//schedules/flight/Flight/Dest1cntry" /> 
     </Row> 
     </xsl:if> 
     <xsl:if test="local-name() = 'Dest2IATA' and //schedules/flight/Flight/Dest2IATA != ''"> 
     <Row Action="ADD"> 
      <xsl:value-of select="." />|<xsl:value-of select="//schedules/flight/Flight/Dest2desc" />|<xsl:value-of select="//schedules/flight/Flight/Dest2town" />|<xsl:value-of select="//schedules/flight/Flight/Dest2cntry" /> 
     </Row> 
     </xsl:if> 
     <xsl:if test="local-name() = 'Dest3IATA' and //schedules/flight/Flight/Dest3IATA != ''"> 
     <Row Action="ADD"> 
      <xsl:value-of select="." />|<xsl:value-of select="//schedules/flight/Flight/Dest3desc" />|<xsl:value-of select="//schedules/flight/Flight/Dest3town" />|<xsl:value-of select="//schedules/flight/Flight/Dest3cntry" /> 
     </Row> 
     </xsl:if> 
    </xsl:for-each> 

ExpectedOutput

sein
ROW|Add|ATL|Atlanta Airport| 
ROW|Add|JFK|| 
ROW|Add|LGA|| 
ROW|Add|LCY|LCYAirport|LCY 
ROW|Add|DXB|| 

Ausgang mit oben-Code

ROW|Add|ATL|| 
ROW|Add|JFK|| 
ROW|Add|LGA|| 
ROW|Add|LCY|| 
ROW|Add|DXB|| 
+0

Sie müssen, was erklären sind "die entsprechenden Werte". - PS Als ich vorgeschlagen habe, dass du [deine vorherige Frage] schließen solltest (http://stackoverflow.com/questions/38362143/how-to-remove-duplicates-when-using-xslt), meinte ich nicht, du solltest es löschen. –

+0

Entschuldigung, ich habe keine Option zum Schließen gesehen. Entsprechende Werte sind Land, Stadt und Beschreibung für dieses Ziel. – user3067170

+0

Sie schließen eine Frage, indem Sie eine Antwort akzeptieren. –

Antwort

0

Die Das folgende Stylesheet erzeugt eine Ausgabe, die Ihren Erwartungen sehr ähnlich ist. Es könnte eine glückliche Vermutung oder nur ein Zufall sein.

XSLT 1,0

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

<xsl:key name="dest" match="Dest1IATA | Dest2IATA | Dest3IATA" use="." /> 

<xsl:template match="/schedules"> 
    <xsl:for-each select="(flight/Flight/Dest1IATA | flight/Flight/Dest2IATA | flight/Flight/Dest3IATA)[generate-id(.) = generate-id(key('dest', .))]"> 
     <xsl:text>ROW|Add|</xsl:text> 
     <xsl:value-of select="." /> 
     <xsl:if test="self::Dest1IATA"> 
      <xsl:text>|</xsl:text> 
      <xsl:value-of select="../Dest1desc" /> 
      <xsl:text>|</xsl:text> 
      <xsl:value-of select="../Dest1town" />  
     </xsl:if> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

auf Ihre Eingabe Beispiel angewendet wird, wird das Ergebnis sein:

ROW|Add|ATL|Atlanta Airport|Atlanta 
ROW|Add|JFK 
ROW|Add|LGA 
ROW|Add|LCY|LCY Airport|LCY 
ROW|Add|DXB 
Verwandte Themen