2016-07-14 10 views
0

xsltを使用して、下のxmlから重複を削除する方法以下は、コードを使用しています。これは、重複を除去するために正常に動作しますが、対応する値xsltを使用してxmlから重複を削除

<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コードを追加することはできませんよ:

ExpectedOutputは上記のコードで

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

出力

でなければなりません
 <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> 

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

あなたが "対応する値" が何であるかを説明する必要があります。 - P.S. [あなたの前の質問](http://stackoverflow.com/questions/38362143/how-to-remove-duplicates-when-using-xslt)を閉じるべきであると提案したとき、私はそれを削除すべきではありませんでした。 –

+0

申し訳ありませんが私はそれを閉じるためのオプションが表示されませんでした。対応する値は、その目的地の国、町および説明です。 – user3067170

+0

回答を受け入れることによって質問を閉じます。 –

答えて

0

次のスタイルシートは期待どおりの出力を生成します。それは幸運な推測かちょうど偶然かもしれません。あなたの入力例に適用

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> 

、結果は以下のようになります。

ROW|Add|ATL|Atlanta Airport|Atlanta 
ROW|Add|JFK 
ROW|Add|LGA 
ROW|Add|LCY|LCY Airport|LCY 
ROW|Add|DXB 
関連する問題