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】:

您需要根据SourceCurrencyTargetCurrencyRates 进行分组。一种有效的方法是使用 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 分组,但 &lt;xsl:for-each select="Rate[count(. | key('currencyPair',concat(SourceCurrency,' ',TargetCurrency))[1]) = 1]"&gt;&lt;xsl:copy-of select="."/&gt; 可以缩短为 &lt;xsl:copy-of select="Rate[count(. | key('currencyPair',concat(SourceCurrency,' ',TargetCurrency))[1]) = 1]"/&gt; 哦,是的.. 谢谢:)

以上是关于XSL 删除重复记录的主要内容,如果未能解决你的问题,请参考以下文章

几个删除重复记录的SQL语句

SQL语句删除重复的记录

sql中如何删除一个表中重复的记录?

在 XML 中查找重复值并在 XSL 中删除节点

sql查询重复记录删除重复记录方法大全

sql查询重复记录删除重复记录方法大全