XSL 删除重复记录
Posted
技术标签:
【中文标题】XSL 删除重复记录【英文标题】:XSL to remove duplicate records 【发布时间】:2014-12-03 09:21:39 【问题描述】:我有一个需要省略重复记录的要求。考虑下面的示例
下面是输入
<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 对,我想提前发送第一条记录并删除其他记录。
输出应该是这样的
<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 会删除重复项。 IE。如果内部元素完全相同。 下面的代码帮助我轻松避免重复。它根据外部标签内的内容识别重复项。
但如果汇率来自同一对货币但多个 ConversionFactors,我想 xslt 删除记录。
<?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 降低汇率。并且只转发第一个汇率。
我能得到一些帮助吗?
干杯
瑞吉
【问题讨论】:
【参考方案1】:您需要根据SourceCurrency
和TargetCurrency
对Rate
s 进行分组。一种有效的方法是使用 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>
【讨论】:
很好地使用了 Muenchian 分组,但<xsl:for-each select="Rate[count(. | key('currencyPair',concat(SourceCurrency,' ',TargetCurrency))[1]) = 1]"><xsl:copy-of select="."/>
可以缩短为 <xsl:copy-of select="Rate[count(. | key('currencyPair',concat(SourceCurrency,' ',TargetCurrency))[1]) = 1]"/>
。
哦,是的.. 谢谢:)以上是关于XSL 删除重复记录的主要内容,如果未能解决你的问题,请参考以下文章