Xml 如何使用xslt删除基于多个属性组合的重复元素
我的输入XML是这样的:Xml 如何使用xslt删除基于多个属性组合的重复元素,xml,xslt,Xml,Xslt,我的输入XML是这样的: <?xml version="1.0" encoding="UTF-8"?> <root> <Account InceptionDate="03/01/2005" BusinessWorkGroup="US" BusinessUnit="BOS" AccountId="XYZ4321" ISOCurrency="USD" DomicileCountry="USA"> <AssignContact ContactId="123
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Account InceptionDate="03/01/2005" BusinessWorkGroup="US" BusinessUnit="BOS" AccountId="XYZ4321" ISOCurrency="USD" DomicileCountry="USA">
<AssignContact ContactId="123" Type="Administrative Assistant"/>
<AssignContact ContactId="123" Type="Portfolio Manager"/>
<AssignContact ContactId="123" Type="Portfolio Manager"/>
</Account>
<Account InceptionDate="03/01/2006" BusinessWorkGroup="US" BusinessUnit="BOS" AccountId="ABC1231" ISOCurrency="USD" DomicileCountry="USA">
<AssignContact ContactId="543" Type="Administrative Assistant"/>
<AssignContact ContactId="543" Type="Portfolio Manager"/>
<AssignContact ContactId="211" Type="Portfolio Manager"/>
</Account>
<Account InceptionDate="03/01/2010" BusinessWorkGroup="US" BusinessUnit="BOS" AccountId="DUM111" ISOCurrency="USD" DomicileCountry="USA">
<AssignContact ContactId="987" Type="Administrative Assistant"/>
<AssignContact ContactId="987" Type="Administrative Assistant"/>
<AssignContact ContactId="211" Type="Portfolio Manager"/>
</Account>
</root>
我的输出应该如下所示:(对于每个AccountId,应该从最终xml中删除重复的[ContactId和Type的组合]:
我使用的XSLT工作不正常,请告诉我如何修改xsl,以便它也可以查找类型和ContactId
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" >
<xsl:output method="xml" indent="yes" version="1.0"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="AssignContact">
<xsl:if test="not(@ContactId=preceding-sibling::AssignContact/@ContactId)">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
评论中提供的链接是针对一种称为“明钦族分组”的技术。在您的案例中,您希望按其父级
AccountId
及其ContactId
和TypeId
属性对AssignContact
进行分组。这意味着使用连接键
<xsl:key name="Contact"
match="AssignContact"
use="concat(../@AccountId, '|', @ContactId, '|', @Type)" />
尝试以下XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
<xsl:output method="xml" indent="yes" version="1.0"/>
<xsl:strip-space elements="*"/>
<xsl:key name="Contact" match="AssignContact" use="concat(@ContactId, '|', @Type)" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="AssignContact[generate-id() != generate-id(key('Contact', concat(../@AccountId, '|', @ContactId, '|', @Type))[1])]" />
</xsl:stylesheet>
搜索XSLT分组。目前,您没有任何我可以帮助您的东西。首先做一些家庭作业。请查看我的示例XSLHi@Dimitre Novatchev我需要您的输入此xslt还将从AccountId=“DUM111”中删除,我需要删除一个帐户的重复项我已修改了我的答案以解决此问题。为了将来的参考,请确保您在问题中清楚地提到要求,因为您提出的问题是重复的[联系人ID和类型的组合],这就是我错过它的原因。谢谢大家!@如果它解决了您的问题,请不要忘记。谢谢
<xsl:template match="AssignContact
[generate-id() != generate-id(key('Contact', concat(../@AccountId, '|', @ContactId, '|', @Type))[1])]" />
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
<xsl:output method="xml" indent="yes" version="1.0"/>
<xsl:strip-space elements="*"/>
<xsl:key name="Contact" match="AssignContact" use="concat(@ContactId, '|', @Type)" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="AssignContact[generate-id() != generate-id(key('Contact', concat(../@AccountId, '|', @ContactId, '|', @Type))[1])]" />
</xsl:stylesheet>