XSLT1.0删除重复节点



我正在尝试应用Muenchian分组来消除重复的节点,但我似乎无法使其工作。

输入:

<GetUsersByRoleRspMsg>
   <UserList>
      <User>
         <UserId>PPAUSER1</UserId>
         <Email>xyz@gmail.com</Email>         
      </User>
      <User>
         <UserId>PPAUSER1</UserId>
         <Email>xyz@gmail.com</Email>         
      </User>      
   </UserList>
</GetUsersByRoleRspMsg>

必需:

<GetUsersByRoleRspMsg>
   <UserList>
      <User>
         <UserId>PPAUSER1</UserId>
         <Email>xyz@gmail.com</Email>         
      </User>      
   </UserList>
</GetUsersByRoleRspMsg>

我的代码的关键部分是

<xsl:key name="userIdEmailPair" 
         match="User" 
         use="concat(UserId,' ',Email)"/> 
<xsl:copy> 
  <xsl:for-each select="User[
    count(. | key('userIdEmailPair',
                  concat(UserId,' ',Email))[1])
    = 1]"> 
    <xsl:copy-of select="."/> 
  </xsl:for-each> 
</xsl:copy>

我认为您的分组代码没有任何问题。如果你尝试:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="userIdEmailPair" match="User" use="concat(UserId,' ',Email)"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="UserList">
   <xsl:copy>
      <xsl:for-each select="User[count(. | key('userIdEmailPair',concat(UserId,' ',Email))[1]) = 1]">
         <xsl:copy-of select="."/>
      </xsl:for-each>
   </xsl:copy>
</xsl:template>
</xsl:stylesheet>

你会得到你想要的结果。

当然,您可以将最后一个模板缩短为:

<xsl:template match="UserList">
   <xsl:copy>
      <xsl:copy-of select="User[count(. | key('userIdEmailPair',concat(UserId,' ',Email))[1]) = 1]"/>
   </xsl:copy>
</xsl:template>

最新更新