是否可以使用XSLT样式表过滤重复记录?

时间:2012-03-06 17:04:52

标签: xslt filtering

是否可以使用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>

2 个答案:

答案 0 :(得分: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 :(得分:1)

这是一个XSLT 1.0选项...

XSLT 1.0样式表

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