2014-12-03 164 views
0

我有一個要求,我需要省略重複的記錄。考慮下面XSL刪除重複記錄

下面的示例是輸入

<ExchangeRates> 
<Rate> <!--The exchange rates --> 
<SourceCurrency>INR</SourceCurrency> 
<TargetCurrency>USD</TargetCurrency> 
<ConversionFactor>60.2</ConversionFactor> 
</Rate> 
<Rate> 
<SourceCurrency>INR</SourceCurrency> 
<TargetCurrency>USD</TargetCurrency> 
<ConversionFactor>58.2</ConversionFactor> 
</Rate> 
<Rate> 
<SourceCurrency>YEN</SourceCurrency> 
<TargetCurrency>INR</TargetCurrency> 
<ConversionFactor>.52</ConversionFactor> 
</Rate> 
<Rate> 
<SourceCurrency>SAR</SourceCurrency> 
<TargetCurrency>INR</TargetCurrency> 
<ConversionFactor>16.50</ConversionFactor> 
</Rate> 
<Rate> 
<SourceCurrency>SAR</SourceCurrency> 
<TargetCurrency>INR</TargetCurrency> 
<ConversionFactor>16.50</ConversionFactor> 
</Rate> 
</ExchangeRates> 

現在我要做的是去除所有重複。以及如果有同一對Source和TargetCurrency,我想先發送第一條記錄並放棄其他記錄。

輸出shud像

<ExchangeRates> 
<Rate> 
<SourceCurrency>INR</SourceCurrency> 
<TargetCurrency>USD</TargetCurrency> 
<ConversionFactor>60.2</ConversionFactor> 
</Rate> 
<Rate> 
<SourceCurrency>YEN</SourceCurrency> 
<TargetCurrency>INR</TargetCurrency> 
<ConversionFactor>.52</ConversionFactor> 
</Rate> 
<Rate> 
<SourceCurrency>SAR</SourceCurrency> 
<TargetCurrency>INR</TargetCurrency> 
<ConversionFactor>16.50</ConversionFactor> 
</Rate> 
</ExchangeRates> 

我發現,下面的XSLT刪除重複。即。如果內部元素完全相同。 下面的代碼可以幫助我輕鬆地避免重複。它根據外部標籤內的內容識別重複項。

但我想xslt刪除記錄如果匯率來自同一對貨幣但多個ConversionFactors。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:if test="not(node()) or not(preceding-sibling::node()[.=string(current())])"> 
      <xsl:copy> 
       <xsl:apply-templates select="@*|node()"/> 
      </xsl:copy> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

如果發生多次,我需要用USD-> INR降低匯率。只轉發第一個匯率。

我可以在實現此目標方面獲得一些幫助。

乾杯

Reji

回答

1

你需要組基於SourceCurrencyTargetCurrencyRate秒。一個有效的方法是使用Muenchian的分組,使用密鑰:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:key name="currencyPair" match="Rate" use="concat(SourceCurrency,' ',TargetCurrency)"/> 

<xsl:template match="ExchangeRates"> 
    <xsl:copy> 
     <xsl:for-each select="Rate[count(. | key('currencyPair',concat(SourceCurrency,' ',TargetCurrency))[1]) = 1]"> 
      <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
+0

哇..謝謝你的朋友。這就像魅力一樣! – user2729074 2014-12-03 10:21:07

+1

好用的Muenchian分組,但''xsl:for-each select =「Rate [count(。| key('currencyPair',concat(SourceCurrency,'',TargetCurrency))[1])= 1]」>'可以縮寫爲''。 – 2014-12-03 11:25:40

+0

哦,是的..謝謝:) – 2014-12-03 11:36:44