<?xml version="1.0" standalone="no"?>
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!-- 
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 2001-2003 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>
