XSLT中条件输出靠xsl:if(单条件判断,无else)和xsl:choose(多分支选择,含xsl:when与可选xsl:otherwise);二者均不生成元素,仅控制模板逻辑执行,且须置于xsl:template等有效上下文中。

XSLT 中根据条件改变输出,主要靠 xsl:if 和 xsl:choose 两类指令,它们不生成元素,只控制是否执行某段模板逻辑。核心区别是:xsl:if 适合单条件判断(类似 if),xsl:choose 适合多分支选择(类似 if-else if-else)。
用 xsl:if 做简单开关式判断
xsl:if 接收一个 test 属性,表达式为 true 时才处理其内部内容。它没有 else 分支,也不支持嵌套 else —— 需要“否则”逻辑,得另写一个带取反条件的 xsl:if,或改用 xsl:choose。
- 判断节点是否存在:
<xsl:if test="price">有价格</xsl:if> - 判断数值大小:
<xsl:if test="price > 100">高价商品</xsl:if> - 判断字符串非空:
<xsl:if test="normalize-space(name)"><xsl:value-of select="name"/></xsl:if>(避免空白字符干扰)
用 xsl:choose 实现多路分支
xsl:choose 必须包含至少一个 xsl:when,可选一个 xsl:otherwise 作为兜底。执行时从上到下匹配第一个为 true 的 when,之后不再检查其余分支 —— 类似 switch 或 if-else if-else 链。
- 按状态分类显示:
<xsl:choose>
<xsl:when test="status = 'in-stock'">✅ 有货</xsl:when>
<xsl:when test="status = 'backorder'">⏳ 预订中</xsl:when>
<xsl:otherwise>❌ 缺货</xsl:otherwise>
</xsl:choose> -
test可用函数组合:比如test="starts-with(name, 'A') and price < 50" - 注意:多个
xsl:when条件之间互斥性需自行保证,XSLT 不校验逻辑重叠
常见误区和实用建议
条件表达式里的值比较要小心类型。例如 test="type = 'book'" 是字符串比较,而 test="count(author) > 1" 返回的是数字,XSLT 会自动转换,但显式用 number() 或 string() 更可控。
- 空节点、缺失属性在布尔上下文中为 false,所以
test="author"等价于“author 元素存在且非空” - 避免在
test中写复杂逻辑;可先用xsl:variable存中间结果,提升可读性 -
xsl:if和xsl:choose不能直接作为根元素,必须放在模板(xsl:template)或其他可执行上下文中










