XSLT <choose> 元素详解

基本概念

<choose> 是 XSLT 中用于实现条件分支的核心元素,通常与 <when><otherwise> 结合使用。其功能类似于其他编程语言中的 switch-caseif-elseif-else 结构。<choose> 允许根据不同的条件动态选择模板或输出内容,适用于需要多条件判断的场景。

语法结构如下:

<xsl:choose>
    <xsl:when test="条件表达式1">
        <!-- 条件1为真时的内容 -->
    </xsl:when>
    <xsl:when test="条件表达式2">
        <!-- 条件2为真时的内容 -->
    </xsl:when>
    <xsl:otherwise>
        <!-- 默认内容 -->
    </xsl:otherwise>
</xsl:choose>
关键特性
  1. 条件优先级
    <when> 按从上到下的顺序依次检查条件,第一个满足条件的分支会被执行,后续分支即使条件为真也会被忽略。

  2. 默认分支
    <otherwise> 是可选的,仅当所有 <when> 条件均不满足时触发。若无 <otherwise> 且无匹配条件,<choose> 不输出任何内容。

  3. 表达式灵活性
    test 属性支持 XPath 表达式,可结合逻辑运算符(如 andor)、比较运算符(如 =!=)或函数调用(如 contains()starts-with())。

示例解析

示例1:根据节点值选择输出

<xsl:template match="book">
    <xsl:choose>
        <xsl:when test="@category='fiction'">
            <p>Fiction Book: <xsl:value-of select="title"/></p>
        </xsl:when>
        <xsl:when test="@category='science'">
            <p>Science Book: <xsl:value-of select="title"/></p>
        </xsl:when>
        <xsl:otherwise>
            <p>Other Category: <xsl:value-of select="title"/></p>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
  • bookcategory 属性为 fiction,输出带分类标签的标题。
  • 若为 science,输出对应标签。
  • 其他情况触发 <otherwise>

示例2:数值范围判断

<xsl:template match="score">
    <xsl:choose>
        <xsl:when test=". >= 90">
            <p>Grade: A</p>
        </xsl:when>
        <xsl:when test=". >= 80">
            <p>Grade: B</p>
        </xsl:when>
        <xsl:otherwise>
            <p>Grade: C</p>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
  • 根据 score 的文本内容判断分数段并输出等级。
常见问题与优化

避免冗余条件
确保 <when> 条件的顺序合理。例如,范围检查应从大到小排列,否则可能因优先级错误导致逻辑漏洞。

结合变量提升可读性
复杂条件可先通过 <xsl:variable> 定义中间结果:

<xsl:variable name="isDiscount" select="price < 50"/>
<xsl:choose>
    <xsl:when test="$isDiscount">
        <p>Discounted Item</p>
    </xsl:when>
</xsl:choose>

性能考虑
频繁使用的条件表达式建议预计算为变量,减少重复求值开销。

对比 <if><choose>
  • <xsl:if> 仅支持单一条件,无多分支能力。
  • <choose> 更适用于多条件场景,逻辑更清晰且易于扩展。

通过灵活运用 <choose>,可以高效处理复杂的动态内容生成需求,提升 XSLT 模板的可维护性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐