在XML数据转换的过程中,经常需要根据XML节点的不同内容输出差异化的结果,XSLT提供的xsl:if和xsl:choose元素就是用来实现这类条件处理逻辑的核心工具。两者分别适配不同的判断场景,合理使用可以大幅提升XML转换的灵活性。

xsl:if的基本用法
xsl:if用于实现单一条件的判断,当条件成立时执行内部的模板内容,不成立则跳过。它的核心属性是test,用来编写判断条件,条件表达式遵循XPath语法规则。
语法结构
<xsl:if test="条件表达式">
<!-- 条件成立时输出的内容 -->
</xsl:if>
使用示例
假设我们有一个存储学生信息的XML文件,需要根据学生的分数判断是否需要标注优秀:
学生信息XML内容:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<name>张三</name>
<score>92</score>
</student>
<student>
<name>李四</name>
<score>78</score>
</student>
</students>
对应的XSLT样式表使用xsl:if判断分数是否大于等于90:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h3>学生成绩列表</h3>
<ul>
<xsl:for-each select="students/student">
<li>
<xsl:value-of select="name"/>:分数<xsl:value-of select="score"/>
<xsl:if test="score >= 90">
<strong>(优秀)</strong>
</xsl:if>
</li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
上述代码中,test属性里的score >= 90就是判断条件,当学生的score节点值大于等于90时,就会输出加粗的(优秀)标注。
xsl:choose的基本用法
当需要判断多个互斥的条件分支时,xsl:if就不太适用了,这时候可以使用xsl:choose。它的结构类似其他编程语言里的switch-case语句,由xsl:choose作为容器,内部包含多个xsl:when和一个可选的xsl:otherwise。
语法结构
<xsl:choose>
<xsl:when test="条件1">
<!-- 条件1成立时输出的内容 -->
</xsl:when>
<xsl:when test="条件2">
<!-- 条件2成立时输出的内容 -->
</xsl:when>
<xsl:otherwise>
<!-- 所有条件都不成立时输出的内容 -->
</xsl:otherwise>
</xsl:choose>
执行逻辑是从上到下依次判断xsl:when的test条件,第一个成立的条件对应的内容会被执行,后面的条件不再判断。如果所有xsl:when的条件都不成立,就会执行xsl:otherwise里的内容,xsl:otherwise可以省略。
使用示例
还是以学生信息为例,现在需要根据分数划分等级:大于等于90为优秀,大于等于80为良好,大于等于60为及格,其余为不及格。
对应的XSLT代码片段:
<xsl:for-each select="students/student">
<li>
<xsl:value-of select="name"/>:分数<xsl:value-of select="score"/>
<xsl:choose>
<xsl:when test="score >= 90">
等级:优秀
</xsl:when>
<xsl:when test="score >= 80">
等级:良好
</xsl:when>
<xsl:when test="score >= 60">
等级:及格
</xsl:when>
<xsl:otherwise>
等级:不及格
</xsl:otherwise>
</xsl:choose>
</li>
</xsl:for-each>
这段代码会先判断分数是否大于等于90,成立就输出优秀;不成立再判断是否大于等于80,以此类推,所有条件都不满足就输出不及格。
两者的适用场景对比
| 元素 | 适用场景 | 特点 |
|---|---|---|
| xsl:if | 单一条件的判断,不需要处理多分支 | 语法简单,只有条件成立和不成立两种结果,没有else分支 |
| xsl:choose | 多条件互斥的分支判断 | 支持多个条件分支,可设置默认分支,逻辑更清晰 |
注意事项
- test属性里的比较运算符需要转义,比如小于号要写成<,大于号要写成>,否则会和XML标签的语法冲突。
- xsl:if没有对应的else分支,如果需要实现if-else逻辑,要么用两个对立条件的xsl:if,要么改用xsl:choose。
- xsl:when的条件判断顺序很重要,要把范围更严格的条件放在前面,比如先判断>=90再判断>=80,否则会出现逻辑错误。
- 条件表达式里的节点路径要符合当前上下文,比如在xsl:for-each遍历student节点时,test里可以直接写score >= 90,不需要写students/student/score。
XSLTxsl_ifxsl_chooseXML条件处理修改时间:2026-06-10 22:54:24