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

XSLT技术问询:如何将不同命名的XML条目分组为伙伴节点?

XSLT分组实现方案

这完全可行,XSLT不存在你担心的这类局限性,以下是针对需求的具体实现:

XSLT 1.0 版本(Muenchian分组)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <!-- 定义分组键:提取节点名下划线后的后缀(TO/CARR) -->
    <xsl:key name="partnerGroup" match="DATA/*" use="substring-after(local-name(), '_')"/>

    <xsl:template match="/DATA">
        <PARTNERS>
            <!-- 遍历唯一的分组标识 -->
            <xsl:for-each select="*[generate-id() = generate-id(key('partnerGroup', substring-after(local-name(), '_'))[1])]">
                <xsl:variable name="partSuffix" select="substring-after(local-name(), '_')"/>
                <PARTNER>
                    <PART><xsl:value-of select="$partSuffix"/></PART>
                    <NAME><xsl:value-of select="key('partnerGroup', $partSuffix)[local-name() = concat('NAME_', $partSuffix)]"/></NAME>
                    <ZIP><xsl:value-of select="key('partnerGroup', $partSuffix)[local-name() = concat('ZIP_', $partSuffix)]"/></ZIP>
                    <CITY><xsl:value-of select="key('partnerGroup', $partSuffix)[local-name() = concat('CITY_', $partSuffix)]"/></CITY>
                    <STREET><xsl:value-of select="key('partnerGroup', $partSuffix)[local-name() = concat('STREET_', $partSuffix)]"/></STREET>
                </PARTNER>
            </xsl:for-each>
        </PARTNERS>
    </xsl:template>
</xsl:stylesheet>

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="/DATA">
        <PARTNERS>
            <!-- 按节点名下划线后的后缀分组 -->
            <xsl:for-each-group select="*" group-by="substring-after(local-name(), '_')">
                <PARTNER>
                    <PART><xsl:value-of select="current-grouping-key()"/></PART>
                    <!-- 遍历分组内节点,去掉后缀重命名标签 -->
                    <xsl:for-each select="current-group()">
                        <xsl:element name="{substring-before(local-name(), '_')}">
                            <xsl:value-of select="."/>
                        </xsl:element>
                    </xsl:for-each>
                </PARTNER>
            </xsl:for-each-group>
        </PARTNERS>
    </xsl:template>
</xsl:stylesheet>

简要说明

  • XSLT 1.0采用Muenchian分组机制,通过<xsl:key>定义分组规则,兼容性更强,适配大部分旧版XSLT处理器。
  • XSLT 2.0及以上版本支持原生xsl:for-each-group语法,代码更简洁,能自动处理节点标签的重命名,扩展性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:20:28