<?xml version="1.0" standalone="no"?>
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!-- 
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 2001 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Xalan" and "Apache Software Foundation" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation and was
 * originally based on software copyright (c) 2001, Sun
 * Microsystems., http://www.sun.com.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 -->
  <s1 title="&lt;xsl:choose&gt; / &lt;xsl:when&gt; / &lt;xsl:otherwise&gt;">

  <s2 title="Contents">
  <ul>
    <li><link anchor="functionality">Functionality</link></li>
    <li><link anchor="implementation">Implementation</link></li>    
  </ul>
  </s2>

  <anchor name="functionality"/>
  <s2 title="Functionality">

  <p>The <code>&lt;xsl:choose&gt;</code> element is used to determine one
  course of action based on a series of tests. Each test is done inside an
  <code>&lt;xsl:when&gt;</code> element. If a test succeeds, the body of the
  <code>&lt;xsl:when&gt;</code> element is executed. If no tests fail then
  a <code>&lt;xsl:otherwise&gt;</code> element can be used to specify a
  default action:</p>

  <source>
    &lt;xsl:choose>
      &lt;xsl:when test="element-available('some-extension')">
          ...
      &lt;/xsl:when>
      &lt;xsl:when test="function-availabe('saxon:nodeset')">
          ...
      &lt;/xsl:when>
      &lt;xsl:otherwise>
          ...
      &lt;/xsl:otherwise>
    &lt;/xsl:choose></source>

  </s2>

  <anchor name="implementation"/>
  <s2 title="Implementation">

  <p>The <code>Choose</code> class places all <code>When</code> child-nodes
  in a vector. The <code>Choose</code> class translates the "test"-attribute
  of all <code>When</code> nodes (in strict order) and chains them together
  in an if-else style. The expression that holds each test contains a true-
  and a false-list. These lists are vectors of branch targets that should be
  used if the test succeeds or fails, respectively. The first test's
  false-list is pointed to the start of the next test (ie. if the first test
  fails, then we run the next test). The last test's false-list points directly
  to the code for the body of the <code>&lt;xsl:otherwise&gt;</code> element.
  </p>

  <p>Just as with the <code>&lt;xsl:if&gt;</code>-element, special care is
  taken for the <code>element-available()</code> and
  <code>function-available()</code> functions. These functions are evaluated at
  compile-time (this can be done since all parameters for these functions are
  literals) and the body of a <code>&lt;xsl:when&gt;</code> element is not
  compiled if we know that it will never be needed at runtime.</p>

  </s2>

</s1>
