我希望在使用xslt完全匹配所有变量时删除重复项。
在此xml节点中应删除3,因为它是节点1的完美副本。
<root>
<trips>
<trip>
<got_car>0</got_car>
<from>Stockholm, Sweden</from>
<to>Gothenburg, Sweden</to>
<when_iso>2010-12-06 00:00</when_iso>
</trip>
<trip>
<got_car>0</got_car>
<from>Stockholm, Sweden</from>
<to>New york, USA</to>
<when_iso>2010-12-06 00:00</when_iso>
</trip>
<trip>
<got_car>0</got_car>
<from>Stockholm, Sweden</from>
<to>Gothenburg, Sweden</to>
<when_iso>2010-12-06 00:00</when_iso>
</trip>
<trip>
<got_car>1</got_car>
<from>Test, Duncan, NM 85534, USA</from>
<to>Test, Duncan, NM 85534, USA</to>
<when_iso>2010-12-06 00:00</when_iso>
</trip>
<trips>
<root>
答案 0 :(得分:2)
有了更好的设计,这个样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kTripByContent" match="trip"
use="concat(got_car,'+',from,'+',to,'+',when_iso)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="trip[generate-id() !=
generate-id(key('kTripByContent',
concat(got_car,'+',
from,'+',
to,'+',
when_iso))[1])]"/>
</xsl:stylesheet>
输出:
<root>
<trips>
<trip>
<got_car>0</got_car>
<from>Stockholm, Sweden</from>
<to>Gothenburg, Sweden</to>
<when_iso>2010-12-06 00:00</when_iso>
</trip>
<trip>
<got_car>0</got_car>
<from>Stockholm, Sweden</from>
<to>New york, USA</to>
<when_iso>2010-12-06 00:00</when_iso>
</trip>
<trip>
<got_car>1</got_car>
<from>Test, Duncan, NM 85534, USA</from>
<to>Test, Duncan, NM 85534, USA</to>
<when_iso>2010-12-06 00:00</when_iso>
</trip>
</trips>
</root>
答案 1 :(得分:1)
如果您使用的是XSLT 1.0,这个答案可能有所帮助: How to remove duplicate XML nodes using XSLT。使用XSLT 2.0更容易,但并未普遍部署
答案 2 :(得分:1)
此代码:
<?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" indent="yes"/>
<xsl:key name="trip-tth" match="/root/trips/trip" use="concat(got_car, '+', from, '+', to, '+', when_iso)"/>
<xsl:template match="root/trips">
<xsl:copy>
<xsl:apply-templates select="trip[generate-id(.) = generate-id( key ('trip-tth', concat(got_car, '+', from, '+', to, '+', when_iso) ) )]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="trip">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
会做的伎俩。
它利用了一个事实,即应用于密钥的generate-id()将获取与给定条件匹配的第一个节点的id。在我们的案例中,标准是每个trip子元素的连接值。