<?xml version="1.0" standalone="no"?>
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!--
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
-->
<!-- $Id$ -->
  <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>
