XSLT中条件判断用xsl:if(单条件二元判断)和xsl:choose(多分支互斥选择);前者无else,后者含xsl:when和可选xsl:otherwise,适用场景与嵌套规范明确。

XSLT 中做条件判断主要靠 xsl:if 和 xsl:choose 两个元素,它们用途不同、结构不同,选错容易让模板逻辑变乱或漏输出。
xsl:if:单条件判断,满足就执行
它最像编程里的 if 语句,只处理“是/否”这种二元判断,没有 else 分支。test 属性必须是 XPath 表达式,结果为 true 才执行内部内容。
- 表达式为真才输出,否则跳过整块 —— 不会报错,也不会默认输出空内容
- 支持嵌套使用,但不推荐多层嵌套,可读性差且难维护
- 常见写法如:
高价商品
- 注意:字符串比较要用引号,比如
test="status = 'active'";属性访问加 @,如test="@type = 'vip'"
xsl:choose:多分支选择,类似 if-else if-else
当要根据多个互斥条件输出不同内容时,
- 每个
必须带 test 属性,条件从上到下依次判断 是可选的,默认兜底;没写且所有条件都不满足,整个 就不输出任何东西 - 适合分类场景,比如按类别、状态、数值区间区分显示:
category='fiction'、price 、price >= 5 and price - 避免把复杂逻辑塞进一个 test 里,可以拆成多个 when,更易调试和复用
什么时候用哪个?看判断维度
一句话判断标准:只有一个条件要处理,用
- 过滤列表项(如只显示价格 > 10 的 CD)→
放在 里面最合适 - 给同一节点按不同属性值渲染不同样式或文案 →
更直观,也方便后期加新分支 - 想模拟“if-else”,又不想写两个
(因为第二个 if 不受第一个影响,可能同时触发)→ 必须用 +
容易忽略的细节
这两个元素看着简单,但几个小地方常踩坑:
- test 表达式里不能用变量名直接写
$var,得用$var = 'xxx'这种完整比较形式 - 空节点、空字符串、数字 0 在 XPath 中都算 false,但字符串 '0' 或 'false' 反而是 true —— 判断前最好用 string() 或 number() 显式转换
必须包含至少一个 ,否则 XSLT 解析会失败 - 所有条件都写在 test 里,不支持在 when 内部再写 if —— 如需嵌套逻辑,应先用变量存中间结果
基本上就这些。用熟了你会发现,










