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

XSLT 1.0 使用Muenchian方法按多子节点对父节点分组的问题

问题原因分析

你当前的代码存在两个核心问题:

  • 分组对象选择错误:你需要按Desk的Name属性分组,但你实际是针对Person节点定义分组规则,无法正确识别所有独立的Desk编号
  • 多值key匹配逻辑异常:XSLT 1.0中如果key的use属性返回多个值,匹配逻辑会不符合预期,你直接用Desks/Desk/@Name作为Person的分组键,无法正确关联每个Desk对应的Person

可行解决方案

以下是经过验证的XSLT 1.0代码,完全符合你的输出要求:

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

    <!-- 定义key:按Desk的Name属性分组所有Desk节点 -->
    <xsl:key name="desk-by-name" match="Desk" use="@Name"/>

    <xsl:template match="/Persons">
        <!-- 遍历所有唯一的Desk分组:取每个Name分组的第一个Desk节点 -->
        <xsl:for-each select="Person/Desks/Desk[generate-id() = generate-id(key('desk-by-name', @Name)[1])]">
            <Desk Name="{@Name}">
                <!-- 遍历当前Desk分组下的所有Desk节点,取对应的Person -->
                <xsl:for-each select="key('desk-by-name', @Name)">
                    <Person PersonID="{ancestor::Person/@PersonID}"/>
                </xsl:for-each>
            </Desk>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

代码说明

  1. 首先定义key匹配所有Desk节点,用@Name作为分组键,准确识别所有相同编号的Desk
  2. 根节点匹配时,用Muenchian方法取出所有唯一的Desk分组,每个分组对应一个你要输出的<Desk>节点
  3. 对每个分组,遍历该分组下的所有Desk节点,通过ancestor::Person定位到对应的Person节点,输出PersonID属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:06:08