XSLT的用于遍历节点集合,需指定select属性(XPath表达式),内部上下文自动切换为当前节点,用position()获取序号,作用域限于块内,空选择静默跳过。

XSLT 的 <for-each></for-each> 是最常用的遍历工具,本质是“对选中的每个节点执行一次模板内容”,不带内置计数变量,也不改变全局上下文,用对了很简洁,用错了容易嵌套混乱。
核心写法就一条规则
必须带 select 属性,值是一个 XPath 表达式,指向你要遍历的节点集合:
-
<for-each select="book"></for-each>→ 遍历当前上下文下的所有book元素 -
<for-each select="catalog/cd[position() <= 5]"></for-each>→ 只取前 5 个cd节点 -
<for-each select="@id | @class"></for-each>→ 遍历当前元素的id和class两个属性(联合轴)
循环里怎么取当前节点的内容
在 <for-each></for-each> 内部,上下文节点自动切换为当前被遍历的节点,所以:
-
<value-of select="."></value-of>→ 输出当前节点的字符串值(文本内容) -
<value-of select="title"></value-of>→ 输出当前节点下子元素title的文本 -
<value-of select="../@category"></value-of>→ 向上查父节点的category属性 -
<if test="price > 10">…</if>→ 基于当前节点做条件判断
想加序号?别手写变量,用 position() 就行
XSLT 没有传统 for 循环的 i++,但 position() 函数天然返回当前迭代位置(从 1 开始):
-
<value-of select="position()"></value-of>→ 输出 1、2、3… -
<number format="A. "></number>→ 输出 A.、B.、C.…(更语义化,支持嵌套编号) - 组合用:
<value-of select="title"></value-of>
常见踩坑提醒
- 不能在
<for-each></for-each>外面直接引用循环内定义的<variable></variable>—— 它的作用域仅限该 for-each 块内部 - 不要试图在 for-each 里“修改”当前 xml 结构 —— XSLT 是函数式语言,只生成新输出,不变更源文档
- 如果需要复杂逻辑(比如递归处理子树),优先用
<apply-templates></apply-templates>+ 模板匹配,而不是硬套多层 for-each - select 表达式为空时,整个 for-each 块静默跳过,不会报错也不会渲染内容
基本上就这些。写熟了 select + position() + . 这三个点,90% 的列表场景都能干净搞定。