<!--
 * 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: package.html 468643 2006-10-28 06:56:03Z minchau $ -->
<html>
  <title>Xalan Templates Package.</title>
  <body>
    <p>Implements the {@link javax.xml.transform.Templates} interface, 
    and defines a set of classes that represent an XSLT stylesheet.</p>
    
    <p>{@link org.apache.xalan.templates.StylesheetRoot} implements the {@link javax.xml.transform.Templates} interface, and 
    extends {@link org.apache.xalan.templates.StylesheetComposed}, 
    which is a {@link org.apache.xalan.templates.Stylesheet} composed of itself 
    and its included Stylesheet objects. A StylesheetRoot also contains a 
    global list of all imported StylesheetComposed objects. The
    role of these objects is to hold immutable stylesheet data, not to perform 
    procedural tasks associated with the
    construction of the data (the org.apache.xalan.processor package) or with the transformation (the org.apache.xalan.transformer
    package).</p>
    <p>{@link org.apache.xalan.templates.ElemTemplateElement} is the superclass of 
    all XSLT instruction elements, including Stylesheet. The <i>x</i>Func classes
    extend members of the org.apache.xpath package and implement XSLT functions. Unlike 
    the Stylesheet "container" objects, the
    instruction element and function classes do contain procedural execute() 
    methods that are called during the transformation.</p>
    <p>
 </body>
</html>


