【问题标题】:XML-XSLT-XPATH : How to fetch duplicate records?XML-XSLT-XPATH:如何获取重复记录?
【发布时间】:2015-11-09 16:44:47
【问题描述】:

大家好,
我是 XML-XSLT-XPATH 的新手,因此我坚持以下方案。
我想获取名称和名字重复的记录。
例如:如果 用户 Aname="abc"firstname="xyz" 并且 用户 Bname="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>

“预期输出”:

<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 来获取重复记录。 任何帮助将不胜感激。 提前谢谢你。

【问题讨论】:

    标签: xml xslt xpath xquery saxon


    【解决方案1】:

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

    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>
    

    【讨论】:

    • 非常感谢@michael.hor257k 如果您提供一些参考站点,我可以通过它作为初学者开始使用 XML-XSLT-XPATH 进行飞行。
    • 我不是问这个问题的合适人选,但我相信投资一本好书会让你做得更好。
    • 你想要一个参考,还是一个带你一步一步的教程?无论哪种方式,我认为两者的书本形式都比在线资源质量要好得多,这仅仅是因为写书的人往往会花几个月的时间专注于这项任务,并在出版前对其进行仔细审查。对于循序渐进的教程方法,我推荐 Jeni Tennison 的“Beginning XSLT 2.0”,作为参考,我推荐我自己的“XSLT 2.0 Programmer's Reference”第 4 版。
    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    相关资源
    最近更新 更多