XSLT <xsl:choose> – Advanced Conditional Logic with Multiple Branches
Introduction – Why Learn <xsl:choose>?
While <xsl:if> handles basic conditions, what if you need multiple branches, like a classic if…else if…else structure? That’s exactly what <xsl:choose> offers. It allows you to define multiple conditions and fallback logic using <xsl:when> and <xsl:otherwise>, giving you full control over how your transformation responds to different XML content.
In this guide, you’ll learn:
- What
<xsl:choose>is and how it works - How to use
<xsl:when>and<xsl:otherwise> - Examples of complex conditional rendering in XML
- Best practices and common mistakes to avoid
Syntax of <xsl:choose>
<xsl:choose>
<xsl:when test="XPathExpression1">
<!-- output if first condition is true -->
</xsl:when>
<xsl:when test="XPathExpression2">
<!-- output if second condition is true -->
</xsl:when>
<xsl:otherwise>
<!-- fallback if no conditions are true -->
</xsl:otherwise>
</xsl:choose>
- Use one or more
<xsl:when>for conditional branches - Use
<xsl:otherwise>for fallback content (optional but recommended)
Sample XML
<book>
<title>Mastering XSLT</title>
<price>499</price>
</book>
Example – Price-Based Labels
<xsl:choose>
<xsl:when test="price < 300">
<p><strong>Budget</strong></p>
</xsl:when>
<xsl:when test="price < 600">
<p><strong>Standard</strong></p>
</xsl:when>
<xsl:otherwise>
<p><strong>Premium</strong></p>
</xsl:otherwise>
</xsl:choose>
Output for <price>499</price>:
<p><strong>Standard</strong></p>
Example – Check Attribute with Fallback
<xsl:choose>
<xsl:when test="@status='in-stock'">
<p>Available Now</p>
</xsl:when>
<xsl:when test="@status='preorder'">
<p>Pre-Order Available</p>
</xsl:when>
<xsl:otherwise>
<p>Out of Stock</p>
</xsl:otherwise>
</xsl:choose>
Use Inside <xsl:for-each>
<xsl:for-each select="catalog/book">
<h3><xsl:value-of select="title"/></h3>
<xsl:choose>
<xsl:when test="price < 400">
<p>Discounted</p>
</xsl:when>
<xsl:otherwise>
<p>Regular Price</p>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
Dynamically labels each book based on its price.
Multiple Conditions in One Test
<xsl:when test="@type='ebook' and price < 200">
<p>Affordable eBook</p>
</xsl:when>
You can use logical operators: and, or, not() in the test condition.
<xsl:choose> vs <xsl:if>
| Feature | <xsl:choose> | <xsl:if> |
|---|---|---|
| Multi-branch | Supports multiple when conditions | Single condition only |
| Else logic | via <xsl:otherwise> | No else branch |
| Use case | Complex branching, mutually exclusive | Simple true/false tests |
Best Practices for <xsl:choose>
- ✔️ Use when multiple outcomes are possible
- ✔️ Always include
<xsl:otherwise>to handle unexpected values - ✔️ Use clear, non-overlapping conditions in
testattributes - Don’t mix with
<xsl:if>for the same logic—it reduces readability
Summary – Recap & Next Steps
<xsl:choose> gives you full control over conditional rendering in XML transformations. With it, you can handle branching logic, default values, and multiple rules—just like if/else structures in other programming languages.
Key Takeaways:
- Use
<xsl:choose>for multi-branch decision making - Pair with
<xsl:when>for conditions and<xsl:otherwise>for defaults - Works great inside loops and templates for dynamic rendering
Real-world relevance: Used in templating engines, decision trees, XML-based configuration display, e-commerce pricing labels, and content variations.
FAQs – XSLT <choose>
Is <xsl:otherwise> required?
No, but it’s recommended to catch all unmatched cases.
Can I nest <xsl:choose> inside another?
Yes. Nested conditionals are valid.
Can I combine conditions in test?
Yes. Use XPath operators like and, or, and not().
Can <xsl:choose> replace all uses of <xsl:if>?
Technically yes, but <xsl:if> is better for single, simple conditions.
What happens if none of the <xsl:when> tests match?
The <xsl:otherwise> block is executed (if present); otherwise, no output.
Share Now :
