这是一个示例,如果ID相同,我想删除重复的条目.我正在从系统’A’和系统’B’中拉出命中.我希望系统’A’具有优先权(即,如果ID是重复的,则从系统’B’中删除该元素).这是我的例子:
我得到了这个结果:
<HitList> <Hit System="A" ID="1"/> <Hit System="A" ID="2"/> <Hit System="A" ID="2"/> <Hit System="B" ID="1"/> <Hit System="B" ID="2"/> <Hit System="B" ID="3"/> <Hit System="B" ID="4"/> </HitList> I want this result (with the duplicates removed): <HitList> <Hit System="A" ID="1"/> <Hit System="A" ID="2"/> <Hit System="B" ID="3"/> <Hit System="B" ID="4"/> </HitList>
现行代码:
<xsl:template match="/RetrievePersonSearchDataRequest"> <HitList> <xsl:if test="string(RetrievePersonSearchDataRequest/SystemA/NamecheckResponse/@Status) = string(Succeeded)"> <xsl:for-each select="SystemA/NamecheckResponse/BATCH/ITEMLIST/ITEM/VISQST/NCHITLIST/NCHIT"> <Hit> <xsl:attribute name="System"><xsl:text>A</xsl:text></xsl:attribute> <xsl:attribute name="PersonID"><xsl:value-of select="number( REFUSAL/@UID)"/></xsl:attribute> </Hit> </xsl:for-each> </xsl:if> <xsl:if test="string(RetrievePersonSearchDataRequest/SystemB/NamecheckResponse/@Status) = string(Succeeded)"> <xsl:for-each select="SystemB/NamecheckResponse/PersonIDSearchResponse/personID"> <Hit> <xsl:attribute name="System"><xsl:text>B</xsl:text></xsl:attribute> <xsl:attribute name="PersonID"><xsl:value-of select="number(.)"/></xsl:attribute> </Hit> </xsl:for-each> </xsl:if> </HitList> </xsl:template>
解决方法
这是一个使用密钥的高效XSLT 1.0解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="kHitById" match="Hit" use="@ID"/> <xsl:key name="kHitAById" match="Hit[@System = 'A']" use="@ID"/> <xsl:template match= "Hit[generate-id() = generate-id(key('kHitById',@ID)[1])]"> <xsl:copy-of select= "key('kHitAById',@ID)[1]|current()[not(key('kHitAById',@ID))]"/> </xsl:template> </xsl:stylesheet>
当这个转换应用于下面的XML文档时(故意改编自提供的文档,通过在相应的As之前放置一些B来使其更有趣):
<HitList> <Hit System="B" ID="1"/> <Hit System="A" ID="1"/> <Hit System="B" ID="2"/> <Hit System="A" ID="2"/> <Hit System="A" ID="2"/> <Hit System="B" ID="3"/> <Hit System="B" ID="4"/> </HitList>
产生了想要的正确结果:
<Hit System="A" ID="1"/> <Hit System="A" ID="2"/> <Hit System="B" ID="3"/> <Hit System="B" ID="4"/>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。