2014-12-03 3 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의 동일한 쌍이있는 경우 먼저 레코드를 보내고 다른 레코드를 삭제합니다. 나는 XSLT를 수행하면 중복을 제거하는 것을 발견

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

처럼

출력 할 수 shud. 즉. 내부 요소가 완전히 동일한 경우. 아래 코드는 중복을 피하는 데 도움이됩니다. 외부 태그 안의 내용을 기반으로 중복을 식별합니다.

하지만 환율이 같은 통화 쌍이지만 여러 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로 요금을 내야합니다. 그리고 첫 번째 환율 만 전달하십시오.

이 문제를 해결하는 데 도움이 될 수 있습니까?

건배

Reji

답변

1

당신은 SourceCurrencyTargetCurrency에 따라 그룹에 Rate의 필요합니다. 키를 사용하는 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

+1

Muenchian 그룹을 잘 사용했지만'] <> xsl : "("currencyPair ", concat (SourceCurrency, '', TargetCurrency)) [1] 복사 - 선택 select =". "/>'단축 될 수있는 '. –

+0

오 예 .. 고맙습니다. :) –

관련 문제