Tests multiple conditions in conjunction with the <xsl:otherwise> and <xsl:when> elements.
<xsl:choose> </xsl:choose>
| Number of occurrences | Unlimited |
| Parent elements | xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements |
| Child elements | xsl:otherwise, xsl:when |
The <xsl:when> children of the <xsl:choose> element are tested, in order from top to bottom, until a test attribute on one of these elements accurately describes conditions in the source data, or until an <xsl:otherwise> element is reached. Once an <xsl:when> or <xsl:otherwise> element is chosen, the <xsl:choose> block is exited. No explicit break or exit statement is required.
For simple conditional testing, use the <xsl:if> element.
The following example shows a template for <order> elements, and inserts a size indicator before the contents of each <order>. This size indicator is based on the value of the <total> element within each <order> element. If the total is less than 10, the text "(small)" is added. If the total is less than 20, the text "(medium)" is added. If the total is 20 or more, the text "(large)" is added.
Note To test this example, you need to use a script. For more information, see Initiate XSLT in a Script.
XML File (order.xml)
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="refchoose.xsl" ?>
<orders>
<order>
<lineitem/>
<lineitem/>
<total>9</total>
</order>
<order>
<lineitem/>
<lineitem/>
<total>19</total>
</order>
<order>
<lineitem/>
<lineitem/>
<total>29</total>
</order>
</orders>
XSLT File (refchoose.xsl)
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="order">
<xsl:choose>
<xsl:when test="total < 10">
(small)
</xsl:when>
<xsl:when test="total < 20">
(medium)
</xsl:when>
<xsl:otherwise>
(large)
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates />
<BR/>
</xsl:template>
</xsl:stylesheet>
Output
(small) 9
(medium) 19
(large) 29
Defining Conditional Templates Using <xsl:if> and <xsl:choose>