如何在XSLT中基于子元素对父元素进行分组
按Child1值分组XML中的Parent元素
需求:将XML中所有Child1值相同的Parent元素归入同一个<GROUP>节点内。
原始XML
<?xml version="1.0" encoding="utf-8"?> <Root> <Parent> <Child1>0123</Child1> <Child2>KIK</Child2> <Child3>YAM</Child3> </Parent> <Parent> <Child1>0123</Child1> <Child2>FIS</Child2> <Child3>BOL</Child3> </Parent> <Parent> <Child1>0123</Child1> <Child2>TOC</Child2> <Child3>INO</Child3> </Parent> <Parent> <Child1>456</Child1> <Child2>CHI</Child2> <Child3>KEN</Child3> </Parent> <Parent> <Child1>456</Child1> <Child2>ALA</Child2> <Child3>KING</Child3> </Parent> </Root>
期望输出
<?xml version="1.0" encoding="utf-8"?> <Root> <GROUP> <Parent> <Child1>0123</Child1> <Child2>KIK</Child2> <Child3>YAM</Child3> </Parent> <Parent> <Child1>0123</Child1> <Child2>FIS</Child2> <Child3>BOL</Child3> </Parent> <Parent> <Child1>0123</Child1> <Child2>TOC</Child2> <Child3>INO</Child3> </Parent> </GROUP> <GROUP> <Parent> <Child1>456</Child1> <Child2>CHI</Child2> <Child3>KEN</Child3> </Parent> <Parent> <Child1>456</Child1> <Child2>ALA</Child2> <Child3>KING</Child3> </Parent> </GROUP> </Root>
解决方案:使用XSLT的Muenchian分组法
这是XML分组场景下的经典实现方式,通过定义分组键快速归类相同值的元素:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" encoding="utf-8"/> <!-- 定义分组键:以Child1的文本值作为分组依据 --> <xsl:key name="groupByChild1" match="Parent" use="Child1"/> <xsl:template match="/Root"> <Root> <!-- 遍历每个分组的第一个Parent元素(确保每个分组只处理一次) --> <xsl:for-each select="Parent[generate-id() = generate-id(key('groupByChild1', Child1)[1])]"> <GROUP> <!-- 复制当前分组下的所有Parent元素 --> <xsl:copy-of select="key('groupByChild1', Child1)"/> </GROUP> </xsl:for-each> </Root> </xsl:template> </xsl:stylesheet>
工作说明
<xsl:key>定义分组规则:匹配所有Parent元素,用Child1的文本值作为分组标识。<xsl:for-each>仅选取每个分组中的第一个Parent元素(通过generate-id()判断唯一性),避免重复处理分组。- 对每个分组创建
<GROUP>节点,并将该分组下的所有Parent元素复制到节点内。
内容的提问来源于stack exchange,提问作者jau
相关产品推荐
相关产品推荐

