XML-XSLT-XPATH:如何获取重复记录?

时间:2015-08-17 06:06:42

标签: xml xslt xpath xquery saxon

问候所有人,
我是XML-XSLT-XPATH的新手,因此我坚持使用以下方案 我想获取哪些名称和名字重复的记录 例如:如果用户A 名称=" abc" & 名字=" xyz" 用户B 名称=" abc" & firstname =" xyz" ,然后应该说用户A与用户B有重复,反之亦然。 嗯,我有一个输入XML,如下所示。

     <userlist>
        <user>abc@gmail.com
           <name>abc</name>
           <firstname>xyz</firstname>
           <email>abc@gmail.com</email>
           <userid>abcxy</userid>
        </user>
        <user>abc1@gmail.com
           <name>abc</name>
           <firstname>xyz</firstname>
           <email>abc1@gmail.com</email>
           <userid>abc1xy</userid>
        </user>
        <user>abc2@gmail.com
           <name>abc2</name>
           <firstname>xyz2</firstname>
           <email>abc2@gmail.com</email>
           <userid>abc2xy</userid>
        </user>
        <user>abc3@gmail.com
           <name>abc3</name>
           <firstname>xyz3</firstname>
           <email>abc3@gmail.com</email>
           <userid>abc3xy</userid>
        </user>
</userlist>

&#34;预期产出&#34; :

<duplicatUserList>
  <user>abc@gmail.com
           <name>abc</name>
           <firstname>xyz</firstname>
           <email>abc@gmail.com</email>
           <userid>abcxy</userid>
   </user>
    <user>abc1@gmail.com
           <name>abc</name>
           <firstname>xyz</firstname>
           <email>abc1@gmail.com</email>
           <userid>abc1xy</userid>
    </user>
</duplicateUserList>

这可能是我问的很容易,但正如我告诉我对这个XSLT-XPath的新手。 需要XSLT来获取重复记录。 任何帮助将不胜感激。 提前谢谢你。

1 个答案:

答案 0 :(得分:3)

这可以看作是分组问题的变体。重复项只是大小大于一的组的成员:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/userlist">
    <duplicatUserList>
        <xsl:for-each-group select="user" group-by="concat(name, '|', firstname)">
            <xsl:if test="count(current-group()) > 1">
                <xsl:copy-of select="current-group()"/>
            </xsl:if>
        </xsl:for-each-group>
    </duplicatUserList>
</xsl:template>

</xsl:stylesheet>

或者,您可以使用 key 来识别重复项。这也是一种分组形式 - 比较:http://www.jenitennison.com/xslt/grouping/muenchian.html

XSLT 1.0

<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="dup" match="user" use="concat(name, '|', firstname)" />

<xsl:template match="/userlist">
    <duplicatUserList>
        <xsl:copy-of select="user[count(key('dup', concat(name, '|', firstname))) > 1]"/>
    </duplicatUserList>
</xsl:template>

</xsl:stylesheet>