XSLT作为XML样式转换语言,支持通过条件判断逻辑动态调整输出内容,其中xsl:if和xsl:choose是实现条件输出的两个核心元素,二者分别对应单条件判断和多分支条件判断的场景。

xsl:if元素的基础用法
xsl:if用于实现单条件判断,当指定的测试条件成立时,才会执行其内部的内容模板,语法结构相对简单,适合只需要判断一个条件的场景。
xsl:if的核心属性是test,test属性的值是一个布尔表达式,用来定义判断条件,表达式的语法遵循XPath的规则。
基础示例
假设我们有一个存储员工信息的XML文件,需要根据员工的薪资水平判断是否标注为高薪员工:
<?xml version="1.0" encoding="UTF-8"?>
<员工列表>
<员工>
<姓名>张三</姓名>
<薪资>15000</薪资>
</员工>
<员工>
<姓名>李四</姓名>
<薪资>8000</薪资>
</员工>
</员工列表>
对应的XSLT模板中使用xsl:if判断薪资是否大于等于10000:
<?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>
<ul>
<xsl:for-each select="员工列表/员工">
<li>
<xsl:value-of select="姓名"/>: <xsl:value-of select="薪资"/>元
<xsl:if test="薪资 >= 10000">
<strong>(高薪员工)</strong>
</xsl:if>
</li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
上述模板中,test属性的条件是薪资 >= 10000,当员工的薪资节点值满足该条件时,才会输出后面的strong标签内容。
xsl:choose元素的多分支用法
当需要判断多个互斥的条件,根据不同条件输出不同内容时,xsl:if就不够用了,这时候需要使用xsl:choose元素,它的逻辑和编程语言中的switch-case结构类似。
xsl:choose内部可以包含多个xsl:when子元素和一个可选的xsl:otherwise子元素,xsl:when也需要设置test属性定义判断条件,xsl:otherwise用于定义所有条件都不成立时的默认输出内容。
多分支示例
还是基于上面的员工信息XML,现在需要根据薪资划分不同的等级:
- 薪资大于等于20000:输出资深员工
- 薪资大于等于10000:输出正式员工
- 其他情况:输出试用期员工
对应的XSLT模板实现如下:
<?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>
<table border="1">
<tr>
<th>姓名</th>
<th>薪资</th>
<th>等级</th>
</tr>
<xsl:for-each select="员工列表/员工">
<tr>
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="薪资"/></td>
<td>
<xsl:choose>
<xsl:when test="薪资 >= 20000">资深员工</xsl:when>
<xsl:when test="薪资 >= 10000">正式员工</xsl:when>
<xsl:otherwise>试用期员工</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
这里需要注意xsl:choose的判断顺序,会从上到下依次判断xsl:when的test条件,第一个满足条件的xsl:when内部的内容会被输出,后面的xsl:when即使条件成立也不会再执行,所以条件的顺序需要根据业务逻辑合理设置。
两者的适用场景对比
为了更清晰地选择使用哪种条件元素,我们可以对比两者的差异:
在实际的XSLT开发中,如果只需要判断单个条件是否触发某段输出,优先使用xsl:if,结构更简洁;如果需要根据不同的条件值输出不同的内容,优先使用xsl:choose,逻辑更清晰,也更容易维护。
需要注意,xsl:if和xsl:when的test属性中的比较表达式,涉及大于小于符号时,在XML文档中需要进行转义,大于号转义为>,小于号转义为<,否则会导致XSLT模板语法错误。
XSLTxsl_ifxsl_chooseXML转换条件输出修改时间:2026-06-19 13:06:37