2016-04-30 136 views
-3

我想應用Muenchian分組來消除重複節點,但我似乎無法使其工作。XSLT1.0刪除重複節點

輸入:

<GetUsersByRoleRspMsg> 
    <UserList> 
     <User> 
     <UserId>PPAUSER1</UserId> 
     <Email>[email protected]</Email>   
     </User> 
     <User> 
     <UserId>PPAUSER1</UserId> 
     <Email>[email protected]</Email>   
     </User>  
    </UserList> 
</GetUsersByRoleRspMsg> 

要求:

<GetUsersByRoleRspMsg> 
    <UserList> 
     <User> 
     <UserId>PPAUSER1</UserId> 
     <Email>[email protected]</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> 
+0

請發表您的嘗試,所以我們可以修復,而不是寫整個代碼給你吧,。 –

+0

我試過:

+0

請編輯您的問題,並在那裏發佈**完整**代碼。 –

回答

1

我沒有看到你的分組碼任何問題。如果你嘗試:

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