XML-XSLT-XPATH:如何获取重复记录?
XML-XSLT-XPATH : How to fetch duplicate records?
大家好,
我是 XML-XSLT-XPATH 的新手,因此我坚持使用以下方案。
我想获取 name 和 firstname 重复的记录。
例如:如果 用户 A 有 name="abc" & firstname="xyz" 和 用户 B 有 name="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>
"Expected Output" :
<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 来获取重复记录。
任何帮助将不胜感激。
提前谢谢你。
这可以看作是分组问题的变体。重复只是组的成员,其大小大于一个:
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 to identify the duplicates. This too is a form of grouping - compare: 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>
大家好,
我是 XML-XSLT-XPATH 的新手,因此我坚持使用以下方案。
我想获取 name 和 firstname 重复的记录。
例如:如果 用户 A 有 name="abc" & firstname="xyz" 和 用户 B 有 name="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>
"Expected Output" :
<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 来获取重复记录。 任何帮助将不胜感激。 提前谢谢你。
这可以看作是分组问题的变体。重复只是组的成员,其大小大于一个:
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 to identify the duplicates. This too is a form of grouping - compare: 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>