2016-04-30 4 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> 
Смежные вопросы