Muenchian分组法是XSLT 1.0中最经典、兼容性最好的分组方法,利用key机制和generate-id()函数识别每组首个节点,再通过key拉取全组数据。

用XSLT实现分组,最经典、兼容性最好(尤其在XSLT 1.0中)的方法是Muenchian分组法。它利用XSLT的key机制和generate-id()函数,通过“首次出现即代表一组”的逻辑完成高效分组,不依赖循环或递归。
理解Muenchian分组的核心思路
Muenchian分组本质是:为每个分组键定义一个key,再用generate-id()比对当前节点与该键下第一个节点的ID是否一致——只有第一个匹配项会命中,从而选出每组的“代表节点”,再基于它拉取整组数据。
关键前提:XML结构需支持按某个字段(如@category、name等)归类;XSLT版本为1.0(2.0+可用xsl:for-each-group,更简洁,但Muenchian仍是1.0唯一可靠方案)。
四步写出标准Muenchian分组模板
以常见场景为例:将商品列表按@type属性分组,输出每组标题及下属商品。
-
定义key:在
xsl:stylesheet顶层声明,表示所有item元素按@type值建立索引。 -
选取每组首个代表节点:用
item[generate-id() = generate-id(key('items-by-type', @type)[1])]筛选出每个@type值第一次出现的item。 -
遍历代表节点并输出组头:对上一步结果用
xsl:for-each,例如作为组名。 -
在组内拉取全部成员:在
for-each内部,用key('items-by-type', @type)获取当前组所有item,再嵌套处理。
完整可运行示例(XSLT 1.0)
输入XML:
XSLT片段:
组
注意事项与常见陷阱
-
key的match路径必须精确:若XML有嵌套层级(如
catalog/items/item),match应写成"items/item"而非仅"item",否则可能匹配失败。 -
use表达式要稳定可哈希:避免使用含空格、换行或动态计算的值;推荐用属性或标准化后的文本(如
normalize-space(name))。 - generate-id()不可跨处理器保证唯一:但它在同一文档、同一执行中对同一节点始终返回相同ID,因此组内比较完全可靠。
-
XSLT 2.0+用户不必强用此法:直接用
更直观安全,Muenchian主要用于兼容旧系统或学习底层机制。










