2014-12-03 159 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