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

如何使用XSLT 1.0按ID属性值为键对XML节点进行分组

XSLT 1.0 实现方案

XSLT 1.0 没有原生的for-each-group语法,可使用Muenchian分组法实现需求,这是XSLT 1.0下实现分组的标准方案,完整代码如下:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <!-- 按ID值对ROW节点分组的索引 -->
    <xsl:key name="rowById" match="ROW" use="COLUMN[@NAME='ID']"/>
    <!-- 按「ID值+列名」组合键对COLUMN节点分组的索引,避免不同ID下的同名列被错误去重 -->
    <xsl:key name="colByIdAndName" match="COLUMN" use="concat(../COLUMN[@NAME='ID'], '|', @NAME)"/>

    <xsl:template match="ROWS">
        <xsl:copy>
            <!-- 外层遍历:取每个ID分组的第一个ROW节点作为分组代表 -->
            <xsl:for-each select="ROW[generate-id() = generate-id(key('rowById', COLUMN[@NAME='ID'])[1])]">
                <xsl:copy>
                    <xsl:variable name="currentId" select="COLUMN[@NAME='ID']"/>
                    <!-- 内层遍历:取当前ID分组下所有列名不重复的COLUMN节点,保留第一个出现的实例 -->
                    <xsl:for-each select="key('rowById', $currentId)/COLUMN[generate-id() = generate-id(key('colByIdAndName', concat($currentId, '|', @NAME))[1])]">
                        <xsl:copy-of select="."/>
                    </xsl:for-each>
                </xsl:copy>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

如果需要输出保留CDATA格式,可在xsl:output节点添加cdata-section-elements="COLUMN"属性即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:45:03