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, я хочу отправить первую запись и отбросить другие.

Выходной сигнал будет подобен

<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:apply-templates></xsl:copy>
 </xsl:if>
 </xsl:template>
</xsl:output></xsl:stylesheet>

Мне нужно сбросить тарифы с USD-> INR, если это происходит несколько раз. И вперед только первый обменный курс.

Могу ли я получить некоторую помощь в этом.

ура

Reji

1 ответ

Вы должны групповой Rate на основе SourceCurrency и TargetCurrency. Эффективным способом является использование группировки 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:copy-of></xsl:for-each>
 </xsl:copy>
</xsl:template>
</xsl:key></xsl:output></xsl:stylesheet>

licensed under cc by-sa 3.0 with attribution.