<?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:variable&gt; / &lt;xsl:param&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>Variables in XSLT are not really variables, as their values cannot be
  changed. They resemble constants from conventional programming languages. The
  only way in which a variable can be changed is by declaring it inside a
  for-each loop, in which case its value will be updated for every iteration.
  Top-level variables (variables that are direct child nodes of the
  <code>&lt;xsl:stylesheet&gt;</code> element) can never be changed.</p>

  <source>
    &lt;xsl:for-each select="/foo/bar">
      &lt;xsl:variable name="some-bar" select="."/>
      &lt;xsl:value-of select="$some-bar"/>
    &lt;/xsl:for-each></source>

  <p>Parameters are assigned a value either from the process that invoked
  the stylesheet (top-level parameter), or from a
  <code>&lt;xsl:with-param&gt;</code> or from a default value (in which case it
  behaves as if it was a variable).</p>

  <source>
    &lt;xsl:template match="/">
      &lt;xsl:call-template name="blob">
        &lt;xsl:with-param name="par" select="'some-value'"/>
      &lt;/xsl:call-template>
    &lt;/xsl:template>

    &lt;xsl:template name="blob">
      &lt;xsl:param name="par" select="'default-value'"/>
      &lt;xsl:value-of select="$param"/>
    &lt;/xsl:template></source>

  </s2>

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

    <p>Variables and parameters share a common base class
    <code>VariableBase</code> that contains a lot of common methods. This class
    handles both global and local variables/parameters.</p>

    <s3 title="Top-level parameters and variables">

    <p>All top-level (ie. global) parameters and variables are stored inside
    fields in the translet class. Variables are stored as objects or basic
    data types (such as boolean, char, int, etc.) while parameters have to be
    "boxed" inside an object. This is because parameters are also stored as
    objects inside the translet. The <code>addParameter()</code> method of the
    <code>AbstractTranslet</code> class stores the parameter in a Hashtable
    (the Hashtable maps the parameter name to the parameter value). The
    "boxing" of the parameter's value is done by the class that handles the
    parameters type. This class is a subclass of
    <code>org.apache.xalan.xsltc.compiler.util.Type</code>.</p>

    <p>Note that all top-level parameters and variables from all imported and
    included stylesheets will be placed as direct children of the top-level
    stylesheet in the AST. This done to make global variables truly global and
    not just global in the stylesheet where it was declared.</p>

    </s3>

    <s3 title="Local parameters and variables">

    <p>Local variables that are accessible from a given syntax tree node will
    first be put on the JVM's stack and stored in a local variable slot. This
    makes the variable or parameter accessible from all code within that
    method. But, in some special cases, the code that is compiled to handle an
    element/expression within the variable scope is not put inside the same
    method as the actual variable. This is the case for some predicates.
    All syntax-tree nodes implement the <code>isClosureBoundary()</code> method
    to indicate if its child an ancestor nodes will end up in a different method
    then itself. This method is used by the <code>Variable</code> and
    <code>Param</code> classes to determine if the variable or parameter will
    "escape" the variable frame.</p>

    <source>
    &lt;xsl:for-each select="/foo/bar/baz">
        &lt;xsl:variable name="pos" select="3"/>
        &lt;xsl:apply-templates select="/foo/bar[$pos]"/>
    &lt;/xsl:for-each></source>

    <p>The predicate in this stylesheet fragment is compiled into a separate
    auxiliary class that implements the <code>Filter</code> interface. It will
    therefore not have access to the variable "pos" in the current stack frame.
    A common technique for cases like this is to use a <em>"closure"</em>. A
    closure is a record that contains references to all variables that are in
    scope for a certain part of the compiled scope. This is done in a very
    simple manner in XSLTC. All variables or parameters that can "escape" the
    stack are passed to the translet via its <code>addVariable()</code> method.
    They can then later be retrieved by the <code>getVariable()</code> method.
    </p>

    <p><em>Important note 1:</em> A predicate does not always result in a
    auxiliary class. In some cases we optimize the code by using tailored
    iterators and goodies like that instead. We may want to update the
    predicate code to check if an auxiliary class will be generated before
    returning true or false from the <code>isClosureBoundary()</code>
    method.</p>

    <p><em>Important note 2:</em> There could be other closure boundaries
    that we have not yet discovered or considered. This could be, for instance,
    sort records and other auxiliary classes:</p>

    <source>
    &lt;xsl:variable name="sort-order" select="'decending'"/>
    &lt;xsl:for-each select="/foo/bar/baz">
        &lt;xsl:sort select="@name" order="$sort-order"/>
        &lt;xsl:value-of select="."/>
    &lt;/xsl:for-each></source>

    <p>I would not be surprised if this fails. A fix could be to implement the
    <code>isClosureBoundary()</code> in the <code>Sort</code> class and have the
    method return 'true' in all cases.</p>

    </s3>

    <s3 title="Parameter and variable references">

    <p>A parameter or variable reference does the oposite of a parameter or
    variable. The value is read from either a global field, a local variable
    slot or from a call to <code>getVariable()</code> /
    <code>getParameter()</code>. The chosen method depends is we're dealing with
    a parameter or a variable, a global or a local, an escaping variable or not.
    </p>

    <p>The XPath parser identifies all variable references and instanciates
    either a <code>VariableRef</code> or a <code>ParameterRef</code>. The XPath
    parser calls the parser's <code>lookupVariable</code> method in an initial
    attempt to find the variable/parameter instance. If that fails, it goes on
    to call the symbol table's <code>lookupName()</code> method. If that also
    fails this means that either:</p>

    <ul>
      <li>a variable or parameter with the given name does not exist</li>
      <li>the variable will be declared at a later stage
      (but within the same scope)</li>
    </ul>

    <p>The XPath parser creates an instance of the <code>UnresolvedRef</code>
    class. This class attempts to locate the variable after the whole AST has
    been built, when the <code>typeCheck()</code> method is called. If this
    fails an error is reported and the compilation stops. Otherwise the class
    creates a <code>VariableRef</code> or a <code>ParameterRef</code> instance
    and lets that handle the reference.</p>

    </s3>

    <s3 title="Forward references">

    <p>XSLTC allows for forward references to global variables and parameters.
    You can even reference variables in not-yet included/imported stylesheets.
    In most cases, this is handled by changing the order of top-level elements.
    (Variables are placed first so that they are handled before any includes
    or imports).  But when a variable contains references to other variables,
    then this requires some extra code in the <code>Stylesheet</code> and
    <code>VariableBase</code> classes. The <code>VariableBase</code> has a
    method that returns a vector containing all variables that are referenced
    in the variable definition.</p>

    <source>
    &lt;xsl:variable name="C" select="$A &lt; $B"/>
    &lt;xsl:variable name="A" select="1"/>
    &lt;xsl:variable name="B" select="2"/></source>

    <p>In this case, the <code>getDependencies()</code> method for variable
    C will return the variables A and B. The stylesheet has a method called
    <code>resolveReferences</code> that will order the variables accordingly
    so that the variable values are computed in the desired order. This method
    will issue an error message and terminate the compilation if there are
    circular variable/parameter dependencies.</p>

    </s3>

  </s2>

</s1>
