Xml 如何使用xslt删除基于多个属性组合的重复元素

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是这样的:

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