是否可以使用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 :(得分: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>