<?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:if&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>This element is cruical to XSL processing, but still very simple both in
  its use and implementation. The element is used like this:</p><source>
  &lt;xsl:if test="contains($the-world,'Elvis')">
    &lt;xsl:message>Elvis is still alive!&lt;/xsl:message>
  &lt;/xsl:if></source>

  <p>The element's contents will only be executed if the test succeeds. There
  is no <code>&lt;xsl:else&gt;</code> element. One has to use either several
  <code>&lt;xsl:if&gt;</code>-elements or use a choose-element.</p>

  </s2>

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

  <p>The basic implementation is very simple:</p>
  <ul>
    <li>execute the expression from the 'test'-attribute</li>
    <li>evaluate the resulting boolean value</li>
    <li>ignore the element contents if the value is 'false'</li>
    <li>otherwise execute the element contents</li>
  </ul>

  <p>There is onle type of function call that makes this a bit more complicated.
  The <code>function-available()</code> and <code>element-available()</code>
  function calls can be used to test for extension elements and functions. A
  very common use for these is to encapsulate all references to extension
  elements inside an <code>&lt;xsl:if&gt;</code> element and test for the
  existance of this element before attempting to use it. XSLTC has to support
  this. Otherwise we may risk either outputting erronuous error or warning
  messages about acessing non-existing elements, or even worse, compiling in
  calls to non-existing methods in the translet, causing the JVM's verifier to
  prevent the translet from being loaded.</p>

  <p>The <code>function-available()</code> and <code>element-available()</code>
  functions have been updated to perform an evaluation at compile-time, so that
  the <code>If</code> class can know wether to compile in calls to extensions or
  not. This is possible because both functions take only literal expressions as
  parameters. See the <code>getResult()</code> methods of the
  <code>FunctionAvailableCall</code> and <code>ElementAvailableCall</code>
  classes for details.</p>

  </s2>

</s1>
