2012-03-06 97 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教科書後面的索引中查找),並且您會發現大量信息。 – 2012-03-06 18:40:27

回答

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說「重複記錄」時,它包括''中的''和''。 – 2012-03-06 18:59:12