17370845950

XSLT如何根据条件改变输出 xsl:if和xsl:choose
XSLT中条件输出靠xsl:if(单条件判断,无else)和xsl:choose

(多分支选择,含xsl:when与可选xsl:otherwise);二者均不生成元素,仅控制模板逻辑执行,且须置于xsl:template等有效上下文中。

XSLT 中根据条件改变输出,主要靠 xsl:ifxsl:choose 两类指令,它们不生成元素,只控制是否执行某段模板逻辑。核心区别是:xsl:if 适合单条件判断(类似 if),xsl:choose 适合多分支选择(类似 if-else if-else)。

用 xsl:if 做简单开关式判断

xsl:if 接收一个 test 属性,表达式为 true 时才处理其内部内容。它没有 else 分支,也不支持嵌套 else —— 需要“否则”逻辑,得另写一个带取反条件的 xsl:if,或改用 xsl:choose

  • 判断节点是否存在:有价格
  • 判断数值大小:高价商品
  • 判断字符串非空:(避免空白字符干扰)

用 xsl:choose 实现多路分支

xsl:choose 必须包含至少一个 xsl:when,可选一个 xsl:otherwise 作为兜底。执行时从上到下匹配第一个为 true 的 when,之后不再检查其余分支 —— 类似 switch 或 if-else if-else 链。

  • 按状态分类显示:

      ✅ 有货
      ⏳ 预订中
      ❌ 缺货
  • test 可用函数组合:比如 test="starts-with(name, 'A') and price
  • 注意:多个 xsl:when 条件之间互斥性需自行保证,XSLT 不校验逻辑重叠

常见误区和实用建议

条件表达式里的值比较要小心类型。例如 test="type = 'book'" 是字符串比较,而 test="count(author) > 1" 返回的是数字,XSLT 会自动转换,但显式用 number()string() 更可控。

  • 空节点、缺失属性在布尔上下文中为 false,所以 test="author" 等价于“author 元素存在且非空”
  • 避免在 test 中写复杂逻辑;可先用 xsl:variable 存中间结果,提升可读性
  • xsl:ifxsl:choose 不能直接作为根元素,必须放在模板(xsl:template)或其他可执行上下文中