xsl:for-each-group 是 XSLT 2.0+ 按条件分组的核心指令,需指定 select 和 group-by 属性,支持 group-adjacent、group-starting-with 等多种分组方式,并依赖 current-grouping-key()、current-group() 等函数获取上下文。
xsl:for-each-group
是 XSLT 2.0 及以上版本中用于按指定条件对节点分组的核心指令,它比 XSLT 1.0 中手动模拟分组(如 Muenchian 方法)更直观、简洁、可靠。
基本语法和必需属性
最简形式需指定两个关键属性:
select
:要遍历并分组的节点集(如
)
group-by
:分组依据的表达式(如
或
)
例如,按商品类别分组:
Category:
常用分组方式
除了
,XSLT 还支持更灵活的分组策略:
jQuery缩略图网格排列大图切换代码
jQuery缩略图网格排列大图切换代码是一款将所有缩略图以网格形式排列,当用户点击某张缩略图时,会以九宫格切片组合动画的方式组合出高清大图,效果非常棒。
下载
group-adjacent
:只对相邻且值相同的节点分组(适合已排序数据,如日志按日期连续块分组)
group-starting-with
:以匹配某模式的节点为每组起点(如把
当作章节头,其后所有非
节点归入该组)
group-ending-with
:以匹配某模式的节点为每组终点(较少用,但可配合
实现区间分组)
关键辅助函数
在
内部,必须用这些函数获取分组上下文:
current-grouping-key()
:返回当前组的分组键值(即
表达式的计算结果)
current-group()
:返回当前组内所有节点组成的序列(注意:不是原始顺序的子集,而是按文档顺序
排列
的该组全部节点)
position()
和
last()
:在
内有效,可用于标序号或判断首尾
注意事项和常见坑
使用时需留意几点:
必须用 XSLT 2.0+
处理器
(如 Saxon 9+、Altova RaptorXML),XSLT 1.0 不支持
表达式结果会自动原子化(atomic),字符串比较默认区分大小写;如需忽略大小写,写成
空值(
或
)会被当作独立的一组,必要时用
预处理
若想保留原始顺序中各组的出现次序,无需额外操作;但组内节点顺序始终是文档顺序,不是 select 序列中的原始位置顺序
基本上就这些。掌握
+
+
这个组合,就能覆盖绝大多数分组需求。
//item@categorysubstring(@date, 1, 4)Category:
group-bygroup-starting-withxsl:for-each-groupgroup-bycurrent-group()group-byupper-case(@category)''empty()normalize-space()group-bycurrent-group()current-grouping-key()