<?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:strip/preserve-space&gt;">
  <ul>
    <li><link anchor="functionality">Functionality</link></li>
    <li><link anchor="identify">Identifying strippable whitespace nodes</link></li>
    <li><link anchor="which">Determining which nodes to strip</link></li>
    <li><link anchor="strip">Stripping nodes</link></li>
    <li><link anchor="filter">Filtering whitespace nodes</link></li>
  </ul>
  
  <anchor name="functionality"/>
  <s2 title="Functionality">

  <p>The <code>&lt;xsl:strip-space&gt;</code> and <code>&lt;xsl:preserve-space&gt;</code>
  elements are used to control the way whitespace nodes in the source XML
  document are handled. These elements have no impact on whitespace in the XSLT
  stylesheet. Both elements can occur only as top-level elements, possible more
  than once, and the elements are always empty</p>
 
  <p>Both elements take one attribute &quot;elements&quot; which contains a
  whitespace separated list of named nodes which should be or preserved
  stripped from the source document. These names can be on one of these three
  formats (NameTest format):</p>

  <ul>
    <li>
      All whitespace nodes:
      <code>elements=&quot;*&quot;</code>
    </li>
    <li>
      All whitespace nodes with a namespace:
      <code>elements=&quot;&lt;namespace&gt;:*&quot;</code>
    </li>
    <li>
      Specific whitespace nodes: <code>elements=&quot;&lt;qname&gt;&quot;</code>
    </li>
  </ul>

  </s2><anchor name="identify"/>
  <s2 title="Identifying strippable whitespace nodes">

  <p>The DOM detects all text nodes and assigns them the type <code>TEXT</code>.
  All text nodes are scanned to detect whitespace-only nodes. A text-node is
  considered a whitespace node only if it consist entirely of characters from
  the set { 0x09, 0x0a, 0x0d, 0x20 }. The DOM implementation class has a static
  method used to detect such nodes:</p>

<source>
    private static final boolean isWhitespaceChar(char c) {
        return c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09;
    }
</source>

  <p>The characters are checked in probable order.</p>

  <p> The DOM has a bit-array that is used to  tag text-nodes as strippable
  whitespace nodes:</p>

  <source>private int[] _whitespace;</source>

  <p>There are two methods in the DOM implementation class for accessing this
  bit-array: <code>markWhitespace(node)</code> and <code>isWhitespace(node)</code>.
  The array is resized together with all other arrays in the DOM by the
  <code>DOM.resizeArrays()</code> method. The bits in the array are set in the
  <code>DOM.maybeCreateTextNode()</code> method. This method must know whether
  the current node is a located under an element with an
  <code>xml:space=&quot;&lt;value&gt;&quot;</code> attribute in the DOM, in which
  case it is not a strippable whitespace node.</p>

  <p>An auxillary class, WhitespaceHandler, is used for this purpose. The class
  works in a way as a stack, where you "push" a new strip/preserve setting
  together with the node in which this setting was determined. This means that
  for every time the DOM builder encounters an <code>xml:space</code> attribute
  it will invoke a method on an instance of the WhitespaceHandler class to
  signal that a new preserve/strip setting has been encountered. This is done
  in the <code>makeAttributeNode()</code> method. The whitespace handler stores the
  new setting and pushes the current element node on its stack. When the
  DOM builder closes up an element (in <code>endElement()</code>), it invokes
  another method of the whitespace handler to check if the strip/preserve
  setting is still valid. If the setting is now invalid (we're closing the
  element whose node id is on the top of the stack) the handler inverts the
  setting and pops the element node id off the stack. The previous
  strip/preserve setting is then valid, and the id of node where this setting
  was defined is on the top of the stack.</p>

  </s2><anchor name="which"/>
  <s2 title="Determining which nodes to strip">

  <p>A text node is never stripped unless it contains only whitespace
  characters (Unicode characters 0x09, 0x0A, 0x0D and 0x20). Stripping a text
  node means that the node disappears from the DOM; so that it is never
  included in the output and that it is ignored by all functions such as
  <code>count()</code>. A text node is preserved if any of the following apply:</p>

  <ul>
    <li>
      the element name of the parent of the text node is in the set of
      elements listed in <code>&lt;xsl:preserve-space&gt;</code>
    </li>
    <li>
      the text node contains at least one non-whitespace character
    </li>
    <li>
      an ancenstor of the whitespace text node has an attribute of
      <code>xsl:space=&quot;preserve&quot;</code>, and no close ancestor has and
      attribute of <code>xsl:space=&quot;default&quot;</code>.
    </li>
  </ul>

  <p>Otherwise, the text node is stripped. Initially the set of 
  whitespace-preserving element names contains all element names, so the
  default behaviour is to preserve all whitespace text nodes.</p>

  <p>This seems simple enough, but resolving conflicts between matching
  <code>&lt;xsl:strip-space&gt;</code> and <code>&lt;xsl:preserve-space&gt;</code>
  elements requires a lot of thought. Our first consideration is import
  precedence; the match with the highest import precedence is always chosen.
  Import precedence is determined by the order in which the compared elements
  are visited. (In this case those elements are the top-level
  <code>&lt;xsl:strip-space&gt;</code> and <code>&lt;xsl:preserve-space&gt;</code>
  elements.) This example is taken from the XSLT recommendation:</p>

  <ul>
    <li>stylesheet A imports stylesheets B and C in that order;</li>
    <li>stylesheet B imports stylesheet D;</li>
    <li>stylesheet C imports stylesheet E.</li>
  </ul>

  <p>Then the order of import precedence (lowest first) is D, B, E, C, A.</p>

  <p>Our next consideration is the priority of NameTests (XPath spec):</p>
  <ul>
    <li>
      <code>elements=&quot;&lt;qname&gt;&quot;</code> has priority 0
    </li>
    <li>
      <code>elements=&quot;&lt;namespace&gt;:*&quot;</code> has priority -0.25
    </li>
    <li>
      <code>elements=&quot;*&quot;</code> has priority -0.5
    </li>
  </ul>

  <p>It is considered an error if the desicion is still ambiguous after this,
  and it is up to the implementors to decide what the apropriate action is.</p>

  <p>With all this complexity, the normal usage for these elements is quite
  smiple; either preserve all whitespace nodes but one type:</p>

  <source>&lt;xsl:strip-space elements="foo"/&gt;</source>

  <p>or strip all whitespace nodes but one type:</p>

  <source>
    &lt;xsl:strip-space elements="*"/&gt;
    &lt;xsl:preserve-space elements="foo"/&gt;</source>

  </s2><anchor name="strip"/>
  <s2 title="Stripping nodes">

  <p>The ultimate goal of our design would be to totally screen all stripped
  nodes from the translet; to either physically remove them from the DOM or to
  make it appear as if they are not there. The first approach will cause
  problems in cases where multiple translets access the same DOM. In the future
  we wish to let translets run within servlets / JSPs with a common DOM cache.
  This DOM cache will keep copies of DOMs in memory to prevent the same XML
  file from being downloaded and parsed several times. This is a scenarios we
  might see:</p>

    <p><img src="DOMInterface.gif" alt="DOMInterface.gif"/></p>
    <p><ref>Figure 1: Multiple translets accessing a common pool of DOMs</ref></p>

  <p>The three translets running on this host access a common pool of 4 DOMs.
  The DOMs are accessed through a common DOM interface. Translets accessing
  a single DOM will have a DOMAdapter and a single DOMImpl object behind this
  interface, while translets accessing several DOMs will be given a MultiDOM
  and a set of DOMImpl objects.</p>

  <p>The translet to the left may want to strip some nodes from the shared DOM
  in the cache, while the other translets may want to preserve all whitespace
  nodes. Our initial thought then is to keep the DOM as it is and somehow
  screen the left-hand translet of all the whitespace nodes it does not want to
  process. There are a few ways in which we can accomplish this:</p>

  <ul>
    <li>
      The translet can, prior to starting to traverse the DOM, send a reference
      to the tables containing information on which nodes we want stripped to
      the DOM interface. The DOM interface is then responsible for hiding all
      stripped whitespace nodes from the iterators and the translet. A problem
      with this approach is that we want to omit the DOM interface layer if
      the translet is only accessing a single DOM. The DOM interface layer will
      only be instanciated by the translet if the stylesheet contained a call
      to the <code>document()</code> function.<br/><br/>
    </li>
    <li>
      The translet can provide its iterators with information on which nodes it
      does not want to see. The translet is still shielded from unwanted
      whitespace nodes, but it has the hassle of passing extra information over
      to most iterators it ever instanciates. Note that all iterators do not
      need be aware of whitepspace nodes in this case. If you have a look at
      the figure again you will see that only the first level iterator (that is
      the one closest to the DOM or DOM interface) will have to strip off
      whitespace nodes. But, there may be several iterators that operate
      directly on the DOM ( invoked by code handling XSL functions such as
      <code>count()</code>) and every single one of those will need to be told
      which whitespace nodes the translet does not want to see.<br/><br/>
    </li>
    <li>
      The third approach will take advantage of the fact that not all
      translets will want to strip whitespace nodes. The most effective way of
      removing unwanted whitespace nodes is to do it once and for all, before
      the actual traversal of the DOM starts. This can be done by making a
      clone of the DOM with exlusive-access rights for this translet only. We
      still gain performance from the cache because we do not have to pay the
      cost of the delay caused by downloading and parsing the XML source file.
      The cost we have to pay is the time needed for the actual cloning and the
      extra memory we use.<br/><br/>
      Normally one would imagine the translet (or the wrapper class that
      invokes the translet) calls the DOM cache with just an URL and receives
      a reference to an instanciated DOM. The cache will either have built
      this DOM on-demand or just passed back a reference to an existing tree.
      In this case the DOM would need an extra call that a translet would use
      to clone a DOM, passing the existing DOM reference to the cache and
      recieving a new reference to the cloned DOM. The translet can then do
      whatever it wants with this DOM (the cache need not even keep a reference
      to this tree).
    </li>
  </ul>
  
  <p>We are lucky enough to be able to combine the first two approaches. All
  iterators that directly access the DOM (axis iterators) are instanciated by
  calls to the DOM interface layer (the DOM class). The actual iterators are
  created in the DOM implementation layer (the DOMImpl class). So, we can pass
  references to the preserve/strip whitespace tables to the DOM, and the DOM
  will make sure that all axis iterators return node sets with respect to these
  tables.</p>
  </s2><anchor name="filter"/> 
  <s2 title="Filtering whitespace nodes">

  <p>For each axis iterator and for <code>DOM.makeStringValue()</code> and
  <code>DOM.stringValueAux()</code> we must apply a filter for eliminating all
  unwanted whitespace nodes. To achive this we must build a very efficient
  predicate for determining if the current node should be stripped or not. This
  predicate is built by <code>Whitespace.compilePredicate()</code>. This method is
  static and builds a predicate for a vector of WhitespaceRule objects. (The
  WhitespaceRule class is defined within the Whitespace class.) Each
  WhitespaceRule object contains information for a single element listed
  in an <code>&lt;xsl:strip/preserve-space&gt;</code> element, and is broken down
  into the following information:</p>

  <ul>
    <li>the namespace (can be the default namespace)</li>
    <li>the element name or "<code>*</code>"</li>
    <li>the type of rule; NS:EL, NS:<code>*</code> or <code>*</code></li>
    <li>the priority of the rule (based on import precedence and type)</li>
    <li>the action; either strip or preserver</li>
  </ul>

  <p>The Vector of WhitespaceRules is arranged in order of priority and
  redundant rules are removed. A predicate method is then compiled into the
  translet as:</p>

<source>
    public boolean stripSpace(int node);
</source>

  <p>Unfortunately this method cannot be declared static.</p>

  <p>When the Stylesheet objectcompiles the <code>topLevel()</code> method of the
  translet it checks for the existance of the <code>stripSpace()</code> method. If
  this method exists the <code>topLevel()</code> will be compiled to pass the
  translet to the DOM as a StripWhitespaceFilter (the translet implements this
  interface when the <code>stripSpace()</code> method is compiled).</p>

  <p>All axis iterators and the <code>DOM.makeStringValue()</code> and
  <code>DOM.stringValueAux()</code> methods check for the existance of this filter
  (it is kept in a global variable in the DOM implementation class) and takes
  the appropriate actions. The methods in the DOM for returning axis iterators
  will place a StrippingIterator on top of the axis iterator if the filter is
  present, and the two methods just mentioned will return empty strings for
  whitespace nodes that should be stripped.</p>
 
  </s2>
</s1>
