2012-03-06 23 views
0

XSLTスタイルシートを使用して重複レコードをフィルタリングすることは可能ですか?私が意味することにより、あなたは、入力として、次のコードを取得する場合:XSLTスタイルシートを使用して重複レコードをフィルタリングすることはできますか?

<payload> 
    <name>1</name> 
    <date>2</date> 
</payload> 
<payload> 
    <name>1</name> 
    <date>2</date> 
</payload> 
<payload> 
    <name>10</name> 
    <date>20</date> 
</payload> 
<payload> 
    <name>1</name> 
    <date>2</date> 
</payload> 

それは、この出力を生成するための入力をフィルタリングすることができます:

<payload> 
    <name>1</name> 
    <date>2</date> 
</payload> 
<payload> 
    <name>10</name> 
    <date>20</date> 
</payload> 
+0

答えはイエスですが、それを超えて、それはどうかに依存しますXSLT 1.0または2.0を使用しています。 Googleは「XSLTグループ化」(または、XSLTグループのお気に入りのインデックスの索引でそれを探してください)を利用すれば、情報のヒープを見つけることができます。 –

答えて

1

は、XSLT 1.0オプション...

XSLT 1.0 stylsheet

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="kPayloads" match="payload" use="concat('N',name,'D',date)"/> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="payloads"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="payload[generate-id() = generate-id(key('kPayloads', concat('N',name,'D',date)))]"/> 
    </xsl:copy> 
    </xsl:template>  

</xsl:stylesheet> 

XML入力(整形)

<payloads> 
    <payload> 
    <name>1</name> 
    <date>2</date> 
    </payload> 
    <payload> 
    <name>1</name> 
    <date>2</date> 
    </payload> 
    <payload> 
    <name>10</name> 
    <date>20</date> 
    </payload> 
    <payload> 
    <name>1</name> 
    <date>2</date> 
    </payload> 
</payloads> 

XML出力です

<payloads> 
    <payload> 
     <name>1</name> 
     <date>2</date> 
    </payload> 
    <payload> 
     <name>10</name> 
     <date>20</date> 
    </payload> 
</payloads> 

編集

このXSLT 2.0スタイルシートも同じ出力を生成します...

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="payloads"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:for-each-group select="payload" group-by="concat('N',name,'D',date)"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy>   
     </xsl:for-each-group> 
    </xsl:copy> 
    </xsl:template>  

</xsl:stylesheet> 
1

これはあなたがやりたいのか?ここで

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cds="cds_dt" exclude-result-prefixes="cds"> 

    <xsl:template match="/"> 
     <root> 
     <xsl:apply-templates select="/root/payload"/> 
     </root> 
    </xsl:template> 

    <xsl:template match="/root/payload"> 
     <xsl:if test="not(preceding-sibling::payload/name = name)"> 
      <xsl:copy-of select="."/> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 
+1

私は、OPが "重複レコード"と言うとき、それは ''に ''と ''の両方を含んでいると思います。 –

関連する問題