dleslie     01/06/27 13:24:58

  Modified:    java/xdocs/sources/design design2_0_0.xml
  Log:
  Fixed anchors and use of <code> to enable transformation to DITA
  along with the "standard" Xalan xml sources.
  
  Revision  Changes    Path
  1.4       +51 -46    xml-xalan/java/xdocs/sources/design/design2_0_0.xml
  
  Index: design2_0_0.xml
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/xdocs/sources/design/design2_0_0.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- design2_0_0.xml   2001/01/12 07:46:58     1.3
  +++ design2_0_0.xml   2001/06/27 20:24:56     1.4
  @@ -1,7 +1,7 @@
   <?xml version="1.0"?>
  -<!DOCTYPE s1 SYSTEM "sbk:/style/dtd/document.dtd">
  +<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
   <s1 title="Xalan-J 2.0 Design">
  -  <p><link>Xalan-J 2.0 Design</link><img src="xmllogo.gif" alt="xmllogo.gif"/></p>
  +  <p><img src="xmllogo.gif" alt="xmllogo.gif"/></p>
     <p>Author: Scott Boag<br/>State: In Progress</p>
     <ul> 
           <li><link anchor="intro">Introduction</link></li>
  @@ -23,7 +23,6 @@
      <li><jump href="../apidocs/index.html">Xalan-J 2.0 Javadoc</jump></li>
     </ul><anchor name="intro"/>
     <s2 title="Introduction"> 
  -      <p><link>Introduction</link></p> 
         <p>This document presents the basic design for Xalan-J 2.0, which is a
                <jump 
href="http://www.awl.com/cseng/titles/0-201-89542-0/techniques/refactoring.htm";>refactoring</jump>
                and redesign of the Xalan-J 1.x processor.   This document will expand 
and grow over time, and is also incomplete in some sections, though hopefully overall 
accurate.  The reader should be able to get a good overall idea of the internal design 
of Xalan, and begin to understand the process flow, and also the technical 
challanges.</p> 
  @@ -63,9 +62,10 @@
         <p>Please note that the diagrams in this design document are meant to be
                useful abstractions, and may not always be exact.</p> 
     </s2><anchor name="requirements"/> 
  -  <s2 title="Xalan Requirements"><p><link>Xalan Requirements</link></p><p>These are 
the concrete general requirements of Xalan, as I understand them, and covering both 
the Java and C++ versions.  These requirements have been built up over time by 
experience with product groups and general users.</p><ol><li>Java, C++ 
Versions.</li><li>XSLT 1.0 conformance, and beyond. (i.e. conform to the current W3C 
recommendation).</li><li>Have design and Code understandable by Open Source 
Community.</li><li>Ability to interoperate with standard APIs.  (SAX2, DOM2, JAXP)  
[this is currently Less of an issue with C++].</li><li>High Performance (Raw 
performance, Incremental ability, Scaleability to large documents, Reduction of 
Garbage Collection for the Java version.)</li><li>Tooling API (Access stylesheet data 
structures, Access source node from result event, Ask runtime questions, Debugging 
API).</li><li>Support addressing of XML in standalone fashion (i.e. XPath 
API).</li><li>Extensibility (Ability to call Java, Ability to call JavaScript, other 
languages).</li><li>Multiple data sources (JDBC, LDAP, other data sources, Direct XML 
repository coupling).</li></ol></s2><anchor name="overarch"/> 
  +  <s2 title="Xalan Requirements">
  +  <p>These are the concrete general requirements of Xalan, as I understand them, 
and covering both the Java and C++ versions.  These requirements have been built up 
over time by experience with product groups and general users.</p><ol><li>Java, C++ 
Versions.</li><li>XSLT 1.0 conformance, and beyond. (i.e. conform to the current W3C 
recommendation).</li><li>Have design and Code understandable by Open Source 
Community.</li><li>Ability to interoperate with standard APIs.  (SAX2, DOM2, JAXP)  
[this is currently Less of an issue with C++].</li><li>High Performance (Raw 
performance, Incremental ability, Scaleability to large documents, Reduction of 
Garbage Collection for the Java version.)</li><li>Tooling API (Access stylesheet data 
structures, Access source node from result event, Ask runtime questions, Debugging 
API).</li><li>Support addressing of XML in standalone fashion (i.e. XPath 
API).</li><li>Extensibility (Ability to call Java, Ability to call JavaScript, other 
languages).</li><li>Multiple data sources (JDBC, LDAP, other data sources, Direct XML 
repository coupling).</li></ol></s2><anchor name="overarch"/> 
     <s2 title="Overview of Architecture"> 
  -      <p><link>Overview of Architecture</link></p><p>The following diagram shows 
the XSLT abstract processing model.  A transformation expressed in XSLT describes 
rules for transforming a <jump href="http://www.w3.org/TR/xpath#data-model";>Source 
Tree </jump> into a result tree. The transformation is achieved by associating 
patterns with templates. A pattern is matched against elements in the source tree. A 
template is instantiated to create part of the result tree. The result tree is 
separate from the source tree. The structure of the result tree can be completely 
different from the structure of the source tree. In constructing the result tree, 
elements from the source tree can be filtered and reordered, and arbitrary structure 
can be added.
  +      <p>The following diagram shows the XSLT abstract processing model.  A 
transformation expressed in XSLT describes rules for transforming a <jump 
href="http://www.w3.org/TR/xpath#data-model";>Source Tree </jump> into a result tree. 
The transformation is achieved by associating patterns with templates. A pattern is 
matched against elements in the source tree. A template is instantiated to create part 
of the result tree. The result tree is separate from the source tree. The structure of 
the result tree can be completely different from the structure of the source tree. In 
constructing the result tree, elements from the source tree can be filtered and 
reordered, and arbitrary structure can be added.
   
   </p><p>The term "tree", as used within this document, describes an
                         abstract structure that consists of nodes or events that may 
be produced by
  @@ -76,23 +76,23 @@
         <p>The internal architecture of Xalan 2.0 is divided into four major modules, 
and various smaller
                modules. The main modules are:</p> 
         <gloss> 
  -             <label><code><jump 
href="../apidocs/org/apache/xalan/processor/package-summary.html">org.apache.xalan.processor</jump></code></label>
 
  +             <label><jump 
href="../apidocs/org/apache/xalan/processor/package-summary.html">org.apache.xalan.processor</jump></label>
 
                <item>The module that processes the stylesheet, and provides the main
                  entry point into Xalan.</item> 
         </gloss> 
         <gloss> 
  -             <label><code><jump 
href="../apidocs/org/apache/xalan/templates/package-summary.html">org.apache.xalan.templates</jump></code></label>
 
  +             <label><jump 
href="../apidocs/org/apache/xalan/templates/package-summary.html">org.apache.xalan.templates</jump></label>
 
                <item>The module that defines the stylesheet structures, including the
                  Stylesheet object, template element instructions, and Attribute Value
                  Templates. </item> 
         </gloss> 
         <gloss> 
  -             <label><code><jump 
href="../apidocs/org/apache/xalan/transformer/package-summary.html">org.apache.xalan.transformer</jump></code></label>
 
  +             <label><jump 
href="../apidocs/org/apache/xalan/transformer/package-summary.html">org.apache.xalan.transformer</jump></label>
 
                <item>The module that applies the source tree to the Templates, and
                  produces a result tree.</item> 
         </gloss> 
         <gloss> 
  -             <label><code><jump 
href="../apidocs/org/apache/xpath/package-summary.html">org.apache.xpath</jump></code></label>
 
  +             <label><jump 
href="../apidocs/org/apache/xpath/package-summary.html">org.apache.xpath</jump></label>
 
                <item>The module that processes both XPath expressions, and XSLT Match
                  patterns.</item> 
         </gloss> 
  @@ -108,45 +108,44 @@
         <p>In addition to the above packages, there are the following additional
                packages:</p> 
         <gloss> 
  -             <label><code><jump 
href="../apidocs/org/apache/xalan/client/package-summary.html">org.apache.xalan.client</jump></code></label>
 
  +             <label><jump 
href="../apidocs/org/apache/xalan/client/package-summary.html">org.apache.xalan.client</jump></label>
 
                <item>This package has a client applet. I suspect this should be moved
                  into the samples directory.</item> 
         </gloss> 
         <gloss> 
  -             <label><code><jump 
href="../apidocs/org/apache/xalan/extensions/package-summary.html">org.apache.xalan.extensions</jump></code></label>
 
  +             <label><jump 
href="../apidocs/org/apache/xalan/extensions/package-summary.html">org.apache.xalan.extensions</jump></label>
 
                <item>This holds classes belonging to the Xalan extensions mechanism,
                  which allows Java code and script to be called from within a 
stylesheet.</item>
                
         </gloss> 
         <gloss> 
  -             <label><code><jump 
href="../apidocs/org/apache/xalan/lib/package-summary.html">org.apache.xalan.lib</jump></code></label>
 
  +             <label><jump 
href="../apidocs/org/apache/xalan/lib/package-summary.html">org.apache.xalan.lib</jump></label>
 
                <item>This is the built-in Xalan extensions library, which holds
                  extensions such as Redirect (which allows a stylesheet to produce 
multiple
                  output files).</item> 
         </gloss> 
         <gloss> 
  -             <label><code><jump 
href="../apidocs/org/apache/xalan/res/package-summary.html">org.apache.xalan.res</jump></code></label>
 
  +             <label><jump 
href="../apidocs/org/apache/xalan/res/package-summary.html">org.apache.xalan.res</jump></label>
 
                <item>This holds resource files needed by Xalan, such as error message
                  resources.</item> 
         </gloss> 
          
         <gloss> 
  -             <label><code><jump 
href="../apidocs/org/apache/xalan/trace/package-summary.html">org.apache.xalan.trace</jump></code></label>
 
  +             <label><jump 
href="../apidocs/org/apache/xalan/trace/package-summary.html">org.apache.xalan.trace</jump></label>
 
                <item>This package contains classes and interfaces that allow a caller 
to
                  add trace listeners to the transformation, allowing an interface to 
XSLT
                  debuggers and similar tools.</item> 
         </gloss> 
         <gloss> 
  -             <label><code><jump 
href="../apidocs/org/apache/xalan/xslt/package-summary.html">org.apache.xalan.xslt</jump></code></label>
 
  +             <label><jump 
href="../apidocs/org/apache/xalan/xslt/package-summary.html">org.apache.xalan.xslt</jump></label>
 
                <item>This package holds the Xalan2 command line processor.</item> 
         </gloss> 
     <p>A more conceptual view of this architecture is as follows:</p><p><img 
src="conceptual.gif" alt="Picture of conceptual architecture."/></p></s2><anchor 
name="process"/> 
     <s2 title="Process Module"> 
  -      <p><link>Processor Module</link></p> 
  -      <p>The <code><jump 
href="../apidocs/org/apache/xalan/processor/package-summary.html">org.apache.xalan.processor</jump></code>
 module implements the
  -             <code><jump 
href="../apidocs/javax/xml/transform/TransformerFactory.html">javax.xml.transform.TransformerFactory</jump></code>
 interface, which provides a
  +      <p>The <jump 
href="../apidocs/org/apache/xalan/processor/package-summary.html">org.apache.xalan.processor</jump>
 module implements the
  +             <jump 
href="../apidocs/javax/xml/transform/TransformerFactory.html">javax.xml.transform.TransformerFactory</jump>
 interface, which provides a
                factory method for creating a concrete Processor instance, and 
provides methods
  -             for creating a <code><jump 
href="../apidocs/javax/xml/transform/Templates.html">javax.xml.transform.Templates</jump></code>
 instance, which, in
  +             for creating a <jump 
href="../apidocs/javax/xml/transform/Templates.html">javax.xml.transform.Templates</jump>
 instance, which, in
                Xalan and XSLT terms, is the Stylesheet. Thus the task of the process 
module is
                to read the XSLT input in the form of a file, stream, SAX events, or a 
DOM
                tree, and produce a Templates/Stylesheet object.</p> 
  @@ -157,39 +156,38 @@
                module that can be created in a generalized fashion. This makes the 
validation
                object-to-class associations centralized and declarative.</p> 
         <p>The schema's root class is
  -             <code><jump 
href="../apidocs/org/apache/xalan/processor/XSLTSchema.html">org.apache.xalan.processor.XSLTSchema</jump></code>,
 and it is here that the
  +             <jump 
href="../apidocs/org/apache/xalan/processor/XSLTSchema.html">org.apache.xalan.processor.XSLTSchema</jump>,
 and it is here that the
                XSLT schema structure is defined. XSLTSchema uses
  -             <code><jump 
href="../apidocs/org/apache/xalan/processor/XSLTElementDef.html">org.apache.xalan.processor.XSLTElementDef</jump></code>
 to define elements, and
  -             <code><jump 
href="../apidocs/org/apache/xalan/processor/XSLTAttributeDef.html">org.apache.xalan.processor.XSLTAttributeDef</jump></code>
 to define attributes.
  +             <jump 
href="../apidocs/org/apache/xalan/processor/XSLTElementDef.html">org.apache.xalan.processor.XSLTElementDef</jump>
 to define elements, and
  +             <jump 
href="../apidocs/org/apache/xalan/processor/XSLTAttributeDef.html">org.apache.xalan.processor.XSLTAttributeDef</jump>
 to define attributes.
                Both classes hold the allowed namespace, local name, and type of 
element or
                attribute. The XSLTElementDef also holds a reference to a
  -             <code><jump 
href="../apidocs/org/apache/xalan/processor/XSLTElementProcessor.html">org.apache.xalan.processor.XSLTElementProcessor</jump></code>,
 and a sometimes a
  +             <jump 
href="../apidocs/org/apache/xalan/processor/XSLTElementProcessor.html">org.apache.xalan.processor.XSLTElementProcessor</jump>,
 and a sometimes a
                <code>Class</code> object, with which it can create objects that 
derive from
  -             <code><jump 
href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html">org.apache.xalan.templates.ElemTemplateElement</jump></code>.
 In addition, the
  +             <jump 
href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html">org.apache.xalan.templates.ElemTemplateElement</jump>.
 In addition, the
                XSLTElementDef instance holds a list of XSLTElementDef instances that 
define
                legal elements or character events that are allowed as children of the 
given
                element.</p> 
  -      <p>The implementation of the <code><jump 
href="../apidocs/javax/xml/transform/TransformerFactory.html">javax.xml.transform.TransformerFactory</jump></code>
  -             interface is in <code><jump 
href="../apidocs/org/apache/xalan/processor/TransformerFactoryImpl.html">org.apache.xalan.processor.TransformerFactoryImpl</jump></code>,
  -             which creates a <code><jump 
href="../apidocs/org/apache/xalan/processor/StylesheetHandler.html">org.apache.xalan.processor.StylesheetHandler</jump></code>
  +      <p>The implementation of the <jump 
href="../apidocs/javax/xml/transform/TransformerFactory.html">javax.xml.transform.TransformerFactory</jump>
  +             interface is in <jump 
href="../apidocs/org/apache/xalan/processor/TransformerFactoryImpl.html">org.apache.xalan.processor.TransformerFactoryImpl</jump>,
  +             which creates a <jump 
href="../apidocs/org/apache/xalan/processor/StylesheetHandler.html">org.apache.xalan.processor.StylesheetHandler</jump>
                instance. This instance acts as the ContentHandler for the parse 
events, and is
  -             handed to the <code><jump 
href="../apidocs/org/xml/sax/XMLReader.html">org.xml.sax.XMLReader</jump></code>, 
which the StylesheetProcessor
  +             handed to the <jump 
href="../apidocs/org/xml/sax/XMLReader.html">org.xml.sax.XMLReader</jump>, which the 
StylesheetProcessor
                uses to parse the XSLT document. The <code>StylesheetHandler</code> 
then receives the parse
                events, which maintains the state of the construction, and passes the 
events on
                to the appropriate <code>XSLTElementProcessor</code> for the given 
event, as dictated by the
                <code>XSLTElementDef</code> that is associated with the given 
event.</p> 
         </s2><anchor name="templates"/> 
     <s2 title="Templates Module"> 
  -      <p><link>Templates Module</link></p> 
  -      <p>The <code><jump 
href="../apidocs/org/apache/xalan/templates/package-summary.html">org.apache.xalan.templates</jump></code>
 module implements the
  -             <code><jump 
href="../apidocs/javax/xml/transform/Templates.html">javax.xml.transform.Templates</jump></code>
 interface, and defines a set of
  +      <p>The <jump 
href="../apidocs/org/apache/xalan/templates/package-summary.html">org.apache.xalan.templates</jump>
 module implements the
  +             <jump 
href="../apidocs/javax/xml/transform/Templates.html">javax.xml.transform.Templates</jump>
 interface, and defines a set of
                classes that represent a Stylesheet. The primary purpose of this 
module is to
                hold stylesheet data, not to perform procedural tasks associated with 
the
                construction of the data, nor tasks associated with the transformation 
itself.
                </p> 
  -      <p>The base class of all templates objects that are associated with an XSLT 
element is the <code><jump 
href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html">ElemTemplateElement</jump></code>
 object, which in turn implements <code><jump 
href="../apidocs/org/apache/xml/utils/UnImplNode.html">UnImplNode</jump></code>.   A 
<code>ElemTemplateElement</code> object must be immutable once it's constructed, so 
that it may be shared among multiple threads concurrently.  Ideally, a 
<code>ElemTemplateElement</code> should be a data object only, and be used via a 
visitor pattern.  However, in practice this is impractical, because it would cause too 
much data exposure and would have a significant impact on performance.  Therefore, 
each <code>ElemTemplateElement</code> class has an <code><jump 
href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html#execute(org.apache.xalan.transformer.TransformerImpl,
 org.w3c.dom.Node, org.apache.xml.utils.QName)">execute</jump></code> method where it 
performs it's transformation duties.  A <code>ElemTemplateElement</code> also knows 
it's position in the source stylesheet, and can answer questions about current 
namespace nodes.</p><p>A <code><jump 
href="../apidocs/org/apache/xalan/templates/StylesheetRoot.html">StylesheetRoot</jump></code>,
 which implements the
  -             <code>Templates</code> interface, is a type of <code><jump 
href="../apidocs/org/apache/xalan/templates/StylesheetComposed.html">StylesheetComposed</jump></code>,
  -             which is a <code><jump 
href="../apidocs/org/apache/xalan/templates/Stylesheet.html">Stylesheet</jump></code> 
composed of itself and all included
  +      <p>The base class of all templates objects that are associated with an XSLT 
element is the <jump 
href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html">ElemTemplateElement</jump>
 object, which in turn implements <jump 
href="../apidocs/org/apache/xml/utils/UnImplNode.html">UnImplNode</jump>.  A 
<code>ElemTemplateElement</code> object must be immutable once it's constructed, so 
that it may be shared among multiple threads concurrently.  Ideally, a 
<code>ElemTemplateElement</code> should be a data object only, and be used via a 
visitor pattern.  However, in practice this is impractical, because it would cause too 
much data exposure and would have a significant impact on performance.  Therefore, 
each <code>ElemTemplateElement</code> class has an <jump 
href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html#execute(org.apache.xalan.transformer.TransformerImpl,
 org.w3c.dom.Node, org.apache.xml.utils.QName)">execute</jump> method where it 
performs it's transformation duties.  A <code>ElemTemplateElement</code> also knows 
it's position in the source stylesheet, and can answer questions about current 
namespace nodes.</p><p>A <jump 
href="../apidocs/org/apache/xalan/templates/StylesheetRoot.html">StylesheetRoot</jump>,
 which implements the
  +             <code>Templates</code> interface, is a type of <jump 
href="../apidocs/org/apache/xalan/templates/StylesheetComposed.html">StylesheetComposed</jump>,
  +             which is a <jump 
href="../apidocs/org/apache/xalan/templates/Stylesheet.html">Stylesheet</jump> 
composed of itself and all included
                <code>Stylesheet</code> objects. A <code>StylesheetRoot</code> has a 
global
                imports list, which is a list of all imported 
<code>StylesheetComposed</code>
                instances. From each <code>StylesheetComposed</code> object, one can 
iterate
  @@ -210,45 +208,52 @@
          
     </s2><anchor name="transformer"/> 
     <s2 title="Transformer Module"> 
  -      <p><link>Transformer Module</link></p> 
  -      <p>The <jump 
href="../apidocs/org/apache/xalan/transformer/package-summary.html">Transformer</jump> 
module is in charge of run-time transformations.  The <jump 
href="../apidocs/org/apache/xalan/transformer/TransformerImpl.html">TransformerImpl</jump>
 object, which implements the TrAX <jump 
href="../apidocs/javax/xml/transform/Transformer.html">Transformer</jump> interface, 
and has an association with a <jump 
href="../apidocs/org/apache/xalan/templates/StylesheetRoot.html">StylesheetRoot</jump> 
object, begins the processing of the source tree (or provides a <jump 
href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html";>ContentHandler</jump>
 reference via the<code><jump 
href="../apidocs/org/apache/xalan/stree/SourceTreeHandler.html">SourceTreeHandler</jump></code>),
 and performs the transformation.  The Transformer package does as much of the 
transformation as it can, but element level operations are generally performed in the 
<jump 
href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html#execute(org.apache.xalan.transformer.TransformerImpl,
 org.w3c.dom.Node, 
org.apache.xalan.utils.QName)">ElemTemplateElement.execute(...)</jump> 
methods.</p><p>Result Tree events are fed into a <jump 
href="../apidocs/org/apache/xalan/transformer/ResultTreeHandler.html">ResultTreeHandler</jump>
 object, which acts as a layer between the direct calls to the result 
  +      <p>The <jump 
href="../apidocs/org/apache/xalan/transformer/package-summary.html">Transformer</jump> 
module is in charge of run-time transformations.  The <jump 
href="../apidocs/org/apache/xalan/transformer/TransformerImpl.html">TransformerImpl</jump>
 object, which implements the TrAX <jump 
href="../apidocs/javax/xml/transform/Transformer.html">Transformer</jump> interface, 
and has an association with a <jump 
href="../apidocs/org/apache/xalan/templates/StylesheetRoot.html">StylesheetRoot</jump> 
object, begins the processing of the source tree (or provides a <jump 
href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html";>ContentHandler</jump>
 reference via the <jump 
href="../apidocs/org/apache/xalan/stree/SourceTreeHandler.html">SourceTreeHandler</jump>),
 and performs the transformation.  The Transformer package does as much of the 
transformation as it can, but element level operations are generally performed in the 
<jump 
href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html#execute(org.apache.xalan.transformer.TransformerImpl,
 org.w3c.dom.Node, 
org.apache.xalan.utils.QName)">ElemTemplateElement.execute(...)</jump> 
methods.</p><p>Result Tree events are fed into a <jump 
href="../apidocs/org/apache/xalan/transformer/ResultTreeHandler.html">ResultTreeHandler</jump>
 object, which acts as a layer between the direct calls to the result 
   tree content handler (often a <jump 
href="../apidocs/org/apache/xalan/serialize/package-summary.html">Serializer</jump>), 
and the <code>Transformer</code>.  For one thing, 
    we have to delay the call to
    startElement(name, atts) because of the
    xsl:attribute and xsl:copy calls.  In other words,
    the attributes have to be fully collected before you
  - can call startElement.</p><p>Other important classes in this package 
are:</p><gloss><label>CountersTable and Counter</label><item>The <code><jump 
href="../apidocs/org/apache/xalan/transformer/Counter.html">Counter</jump></code> 
class does incremental counting for support of xsl:number.
  + can call startElement.</p><p>Other important classes in this package 
are:</p><gloss><label>CountersTable and Counter</label><item>The <jump 
href="../apidocs/org/apache/xalan/transformer/Counter.html">Counter</jump> class does 
incremental counting for support of xsl:number.
    This class stores a cache of counted nodes (m_countNodes). 
     It tries to cache the counted nodes in document order... 
  - the node count is based on its position in the cache list.  The <code><jump 
href="../apidocs/org/apache/xalan/transformer/CountersTable.html">CountersTable</jump></code>
 class is a table of counters, keyed by <code><jump 
href="../apidocs/org/apache/xalan/templates/ElemNumber.html">ElemNumber</jump></code> 
objects, each 
  + the node count is based on its position in the cache list.  The <jump 
href="../apidocs/org/apache/xalan/transformer/CountersTable.html">CountersTable</jump> 
class is a table of counters, keyed by <jump 
href="../apidocs/org/apache/xalan/templates/ElemNumber.html">ElemNumber</jump> 
objects, each 
    of which has a list of <code>Counter</code> 
objects.</item></gloss><gloss><label>KeyIterator, KeyManager, and 
KeyTable</label><item>These classes handle mapping of keys declared with the xsl:key 
element.  They attempt to work incrementally, locating nodes on request but indexing 
all as they traverse the tree, and stopping when the requested node is found.  If a 
requested node is not found, then the entire tree will be traversed.  Such is the 
nature of xsl:key.</item></gloss><gloss><label>TransformState</label><item>This 
interface is meant to be used by a consumer of SAX2 events produced by Xalan, and 
enables the consumer 
    to get information about the state of the transform.  It 
    is primarily intended as a tooling interface.</item></gloss><p>Even though the 
following modules are defined in the <code>org.apache.xalan</code> package, instead of 
the transformer package, they are defined in this section as they are mostly related 
to runtime transformation.</p><anchor name="stree"/>
  -  <s3 title="Stree Module"><p><link>Stree Module [And discussions about 
streaming]</link></p><p>The Stree module implements the default <jump 
href="http://www.w3.org/TR/xpath#data-model";>Source Tree </jump> for Xalan, that is to 
be transformed.  It implements read-only <jump 
href="http://www.w3.org/TR/DOM-Level-2/";>DOM2</jump> interfaces, and provides some 
information needed for fast transforms, such as document order indexes.  It also 
attempts to allow an incremental transform by launching the transform on a secondary 
thread as soon as the SAX2 <jump 
href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html#startDocument()">StartDocument</jump>
 event has occurred.  When the transform requests a node, and the node is not present, 
the getFirstChild and GetNextSibling methods will wait until the child node has 
arrived, or an <jump 
href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html#endElement(java.lang.String,%20java.lang.String,%20java.lang.String)">endElement</jump>
 event has occurred.</p><p>Note that the secondary thread is an issue.  It would be 
better to do the same thing as described above on a single thread, but using the 
parser in 'pull' mode, or simply with a parseNext method so the parse would occur in 
blocks.  However, this model would only be possible</p><p>This kind of incrementality 
is not perfect because it still requires an entire source tree to be concretely built. 
 There have been a lot of good discussions on the xalan-dev list about how to do 
static analysis of a stylesheet, and be able to allocate only the nodes needed by the 
transform, while they are needed (or not allocate source objects at all).</p></s3><s3 
title="Serializer Module"><p><link>Serializer Module</link></p><p>XML serialization is 
a term used for turning a tree or set of events into a stream, and should not be 
confused with Java object serialization.  The Xalan serializers implement the <jump 
href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html";>ContentHandler</jump>
 to turn parser events coming from the transform, into a stream of XML, HTML, or plain 
text.  The serializers also implement the <code><jump 
href="../apidocs/org/apache/xalan/serializer/Serializer.html">Serializer</jump></code> 
which allows the transform process to set XSLT output properties and the output stream 
or Writer.</p></s3><s3 title="Extensions Module"><p><link>Extensions 
Module</link></p><p>This package contains an implementation of Xalan Extension 
Mechanism, which uses the <jump 
href="http://oss.software.ibm.com/developerworks/opensource/bsf/";>Bean Scripting 
Framework</jump>.
  +  <s3 title="Stree Module [and discussions about streaming]">
  +  <p>The Stree module implements the default <jump 
href="http://www.w3.org/TR/xpath#data-model";>Source Tree </jump> for Xalan, that is to 
be transformed.  It implements read-only <jump 
href="http://www.w3.org/TR/DOM-Level-2/";>DOM2</jump> interfaces, and provides some 
information needed for fast transforms, such as document order indexes.  It also 
attempts to allow an incremental transform by launching the transform on a secondary 
thread as soon as the SAX2 <jump 
href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html#startDocument()">StartDocument</jump>
 event has occurred.  When the transform requests a node, and the node is not present, 
the getFirstChild and GetNextSibling methods will wait until the child node has 
arrived, or an <jump 
href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html#endElement(java.lang.String,%20java.lang.String,%20java.lang.String)">endElement</jump>
 event has occurred.</p><p>Note that the secondary thread is an issue.  It would be 
better to do the same thing as described above on a single thread, but using the 
parser in 'pull' mode, or simply with a parseNext method so the parse would occur in 
blocks.  However, this model would only be possible</p><p>This kind of incrementality 
is not perfect because it still requires an entire source tree to be concretely built. 
 There have been a lot of good discussions on the xalan-dev list about how to do 
static analysis of a stylesheet, and be able to allocate only the nodes needed by the 
transform, while they are needed (or not allocate source objects at all).</p></s3>
  +<anchor name="serializer"/>
  +<s3 title="Serializer Module">
  +<p>XML serialization is a term used for turning a tree or set of events into a 
stream, and should not be confused with Java object serialization.  The Xalan 
serializers implement the <jump 
href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html";>ContentHandler</jump>
 to turn parser events coming from the transform, into a stream of XML, HTML, or plain 
text.  The serializers also implement the <jump 
href="../apidocs/org/apache/xalan/serializer/Serializer.html">Serializer</jump> which 
allows the transform process to set XSLT output properties and the output stream or 
Writer.</p></s3><anchor name="extensions"/>
  +<s3 title="Extensions Module">
  +<p>This package contains an implementation of Xalan Extension Mechanism, which uses 
the <jump href="http://oss.software.ibm.com/developerworks/opensource/bsf/";>Bean 
Scripting Framework</jump>.
   
   The Bean Scripting Framework (BSF) is an architecture for incorporating scripting 
into Java applications and applets.  Scripting languages such as Netscape Rhino 
(Javascript), VBScript, Perl, Tcl, Python, NetRexx and Rexx can be used to augment 
XSLT's functionality.  In addition, the Xalan extension mechanism allows use of Java 
classes.  See the <jump href="http://xml.apache.org/xalan/extensions.html";>Xalan-J 2 
extension documentation</jump> for a description of using extensions in a stylesheet. 
Please note that the W3C XSL Working Group is working on a specification for standard 
extension bindings, and this module will change to follow that specification.  
</p><p>[More needed... -sb]</p></s3></s2><anchor name="xpath"/> 
     <s2 title="XPath Module"> 
  -      <p><link>XPath Module</link></p> 
         <p>This module is pulled out of the Xalan package, and put in the org.apache 
package, to emphasize that the intention is that this package can be used 
independently of the XSLT engine, even though it has dependencies on the Xalan utils 
module.</p><p><img src="org_apache.gif" alt="xalan ---> xpath"/></p> 
     <p>The XPath module first compiles the XPath strings into expression trees, and 
then executes these expressions via a call to the XPath execute(...) function.  </p>  
<p>Major classes are:</p><gloss><label>XPath</label><item>Represents a compiled XPath. 
 Major function is <code>XObject execute(XPathContext xctxt, Node contextNode, 
  -                         PrefixResolver 
namespaceContext).</code></item></gloss><gloss><label>XPathAPI</label><item>The 
methods in this class are convenience methods into the
  +                         PrefixResolver 
namespaceContext)</code>.</item></gloss><gloss><label>XPathAPI</label><item>The 
methods in this class are convenience methods into the
    low-level XPath API.</item></gloss><gloss><label>XPathContext</label><item>Used as 
the runtime execution context for 
XPath.</item></gloss><gloss><label>DOMHelper</label><item>Used as a helper for 
handling DOM issues.  May be subclassed to take advantage 
      of specific DOM 
implementations.</item></gloss><gloss><label>SourceTreeManager</label><item>bottlenecks
 all management of source trees.  The methods
    in this class should allow easy garbage collection of source 
  - trees, and should centralize parsing for those source 
trees.</item></gloss><gloss><label>Expression</label><item>The base-class of all 
expression objects, allowing polymorphic behaviors.</item></gloss><p>The general 
architecture of the XPath module is divided into the compiler, and categories of 
expression objects.</p><p><img src="xpath.gif" alt="xpath modules"/></p><p>The most 
important module is the axes module.  This module implements the DOM2 <jump 
href="http://www.w3.org/TR/DOM-Level-2/traversal.html#Iterator-overview";>NodeIterator</jump>
 interface, and is meant to allow XPath clients to either override the default 
behavior or to replace this behavior.</p><p>The <code><jump 
href="../apidocs/org/apache/xpath/axes/LocPathIterator.html">LocPathIterator</jump></code>
 and <code><jump 
href="../apidocs/org/apache/xpath/axes/UnionPathIterator.html">UnionPathIterator</jump></code>
 classes implement the <jump 
href="http://www.w3.org/TR/DOM-Level-2/java-binding.html#org.w3c.dom.traversal.NodeIterator";>NodeIterator</jump>
 interface, and polymorphically use <code><jump 
href="../apidocs/org/apache/xpath/axes/AxesWalker.html">AxesWalker</jump></code> 
derived objects to execute each step in the path.  The whole trick is to execute the 
<code>LocationPath</code> in depth-first document order so that nodes can be found 
without necessarily looking ahead or performing a breadth-first search.  Because a 
document order depth-first search requires state to be saved for many expressions, the 
default operations create "Waiter" clones that have to wait while the main 
<code>AxesWalkers</code> traverses child nodes (think carefully about what happens 
when a "//foo/baz" expression is executed).   Optimization is done by implementing 
specialized iterators and <code>AxesWalkers</code> for certain types of operations.  
The decision as to what type of iterator or walker will be created is done in the 
<code><jump 
href="../apidocs/org/apache/xpath/axes/WalkerFactory.html">WalkerFactory</jump></code> 
class.</p><p>[Frankly, the implementation of the default AxesWalker, with it's 
waiters, is the one totally incomprehensible part of Xalan.  It gets especially 
difficult because you can not look to the node ahead.  I would be very interested if 
any rocket scientists out there can come up with a better algorithm.]</p><anchor 
name="xpathdbconn"/><s3 title="XPath Database Connection"><p><link>XPath Direct 
Database Connections</link></p><p>An important part of the XPath design in both Xalan 
1 and Xalan 2, is to enable database connections to be used as drivers directly to the 
XPath <jump href="http://www.w3.org/TR/xpath#location-paths";>LocationPath</jump> 
handling.  This allows databases to be directly connected to the transform, and be 
able to take advantage of internal indexing and the like.  While in Xalan 1 this was 
done via the <jump 
href="http://xml.apache.org/xalan/apidocs/org/apache/xalan/xpath/XLocator.html";>XLocator</jump>
 interface, in Xalan 2 this interface is no longer used, and has been replaced by the 
DOM2 <jump 
href="http://www.w3.org/TR/DOM-Level-2/traversal.html#Iterator-overview";>NodeIterator</jump>
 interface.  An application or extension should be able to install their own 
NodeIterator for a given document.</p><p><img src="data.gif" 
alt="data.gif"/></p><p>[More to do]</p></s3></s2><anchor name="utils"/> 
  + trees, and should centralize parsing for those source 
trees.</item></gloss><gloss><label>Expression</label><item>The base-class of all 
expression objects, allowing polymorphic behaviors.</item></gloss><p>The general 
architecture of the XPath module is divided into the compiler, and categories of 
expression objects.</p><p><img src="xpath.gif" alt="xpath modules"/></p><p>The most 
important module is the axes module.  This module implements the DOM2 <jump 
href="http://www.w3.org/TR/DOM-Level-2/traversal.html#Iterator-overview";>NodeIterator</jump>
 interface, and is meant to allow XPath clients to either override the default 
behavior or to replace this behavior.</p><p>The <jump 
href="../apidocs/org/apache/xpath/axes/LocPathIterator.html">LocPathIterator</jump> 
and <jump 
href="../apidocs/org/apache/xpath/axes/UnionPathIterator.html">UnionPathIterator</jump>
 classes implement the <jump 
href="http://www.w3.org/TR/DOM-Level-2/java-binding.html#org.w3c.dom.traversal.NodeIterator";>NodeIterator</jump>
 interface, and polymorphically use <jump 
href="../apidocs/org/apache/xpath/axes/AxesWalker.html">AxesWalker</jump> derived 
objects to execute each step in the path.  The whole trick is to execute the 
<code>LocationPath</code> in depth-first document order so that nodes can be found 
without necessarily looking ahead or performing a breadth-first search.  Because a 
document order depth-first search requires state to be saved for many expressions, the 
default operations create "Waiter" clones that have to wait while the main 
<code>AxesWalkers</code> traverses child nodes (think carefully about what happens 
when a "//foo/baz" expression is executed).   Optimization is done by implementing 
specialized iterators and <code>AxesWalkers</code> for certain types of operations.  
The decision as to what type of iterator or walker will be created is done in the 
<jump href="../apidocs/org/apache/xpath/axes/WalkerFactory.html">WalkerFactory</jump> 
class.</p><p>[Frankly, the implementation of the default AxesWalker, with it's 
waiters, is the one totally incomprehensible part of Xalan.  It gets especially 
difficult because you can not look to the node ahead.  I would be very interested if 
any rocket scientists out there can come up with a better algorithm.]</p><anchor 
name="xpathdbconn"/>
  +<s3 title="XPath Database Connection">
  +<p>An important part of the XPath design in both Xalan 1 and Xalan 2, is to enable 
database connections to be used as drivers directly to the XPath <jump 
href="http://www.w3.org/TR/xpath#location-paths";>LocationPath</jump> handling.  This 
allows databases to be directly connected to the transform, and be able to take 
advantage of internal indexing and the like.  While in Xalan 1 this was done via the 
<jump 
href="http://xml.apache.org/xalan/apidocs/org/apache/xalan/xpath/XLocator.html";>XLocator</jump>
 interface, in Xalan 2 this interface is no longer used, and has been replaced by the 
DOM2 <jump 
href="http://www.w3.org/TR/DOM-Level-2/traversal.html#Iterator-overview";>NodeIterator</jump>
 interface.  An application or extension should be able to install their own 
NodeIterator for a given document.</p><p><img src="data.gif" 
alt="data.gif"/></p><p>[More to do]</p></s3></s2><anchor name="utils"/> 
     <s2 title="Utils Package"> 
  -      <p><link>Utils Package</link></p> 
     <p>This package contains general utilities for use by both the xalan and xpath 
packages.</p></s2><anchor name="other"/>
     <s2 title="Other Packages"> 
  -      <p><link>Other Packages</link></p> 
         <gloss><label>client</label><item>Implementation of Xalan Applet [should we 
keep this?].
   
   </item></gloss> 
                 
                 
  -             <gloss><label>lib</label><item>Implementation of Xalan-specific 
extensions.</item></gloss><gloss><label>res</label><item>Contains strings that require 
internationalization.</item></gloss></s2><anchor name="compilation"/><s2 title="Xalan 
Stylesheet Complilation to Java"><p><link>Xalan Stylesheet Complilation to 
Java</link></p><p>We are doing some work on compiling stylesheet objects to Java.  
This is a work in progress, and is not meant for general use yet.  For the moment, we 
are writing out Java text files, and then compiling them to bytecodes via javac, 
rather than directly producing bytecodes.  The CompilingStylesheetProcessor derives 
from TransformerFactoryImpl to produce these classes, which are then bundled into a 
jar file.  For the moment the full Xalan jar is required, but we're looking at ways to 
only use a subset of Xalan, so that only a minimal jar would be required.</p><p><img 
src="compilation.gif" alt="compilation.gif"/></p></s2><anchor 
name="optimizations"/><s2 title="Future Optimizations"><p><link>Future 
Optimizations</link></p><p>This section enumerates some optimizations that we're 
planning to do in future versions of Xalan.</p><p>Likely near term optimizations (next 
six months?):</p><ol><li>By pre-analysis of the stylesheet, prune nodes from the tree 
that have been processed and can be predicted that they won't be visited 
again.</li><li>Eliminate redundent expressions (xsl:when, variable sets, rooted 
patterns, etc.).</li><li>Optimize variable patterns such as &lt;xsl:variable 
name="foo"&gt;&lt;xsl:variable select="yada"/&gt;&lt;/xsl:variable&gt; into 
&lt;xsl:variable name="foo" select="string(yada)"/&gt;, in order to reduce result tree 
fragment creation.</li><li>Reduce size of Stree nodes.</li><li>Implement our own 
NamespaceSupport class (the SAX2 one is too expensive).</li><li>More specialization of 
itterators and walkers.</li><li>Full Java compilation support.</li><li>Schema 
Awareness (if "//foo", the Schema can tell us where to look, but we need standard 
interface to Schemas).</li></ol><p>Likely longer term optimizations (12-18 
months?):</p><ol><li>On-the-fly indexing.</li><li>Predict if nodes won't be processed 
at all, and so don't build them, achieve full streaming support for a certain class of 
stylesheets.</li></ol></s2><anchor name="coding"/> 
  +             <gloss><label>lib</label><item>Implementation of Xalan-specific 
extensions.</item></gloss><gloss><label>res</label><item>Contains strings that require 
internationalization.</item></gloss></s2><anchor name="compilation"/>
  +<s2 title="Xalan Stylesheet Complilation to Java">
  +<p>We are doing some work on compiling stylesheet objects to Java.  This is a work 
in progress, and is not meant for general use yet.  For the moment, we are writing out 
Java text files, and then compiling them to bytecodes via javac, rather than directly 
producing bytecodes.  The CompilingStylesheetProcessor derives from 
TransformerFactoryImpl to produce these classes, which are then bundled into a jar 
file.  For the moment the full Xalan jar is required, but we're looking at ways to 
only use a subset of Xalan, so that only a minimal jar would be required.</p><p><img 
src="compilation.gif" alt="compilation.gif"/></p></s2><anchor name="optimizations"/>
  +<s2 title="Future Optimizations">
  +<p>This section enumerates some optimizations that we're planning to do in future 
versions of Xalan.</p><p>Likely near term optimizations (next six 
months?):</p><ol><li>By pre-analysis of the stylesheet, prune nodes from the tree that 
have been processed and can be predicted that they won't be visited 
again.</li><li>Eliminate redundent expressions (xsl:when, variable sets, rooted 
patterns, etc.).</li><li>Optimize variable patterns such as &lt;xsl:variable 
name="foo"&gt;&lt;xsl:variable select="yada"/&gt;&lt;/xsl:variable&gt; into 
&lt;xsl:variable name="foo" select="string(yada)"/&gt;, in order to reduce result tree 
fragment creation.</li><li>Reduce size of Stree nodes.</li><li>Implement our own 
NamespaceSupport class (the SAX2 one is too expensive).</li><li>More specialization of 
itterators and walkers.</li><li>Full Java compilation support.</li><li>Schema 
Awareness (if "//foo", the Schema can tell us where to look, but we need standard 
interface to Schemas).</li></ol><p>Likely longer term optimizations (12-18 
months?):</p><ol><li>On-the-fly indexing.</li><li>Predict if nodes won't be processed 
at all, and so don't build them, achieve full streaming support for a certain class of 
stylesheets.</li></ol></s2><anchor name="coding"/> 
     <s2 title="Coding Conventions"> 
  -      <p><link>Coding Conventions</link></p> 
         <p>This section documents the coding conventions used in the Xalan
                source.</p> 
         <ol> 
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to