XSLT中标准的if-then-else逻辑通过<xsl:choose>配合<xsl:when>和<xsl:otherwise>实现,全版本兼容;XSLT 2.0+还支持XPath的if() then...else...表达式用于属性值模板或value-of中。

XSLT 本身没有 if-then-else 关键字,但可以通过 <xsl:choose> 配合 <xsl:when> 和 <xsl:otherwise> 实现等效逻辑,这是最标准、推荐的方式。
用 <xsl:choose> 模拟 if-then-else
这是 XSLT 1.0/2.0/3.0 全版本兼容的写法,结构清晰,语义明确:
<xsl:choose>
<xsl:when test="price > 100">
<span class="expensive">高价商品</span>
</xsl:when>
<xsl:otherwise>
<span class="affordable">普通商品</span>
</xsl:otherwise>
</xsl:choose>
说明:
-
test属性写 XPath 表达式,返回布尔值;为真时执行对应<xsl:when>内容 -
<xsl:otherwise>相当于 else 分支,最多只能有一个,且必须放在所有<xsl:when>之后 - 支持多个
<xsl:when>实现多条件判断(类似 if-else if-else)
在属性值模板中用 XPath 条件表达式(XSLT 2.0+)
如果只是简单地根据条件生成一个字符串或值(比如 class 名、文本内容),可用 XPath 的 if () then ... else ... 表达式,直接写在属性值模板或 <xsl:value-of> 中:
<div class="{if (@status = 'active') then 'online' else 'offline'}">
<xsl:value-of select="if (price < 50) then '低价' else '非低价'" />
</div>
注意:
- 仅适用于 XSLT 2.0 或更高版本(XSLT 1.0 不支持)
- 必须写在大括号
{}内(AVT,属性值模板)或<xsl:value-of select="..." />的select属性中 - then 和 else 后面都必须有值(不能留空),否则报错
避免常见错误
实际使用中容易踩的坑:
- 误用
<xsl:if>:它只有“if”没有“else”,无法单独实现二选一分支;想加 else 必须套一层<xsl:choose> - 忘记闭合:
<xsl:when>和<xsl:otherwise>是自闭合标签?不是!它们必须有显式结束标签或自闭合写法(如<xsl:when ... />)仅在无内容时才允许,但通常建议写全 - test 表达式写错:比如把
@type = 'book'写成type = 'book'(漏了@就变成子元素匹配)
简单三元逻辑的快捷写法(XSLT 1.0 兼容)
若只是输出两个字符串之一,也可用 XPath 的 concat() + 布尔转数字技巧(不推荐用于复杂逻辑,但轻量场景够用):
<xsl:value-of select="concat(
substring('是', 1 div (@admin = 'true')),
substring('否', 1 div (@admin != 'true'))
)" />
不过这种写法可读性差、难维护,仅作了解;生产环境强烈建议优先用 <xsl:choose>。
基本上就这些。核心记牢:标准写法是 <xsl:choose>,现代版本可选括号内 if-then-else 表达式,别硬套编程语言习惯去拼 <xsl:if>。










