You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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>

工作说明

  1. <xsl:key> 定义分组规则:匹配所有Parent元素,用Child1的文本值作为分组标识。
  2. <xsl:for-each> 仅选取每个分组中的第一个Parent元素(通过generate-id()判断唯一性),避免重复处理分组。
  3. 对每个分组创建<GROUP>节点,并将该分组下的所有Parent元素复制到节点内。

内容的提问来源于stack exchange,提问作者jau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:00:16