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>
代码说明
- 首先定义key匹配所有
Desk节点,用@Name作为分组键,准确识别所有相同编号的Desk - 根节点匹配时,用Muenchian方法取出所有唯一的Desk分组,每个分组对应一个你要输出的
<Desk>节点 - 对每个分组,遍历该分组下的所有Desk节点,通过
ancestor::Person定位到对应的Person节点,输出PersonID属性
内容的提问来源于stack exchange,提问作者Starfleet.
相关产品推荐
相关产品推荐

