基于XSLT 2.0合并同id的case元素内容并去重的问题
XML分组去重与内容保留问题修复
问题背景
基于Martin Honnen的方案实现按id对XML的case元素分组并统计重复项时,遇到两个问题:
- 同
id且cont值为n | n格式的case,输出中content字段为空(如id=1的输出) - 存在重复
case元素时,content中的内容被重复输出
原XML输入
<root> <case id="1"> <cont>1 | 2</cont> </case> <case id="1"> <cont>3 | 4</cont> </case> <case id="2"> <cont>5 | 6</cont> </case> <case id="2"> <cont>5 | 6</cont> </case> </root>
原XSLT 2.0代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:key name="case-by-id" match="case" use="@id"/> <xsl:template match="/root"> <result> <xsl:for-each-group select="case" group-by="@id"> <group id="{current-grouping-key()}"> <count><xsl:value-of select="count(current-group())"/></count> <content> <xsl:value-of select="current-group()/cont" separator="; "/> </content> </group> </xsl:for-each-group> </result> </xsl:template> </xsl:stylesheet>
当前错误输出
<result> <group id="1"> <count>2</count> <content/> </group> <group id="2"> <count>2</count> <content>5 | 6; 5 | 6</content> </group> </result>
预期输出
<result> <group id="1"> <count>2</count> <content>1 | 2; 3 | 4</content> </group> <group id="2"> <count>2</count> <content>5 | 6</content> </group> </result>
修改后的XSLT 2.0代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/root"> <result> <xsl:for-each-group select="case" group-by="@id"> <group id="{current-grouping-key()}"> <count><xsl:value-of select="count(current-group())"/></count> <content> <!-- 对当前分组内的cont值去重后拼接 --> <xsl:value-of select="distinct-values(current-group()/cont)" separator="; "/> </content> </group> </xsl:for-each-group> </result> </xsl:template> </xsl:stylesheet>
修复说明
- 解决内容缺失问题:通过
current-group()/cont确保分组内所有cont节点的文本都被选取,结合distinct-values避免异常格式导致的内容丢失,完整保留所有合法文本值 - 解决内容重复问题:使用
distinct-values()函数对分组内的cont文本值进行去重,确保相同内容只输出一次,同时保留所有不同的cont内容
内容的提问来源于stack exchange,提问作者Somebody
相关产品推荐
相关产品推荐

