You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by cu...@apache.org on 2001/04/19 16:27:47 UTC

cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/dom DOMImpl.java

curcuru     01/04/19 07:27:46

  Modified:    java/src/org/apache/xalan/xsltc/dom DOMImpl.java
  Log:
  Fix DOM level compile problems (sorry for large diff; formatting change too)
  Submitted by: morten@apache.org
  
  Revision  Changes    Path
  1.2       +2312 -2268xml-xalan/java/src/org/apache/xalan/xsltc/dom/DOMImpl.java
  
  Index: DOMImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/DOMImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DOMImpl.java	2001/04/17 18:52:29	1.1
  +++ DOMImpl.java	2001/04/19 14:27:42	1.2
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: DOMImpl.java,v 1.1 2001/04/17 18:52:29 sboag Exp $
  + * @(#)$Id: DOMImpl.java,v 1.2 2001/04/19 14:27:42 curcuru Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -95,29 +95,29 @@
   
       // empty iterator to be returned when there are no children
       private final static NodeIterator EMPTYITERATOR =
  -	new NodeIterator() {
  -		public NodeIterator reset() { return this; }
  -		public NodeIterator setStartNode(int node) { return this; }
  -		public int next() { return NULL; }
  -		public void setMark() {}
  -		public void gotoMark() {}
  -		public int getLast() { return 0; }
  -		public int getPosition() { return 0; }
  -		public NodeIterator cloneIterator() { return this; }
  -		public boolean isReverse() { return false; }
  -		public NodeIterator resetOnce() { return this; }
  -	    };
  +         new NodeIterator() {
  +                  public NodeIterator reset() { return this; }
  +                  public NodeIterator setStartNode(int node) { return this; }
  +                  public int next() { return NULL; }
  +                  public void setMark() {}
  +                  public void gotoMark() {}
  +                  public int getLast() { return 0; }
  +                  public int getPosition() { return 0; }
  +                  public NodeIterator cloneIterator() { return this; }
  +                  public boolean isReverse() { return false; }
  +                  public NodeIterator resetOnce() { return this; }
  +             };
   
       // empty attribute list to be returned for nodes with no attributes
       private static final AttributeList EmptyAttributes =
  -	new AttributeList() {
  -		public int getLength() { return 0; }
  -		public String getName(int i) { return null; }
  -		public String getType(int i) { return null; }
  -		public String getValue(int i) { return null; }
  -		public String getType(String name) { return null; }
  -		public String getValue(String name) { return null; }
  -	    };
  +         new AttributeList() {
  +                  public int getLength() { return 0; }
  +                  public String getName(int i) { return null; }
  +                  public String getType(int i) { return null; }
  +                  public String getValue(int i) { return null; }
  +                  public String getType(String name) { return null; }
  +                  public String getValue(String name) { return null; }
  +             };
   
       // document tree representation data structures
       private int       _treeNodeLimit;
  @@ -142,342 +142,386 @@
       private int nsCounter = 0;
   
       private String generateNamespacePrefix() {
  -	return(new String("ns"+Integer.toString(nsCounter++)));
  +         return(new String("ns"+Integer.toString(nsCounter++)));
       }
   
       public void setDocumentURI(String uri) {
  -	_documentURI = uri;
  +         _documentURI = uri;
       }
   
       public String getDocumentURI() {
  -	return(_documentURI);
  +         return(_documentURI);
       }
   
       public void setFilter(StripWhitespaceFilter filter) { }
   
       private boolean isElement(final int node) {
  -	return ((node < _treeNodeLimit) && (_type[node] >= NTYPES));
  +         return ((node < _treeNodeLimit) && (_type[node] >= NTYPES));
       }
   
       public int getSize() {
  -	return(_type.length);
  +         return(_type.length);
       }
   
       public boolean lessThan(int node1, int node2) {
  -	if ((node2 < _treeNodeLimit) && (node1 < node2))
  -	    return(true);
  -	else
  -	    return(false);
  +         if ((node2 < _treeNodeLimit) && (node1 < node2))
  +             return(true);
  +         else
  +             return(false);
       }
   
       // Support for access/navigation through org.w3c.dom API
       private Node[] _nodes;
   
       public Node makeNode(int index) {
  -	if (_nodes == null) {
  -	    _nodes = new Node[_type.length];
  -	}
  -	return _nodes[index] != null
  -	    ? _nodes[index]
  -	    : (_nodes[index] = new NodeImpl(index));
  +    if (_nodes == null) {
  +             _nodes = new Node[_type.length];
  +         }
  +         return _nodes[index] != null
  +             ? _nodes[index]
  +             : (_nodes[index] = new NodeImpl(index));
       }
   
       public Node makeNode(NodeIterator iter) {
  -	return makeNode(iter.next());	// iter must be started
  +         return makeNode(iter.next());         // iter must be started
       }
   
       private NodeList[] _nodeLists;
   
       public NodeList makeNodeList(int index) {
  -	if (_nodeLists == null) {
  -	    _nodeLists = new NodeList[_type.length];
  -	}
  -	return _nodeLists[index] != null
  -	    ? _nodeLists[index]
  -	    : (_nodeLists[index] = new NodeListImpl(index));
  +         if (_nodeLists == null) {
  +             _nodeLists = new NodeList[_type.length];
  +         }
  +         return _nodeLists[index] != null
  +             ? _nodeLists[index]
  +             : (_nodeLists[index] = new NodeListImpl(index));
       }
   
       public NodeList makeNodeList(NodeIterator iter) {
  -	return new NodeListImpl(iter);	// iter must be started
  +         return new NodeListImpl(iter);         // iter must be started
       }
   
       private final class NotSupportedException extends DOMException {
  -	public NotSupportedException() {
  -	    super(NOT_SUPPORTED_ERR, "modification not supported");
  -	}
  +         public NotSupportedException() {
  +             super(NOT_SUPPORTED_ERR, "modification not supported");
  +         }
       } // end of NotSupportedException
  -	
  +         
       private static NodeList EmptyNodeList;
       private static NamedNodeMap EmptyNamedNodeMap;
  -	
  +         
       private NodeList getEmptyNodeList() {
  -	return EmptyNodeList != null
  -	    ? EmptyNodeList
  -	    : (EmptyNodeList = new NodeListImpl(new int[0]));
  +         return EmptyNodeList != null
  +             ? EmptyNodeList
  +             : (EmptyNodeList = new NodeListImpl(new int[0]));
       }
   
       private NamedNodeMap getEmptyNamedNodeMap() {
  -	return EmptyNamedNodeMap != null
  -	    ? EmptyNamedNodeMap
  -	    : (EmptyNamedNodeMap = new NamedNodeMapImpl(new int[0]));
  +         return EmptyNamedNodeMap != null
  +             ? EmptyNamedNodeMap
  +             : (EmptyNamedNodeMap = new NamedNodeMapImpl(new int[0]));
       }
   
       private final class NodeListImpl implements NodeList {
  -	private final int[] _nodes;
  +         private final int[] _nodes;
   
  -	public NodeListImpl(int node) {
  -	    _nodes = new int[1];
  -	    _nodes[0] = node;
  -	}
  -
  -	public NodeListImpl(int[] nodes) {
  -	    _nodes = nodes;
  -	}
  -		
  -	public NodeListImpl(NodeIterator iter) {
  -	    final IntegerArray list = new IntegerArray();
  -	    int node;
  -	    while ((node = iter.next()) != NodeIterator.END) {
  -		list.add(node);
  -	    }	
  -	    _nodes = list.toIntArray();	
  -	}
  -
  -	public int getLength() {
  -	    return _nodes.length;
  -	}
  -		
  -	public Node item(int index) {
  -	    return makeNode(_nodes[index]);
  -	}
  +         public NodeListImpl(int node) {
  +             _nodes = new int[1];
  +             _nodes[0] = node;
  +         }
  +
  +         public NodeListImpl(int[] nodes) {
  +             _nodes = nodes;
  +         }
  +                  
  +         public NodeListImpl(NodeIterator iter) {
  +             final IntegerArray list = new IntegerArray();
  +             int node;
  +             while ((node = iter.next()) != NodeIterator.END) {
  +                  list.add(node);
  +             }         
  +             _nodes = list.toIntArray();         
  +         }
  +
  +         public int getLength() {
  +             return _nodes.length;
  +         }
  +                  
  +         public Node item(int index) {
  +             return makeNode(_nodes[index]);
  +         }
       } // end of NodeListImpl
  -		
  +                  
       private final class NamedNodeMapImpl implements NamedNodeMap {
  -	private final int[] _nodes;
  -		
  -	public NamedNodeMapImpl(int[] nodes) {
  -	    _nodes = nodes;
  -	}
  -		
  -	public int getLength() {
  -	    return _nodes.length;
  -	}
  -		
  -	public Node getNamedItem(String name) {
  -	    for (int i = 0; i < _nodes.length; i++) {
  -		if (name.equals(getNodeName(_nodes[i]))) {
  -		    return makeNode(_nodes[i]);
  -		}
  -	    }
  -	    return null;
  -	}
  -		
  -	public Node item(int index) {
  -	    return makeNode(_nodes[index]);
  -	}
  -		
  -	public Node removeNamedItem(String name) {
  -	    throw new NotSupportedException();
  -	}
  -		
  -	public Node setNamedItem(Node node) {
  -	    throw new NotSupportedException();
  -	}
  +         private final int[] _nodes;
  +                  
  +         public NamedNodeMapImpl(int[] nodes) {
  +             _nodes = nodes;
  +         }
  +                  
  +         public int getLength() {
  +             return _nodes.length;
  +         }
  +                  
  +         public Node getNamedItem(String name) {
  +             for (int i = 0; i < _nodes.length; i++) {
  +                  if (name.equals(getNodeName(_nodes[i]))) {
  +                      return makeNode(_nodes[i]);
  +                  }
  +             }
  +             return null;
  +         }
  +                  
  +         public Node item(int index) {
  +             return makeNode(_nodes[index]);
  +         }
  +                  
  +         public Node removeNamedItem(String name) {
  +             throw new NotSupportedException();
  +         }
  +                  
  +         public Node setNamedItem(Node node) {
  +             throw new NotSupportedException();
  +         }
  +
  +         public Node getNamedItemNS(String uri, String local) {
  +             return(getNamedItem(uri+':'+local));
  +         }
  +
  +         public Node setNamedItemNS(Node node) {
  +             throw new NotSupportedException();
  +         }
  +
  +         public Node removeNamedItemNS(String uri, String local) {
  +             throw new NotSupportedException();
  +         }
  +
       } // end of NamedNodeMapImpl
  -	
  +         
       private final class NodeImpl implements Node {
  -	private final int _index;
  +         private final int _index;
  +
  +         public NodeImpl(int index) {
  +             _index = index;
  +         }
  +
  +         public short getNodeType() {
  +             switch (_type[_index]) {
  +             case ROOT:
  +                  return Node.DOCUMENT_NODE;
  +                  
  +             case TEXT:
  +                  return Node.TEXT_NODE;
  +                  
  +             case PROCESSING_INSTRUCTION:
  +                  return Node.PROCESSING_INSTRUCTION_NODE;
  +                  
  +             case COMMENT:
  +                  return Node.COMMENT_NODE;
  +                  
  +             default:
  +                  return _index < _treeNodeLimit
  +                      ? Node.ELEMENT_NODE : Node.ATTRIBUTE_NODE;
  +             }
  +         }
  +                  
  +         public Node getParentNode() {
  +             final int parent = getParent(_index);
  +             return parent > NULL ? makeNode(parent) : null;
  +         }
  +                  
  +         public Node appendChild(Node node) throws DOMException {
  +             throw new NotSupportedException();
  +         }
  +                  
  +         public Node cloneNode(boolean deep) {
  +             // it can be supported if need be
  +             // with and additional field to signify
  +             // whether it is a deep or shallow clone
  +             throw new NotSupportedException();
  +         }
  +                  
  +         public NamedNodeMap getAttributes() {
  +             if (getNodeType() == Node.ELEMENT_NODE) {
  +                  int attribute = _lengthOrAttr[_index];
  +                  if (attribute != NULL) {
  +                      final IntegerArray attributes = new IntegerArray(4);
  +                      do {
  +                           attributes.add(attribute);
  +                      }
  +                      while ((attribute = _nextSibling[attribute]) != 0);
  +                      return new NamedNodeMapImpl(attributes.toIntArray());
  +                  }
  +                  else {
  +                      return getEmptyNamedNodeMap();
  +                  }
  +             }
  +             else {
  +                  return null;
  +             }
  +         }
  +
  +         public NodeList getChildNodes() {
  +             if (hasChildNodes()) {
  +                  final IntegerArray children = new IntegerArray(8);
  +                  int child = _offsetOrChild[_index];
  +                  do {
  +                      children.add(child);
  +                  }
  +                  while ((child = _nextSibling[child]) != 0);
  +                  return new NodeListImpl(children.toIntArray());
  +             }
  +             else {
  +                  return getEmptyNodeList();
  +             }
  +         }
  +                  
  +         public Node getFirstChild() {
  +             return hasChildNodes()
  +                  ? makeNode(_offsetOrChild[_index])
  +                  : null;
  +         }
  +                  
  +         public Node getLastChild() {
  +             return hasChildNodes()
  +                  ? makeNode(lastChild(_index))
  +                  : null;
  +         }
  +                  
  +         public Node getNextSibling() {
  +             final int next = _nextSibling[_index];
  +             return next != 0 ? makeNode(next) : null;
  +         }
  +                  
  +         public String getNodeName() {
  +             switch (_type[_index]) {
  +             case ROOT:
  +                  return "#document";
  +                  
  +             case TEXT:
  +                  return "#text";
  +                  
  +             case PROCESSING_INSTRUCTION:
  +                  return "***PI Name NYI";
  +                  
  +             case COMMENT:
  +                  return "#comment";
  +                  
  +             default:
  +                  return DOMImpl.this.getNodeName(_index);
  +             }
  +         }
  +                  
  +         public String getNodeValue() throws DOMException {
  +             return DOMImpl.this.getNodeValue(_index);
  +         }
  +                  
  +         public Document getOwnerDocument() {
  +             return null;
  +         }
  +                  
  +         //??? how does it work with attributes
  +         public Node getPreviousSibling() {
  +             int node = _parent[_index];
  +             if (node > NULL) {
  +                  int prev = -1;
  +                  node = _offsetOrChild[node];
  +                  while (node != _index) {
  +                      node = _nextSibling[prev = node];
  +                  }
  +                  if (prev != -1) {
  +                      return makeNode(prev);
  +                  }
  +             }
  +             return null;
  +         }
  +                  
  +         public boolean hasChildNodes() {
  +             switch (getNodeType()) {
  +             case Node.ELEMENT_NODE:
  +             case Node.DOCUMENT_NODE:
  +                  return _offsetOrChild[_index] != 0;
  +
  +             default:
  +                  return false;
  +             }
  +         }
  +                  
  +         public Node insertBefore(Node n1, Node n2) throws DOMException {
  +             throw new NotSupportedException();
  +         }
  +                  
  +         public Node removeChild(Node n) throws DOMException {
  +             throw new NotSupportedException();
  +         }
  +                  
  +         public Node replaceChild(Node n1, Node n2) throws DOMException {
  +             throw new NotSupportedException();
  +         }
  +                  
  +         public void setNodeValue(String s) throws DOMException {
  +             throw new NotSupportedException();
  +         }
  +
  +         public void normalize() {
  +             throw new NotSupportedException();
  +         }
  +
  +         public boolean isSupported(String feature, String version) {
  +             return false;
  +         }
  +
  +         public String getNamespaceURI() {
  +             return _nsNamesArray[_namespace[_type[_index] - NTYPES]];
  +         }
  +
  +         public String getPrefix() {
  +             return null; // We don't know with the current DOM implementation
  +         }
  +
  +         public void setPrefix(String prefix) {
  +             throw new NotSupportedException();
  +         }
  +
  +         public String getLocalName() {
  +             final String qname = _namesArray[_type[_index] - NTYPES];
  +             final int col = qname.lastIndexOf(':');
  +             return qname.substring(col+1);
  +         }
  +
  +         public boolean hasAttributes() {
  +             return (_lengthOrAttr[_index] != NULL);
  +         }
   
  -	public NodeImpl(int index) {
  -	    _index = index;
  -	}
  -
  -	public short getNodeType() {
  -	    switch (_type[_index]) {
  -	    case ROOT:
  -		return Node.DOCUMENT_NODE;
  -		
  -	    case TEXT:
  -		return Node.TEXT_NODE;
  -		
  -	    case PROCESSING_INSTRUCTION:
  -		return Node.PROCESSING_INSTRUCTION_NODE;
  -		
  -	    case COMMENT:
  -		return Node.COMMENT_NODE;
  -		
  -	    default:
  -		return _index < _treeNodeLimit
  -		    ? Node.ELEMENT_NODE : Node.ATTRIBUTE_NODE;
  -	    }
  -	}
  -		
  -	public Node getParentNode() {
  -	    final int parent = getParent(_index);
  -	    return parent > NULL ? makeNode(parent) : null;
  -	}
  -		
  -	public Node appendChild(Node node) throws DOMException {
  -	    throw new NotSupportedException();
  -	}
  -		
  -	public Node cloneNode(boolean deep) {
  -	    // it can be supported if need be
  -	    // with and additional field to signify
  -	    // whether it is a deep or shallow clone
  -	    throw new NotSupportedException();
  -	}
  -		
  -	public NamedNodeMap getAttributes() {
  -	    if (getNodeType() == Node.ELEMENT_NODE) {
  -		int attribute = _lengthOrAttr[_index];
  -		if (attribute != NULL) {
  -		    final IntegerArray attributes = new IntegerArray(4);
  -		    do {
  -			attributes.add(attribute);
  -		    }
  -		    while ((attribute = _nextSibling[attribute]) != 0);
  -		    return new NamedNodeMapImpl(attributes.toIntArray());
  -		}
  -		else {
  -		    return getEmptyNamedNodeMap();
  -		}
  -	    }
  -	    else {
  -		return null;
  -	    }
  -	}
  -
  -	public NodeList getChildNodes() {
  -	    if (hasChildNodes()) {
  -		final IntegerArray children = new IntegerArray(8);
  -		int child = _offsetOrChild[_index];
  -		do {
  -		    children.add(child);
  -		}
  -		while ((child = _nextSibling[child]) != 0);
  -		return new NodeListImpl(children.toIntArray());
  -	    }
  -	    else {
  -		return getEmptyNodeList();
  -	    }
  -	}
  -		
  -	public Node getFirstChild() {
  -	    return hasChildNodes()
  -		? makeNode(_offsetOrChild[_index])
  -		: null;
  -	}
  -		
  -	public Node getLastChild() {
  -	    return hasChildNodes()
  -		? makeNode(lastChild(_index))
  -		: null;
  -	}
  -		
  -	public Node getNextSibling() {
  -	    final int next = _nextSibling[_index];
  -	    return next != 0 ? makeNode(next) : null;
  -	}
  -		
  -	public String getNodeName() {
  -	    switch (_type[_index]) {
  -	    case ROOT:
  -		return "#document";
  -		
  -	    case TEXT:
  -		return "#text";
  -		
  -	    case PROCESSING_INSTRUCTION:
  -		return "***PI Name NYI";
  -		
  -	    case COMMENT:
  -		return "#comment";
  -		
  -	    default:
  -		return DOMImpl.this.getNodeName(_index);
  -	    }
  -	}
  -		
  -	public String getNodeValue() throws DOMException {
  -	    return DOMImpl.this.getNodeValue(_index);
  -	}
  -		
  -	public Document getOwnerDocument() {
  -	    return null;
  -	}
  -		
  -	//??? how does it work with attributes
  -	public Node getPreviousSibling() {
  -	    int node = _parent[_index];
  -	    if (node > NULL) {
  -		int prev = -1;
  -		node = _offsetOrChild[node];
  -		while (node != _index) {
  -		    node = _nextSibling[prev = node];
  -		}
  -		if (prev != -1) {
  -		    return makeNode(prev);
  -		}
  -	    }
  -	    return null;
  -	}
  -		
  -	public boolean hasChildNodes() {
  -	    switch (getNodeType()) {
  -	    case Node.ELEMENT_NODE:
  -	    case Node.DOCUMENT_NODE:
  -		return _offsetOrChild[_index] != 0;
  -
  -	    default:
  -		return false;
  -	    }
  -	}
  -		
  -	public Node insertBefore(Node n1, Node n2) throws DOMException {
  -	    throw new NotSupportedException();
  -	}
  -		
  -	public Node removeChild(Node n) throws DOMException {
  -	    throw new NotSupportedException();
  -	}
  -		
  -	public Node replaceChild(Node n1, Node n2) throws DOMException {
  -	    throw new NotSupportedException();
  -	}
  -		
  -	public void setNodeValue(String s) throws DOMException {
  -	    throw new NotSupportedException();
  -	}
       } // end of NodeImpl
   
       public Filter getTypeFilter(int type) {
  -	return new TypeFilter(type);
  +         return new TypeFilter(type);
       }
   
       // single copy of ElementFilter
       private Filter _elementFilter;
   
       private Filter getElementFilter() {
  -	return _elementFilter != null
  -	    ? _elementFilter
  -	    : (_elementFilter = new Filter() {
  -		    public boolean test(int node) {
  -			return isElement(node);
  -		    }
  -		});
  +         return _elementFilter != null
  +             ? _elementFilter
  +             : (_elementFilter = new Filter() {
  +                      public boolean test(int node) {
  +                           return isElement(node);
  +                      }
  +                  });
       }
   
       private final class TypeFilter implements Filter {
  -	private final int _nodeType;
  -		
  -	public TypeFilter(int type) {
  -	    _nodeType = type;
  -	}
  -		
  -	public boolean test(int node) {
  -	    return _type[node] == _nodeType;
  -	}
  +         private final int _nodeType;
  +                  
  +         public TypeFilter(int type) {
  +             _nodeType = type;
  +         }
  +                  
  +         public boolean test(int node) {
  +             return _type[node] == _nodeType;
  +         }
       } // end of TypeFilter
   
   
  @@ -485,31 +529,31 @@
        * Iterator that returns all children of a given node
        */
       private final class ChildrenIterator extends NodeIteratorBase {
  -	// child to return next
  -	private int _currentChild;
  -	
  -	public NodeIterator setStartNode(final int node) {
  -	    if (_isRestartable) {
  -		_currentChild = hasChildren(node)
  -		    ? _offsetOrChild[_startNode = node] : END;
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -
  -	public int next() {
  -	    final int node = _currentChild;
  -	    _currentChild = _nextSibling[node];
  -	    return returnNode(node);
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _currentChild;
  -	}
  -
  -	public void gotoMark() {
  -	    _currentChild = _markedNode;
  -	}
  +         // child to return next
  +         private int _currentChild;
  +         
  +         public NodeIterator setStartNode(final int node) {
  +             if (_isRestartable) {
  +                  _currentChild = hasChildren(node)
  +                      ? _offsetOrChild[_startNode = node] : END;
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +
  +         public int next() {
  +             final int node = _currentChild;
  +             _currentChild = _nextSibling[node];
  +             return returnNode(node);
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _currentChild;
  +         }
  +
  +         public void gotoMark() {
  +             _currentChild = _markedNode;
  +         }
   
       } // end of ChildrenIterator
   
  @@ -518,40 +562,40 @@
        * Iterator that returns the parent of a given node
        */
       private final class ParentIterator extends NodeIteratorBase {
  -	// candidate parent node
  -	private int _node;
  -	private int _nodeType = -1;
  -	
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		_node = _parent[_startNode = node];
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -	    
  -	public NodeIterator setNodeType(final int type) {
  -	    _nodeType = type;
  -	    return this;
  -	}
  -
  -	public int next() {
  -	    int result = _node;
  -	    if ((_nodeType != -1) && (_type[_node] != _nodeType))
  -		result = END;
  -	    else
  -		result = _node;
  -	    _node = END;
  -	    return returnNode(result);
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _node;
  -	}
  -
  -	public void gotoMark() {
  -	    _node = _markedNode;
  -	}
  +         // candidate parent node
  +         private int _node;
  +         private int _nodeType = -1;
  +         
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  _node = _parent[_startNode = node];
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +             
  +         public NodeIterator setNodeType(final int type) {
  +             _nodeType = type;
  +             return this;
  +         }
  +
  +         public int next() {
  +             int result = _node;
  +             if ((_nodeType != -1) && (_type[_node] != _nodeType))
  +                  result = END;
  +             else
  +                  result = _node;
  +             _node = END;
  +             return returnNode(result);
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _node;
  +         }
  +
  +         public void gotoMark() {
  +             _node = _markedNode;
  +         }
       } // end of ParentIterator
   
   
  @@ -562,41 +606,41 @@
        * for efficiency (both speed and size of translet).
        */
       private final class TypedChildrenIterator extends NodeIteratorBase {
  -	private final int _nodeType;
  -	// node to consider next
  -	private int _currentChild;
  -	
  -	public TypedChildrenIterator(int nodeType) {
  -	    _nodeType = nodeType;
  -	}
  -
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		_currentChild = hasChildren(node)
  -		    ? _offsetOrChild[_startNode = node] : END;
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -
  -	public int next() {
  -	    for (int node = _currentChild; node != END;
  -		 node = _nextSibling[node]) {
  -		if (_type[node] == _nodeType) {
  -		    _currentChild = _nextSibling[node];
  -		    return returnNode(node);
  -		}
  -	    }
  -	    return END;
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _currentChild;
  -	}
  -
  -	public void gotoMark() {
  -	    _currentChild = _markedNode;
  -	}
  +         private final int _nodeType;
  +         // node to consider next
  +         private int _currentChild;
  +         
  +         public TypedChildrenIterator(int nodeType) {
  +             _nodeType = nodeType;
  +         }
  +
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  _currentChild = hasChildren(node)
  +                      ? _offsetOrChild[_startNode = node] : END;
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +
  +         public int next() {
  +             for (int node = _currentChild; node != END;
  +                   node = _nextSibling[node]) {
  +                  if (_type[node] == _nodeType) {
  +                      _currentChild = _nextSibling[node];
  +                      return returnNode(node);
  +                  }
  +             }
  +             return END;
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _currentChild;
  +         }
  +
  +         public void gotoMark() {
  +             _currentChild = _markedNode;
  +         }
       } // end of TypedChildrenIterator
   
   
  @@ -607,40 +651,40 @@
        * iterator is used for efficiency (both speed and size of translet).
        */
       private final class NamespaceChildrenIterator extends NodeIteratorBase {
  -	private final int _nsType;
  -	private int _currentChild;
  -	
  -	public NamespaceChildrenIterator(final int type) {
  -	    _nsType = type;
  -	}
  -
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		_currentChild = hasChildren(node)
  -		    ? _offsetOrChild[_startNode = node] : END;
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -
  -	public int next() {
  -	    for (int node = _currentChild; node != END; 
  -		 node = _nextSibling[node]) {
  -		if (getNamespaceType(node) == _nsType) {
  -		    _currentChild = _nextSibling[node];
  -		    return returnNode(node);
  -		}
  -	    }
  -	    return END;
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _currentChild;
  -	}
  -
  -	public void gotoMark() {
  -	    _currentChild = _markedNode;
  -	}
  +         private final int _nsType;
  +         private int _currentChild;
  +         
  +         public NamespaceChildrenIterator(final int type) {
  +             _nsType = type;
  +         }
  +
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  _currentChild = hasChildren(node)
  +                      ? _offsetOrChild[_startNode = node] : END;
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +
  +         public int next() {
  +             for (int node = _currentChild; node != END; 
  +                   node = _nextSibling[node]) {
  +                  if (getNamespaceType(node) == _nsType) {
  +                      _currentChild = _nextSibling[node];
  +                      return returnNode(node);
  +                  }
  +             }
  +             return END;
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _currentChild;
  +         }
  +
  +         public void gotoMark() {
  +             _currentChild = _markedNode;
  +         }
   
       } // end of TypedChildrenIterator
   
  @@ -650,45 +694,45 @@
        */
       private final class NamespaceAttributeIterator extends NodeIteratorBase {
   
  -	private final int _nsType;
  -	private int _attribute;
  -	
  -	public NamespaceAttributeIterator(int nsType) {
  -	    super();
  -	    _nsType = nsType;
  -	}
  -		
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		for (node = _lengthOrAttr[_startNode = node];
  -		     node != NULL && getNamespaceType(node) != _nsType;
  -		     node = _nextSibling[node]);
  -		_attribute = node;
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -		
  -	public int next() {
  -	    final int save = _attribute;
  -	    int node = save;
  -	    _attribute = _nextSibling[_attribute];
  -	    for (node = _lengthOrAttr[_startNode = node];
  -		 node != NULL && getNamespaceType(node) != _nsType;
  -		 node = _nextSibling[node]);
  -	    _attribute = node;
  -
  -	    return returnNode(save);
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _attribute;
  -	}
  -
  -	public void gotoMark() {
  -	    _attribute = _markedNode;
  -	}
  -	
  +         private final int _nsType;
  +         private int _attribute;
  +         
  +         public NamespaceAttributeIterator(int nsType) {
  +             super();
  +             _nsType = nsType;
  +         }
  +                  
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  for (node = _lengthOrAttr[_startNode = node];
  +                       node != NULL && getNamespaceType(node) != _nsType;
  +                       node = _nextSibling[node]);
  +                  _attribute = node;
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +                  
  +         public int next() {
  +             final int save = _attribute;
  +             int node = save;
  +             _attribute = _nextSibling[_attribute];
  +             for (node = _lengthOrAttr[_startNode = node];
  +                   node != NULL && getNamespaceType(node) != _nsType;
  +                   node = _nextSibling[node]);
  +             _attribute = node;
  +
  +             return returnNode(save);
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _attribute;
  +         }
  +
  +         public void gotoMark() {
  +             _attribute = _markedNode;
  +         }
  +         
       } // end of TypedChildrenIterator
   
   
  @@ -696,27 +740,27 @@
        * Iterator that returns all siblings of a given node.
        */
       private class FollowingSiblingIterator extends NodeIteratorBase {
  -	private int _node;
  -	
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		_node = _startNode = node;
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -		
  -	public int next() {
  -	    return returnNode(_node = _nextSibling[_node]);
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _node;
  -	}
  -
  -	public void gotoMark() {
  -	    _node = _markedNode;
  -	}
  +         private int _node;
  +         
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  _node = _startNode = node;
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +                  
  +         public int next() {
  +             return returnNode(_node = _nextSibling[_node]);
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _node;
  +         }
  +
  +         public void gotoMark() {
  +             _node = _markedNode;
  +         }
       } // end of FollowingSiblingIterator
   
   
  @@ -724,19 +768,19 @@
        * Iterator that returns all following siblings of a given node.
        */
       private final class TypedFollowingSiblingIterator
  -	extends FollowingSiblingIterator {
  -	private final int _nodeType;
  +         extends FollowingSiblingIterator {
  +         private final int _nodeType;
   
  -	public TypedFollowingSiblingIterator(int type) {
  -	    _nodeType = type;
  -	}
  -	
  -	public int next() {
  -	    int node;
  -	    while ((node = super.next()) != NULL && _type[node] != _nodeType) {
  -	    }
  -	    return node;
  -	}
  +         public TypedFollowingSiblingIterator(int type) {
  +             _nodeType = type;
  +         }
  +         
  +         public int next() {
  +             int node;
  +             while ((node = super.next()) != NULL && _type[node] != _nodeType) {
  +             }
  +             return node;
  +         }
   
       } // end of TypedFollowingSiblingIterator
   
  @@ -745,32 +789,32 @@
        * Iterator that returns attribute nodes (of what nodes?)
        */
       private final class AttributeIterator extends NodeIteratorBase {
  -	private int _attribute;
  -	
  -	// assumes caller will pass element nodes
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		_attribute = isElement(node)
  -		    ? _lengthOrAttr[_startNode = node]
  -		    : NULL;
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -		
  -	public int next() {
  -	    final int node = _attribute;
  -	    _attribute = _nextSibling[_attribute];
  -	    return returnNode(node);
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _attribute;
  -	}
  -
  -	public void gotoMark() {
  -	    _attribute = _markedNode;
  -	}
  +         private int _attribute;
  +         
  +         // assumes caller will pass element nodes
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  _attribute = isElement(node)
  +                      ? _lengthOrAttr[_startNode = node]
  +                      : NULL;
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +                  
  +         public int next() {
  +             final int node = _attribute;
  +             _attribute = _nextSibling[_attribute];
  +             return returnNode(node);
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _attribute;
  +         }
  +
  +         public void gotoMark() {
  +             _attribute = _markedNode;
  +         }
       } // end of AttributeIterator
   
   
  @@ -778,38 +822,38 @@
        * Iterator that returns attribute nodes of a given type
        */
       private final class TypedAttributeIterator extends NodeIteratorBase {
  -	private final int _nodeType;
  -	private int _attribute;
  -	
  -	public TypedAttributeIterator(int nodeType) {
  -	    _nodeType = nodeType;
  -	}
  -		
  -	// assumes caller will pass element nodes
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		for (node = _lengthOrAttr[_startNode = node];
  -		     node != NULL && _type[node] != _nodeType;
  -		     node = _nextSibling[node]);
  -		_attribute = node;
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -		
  -	public int next() {
  -	    final int node = _attribute;
  -	    _attribute = NULL;	// singleton iterator
  -	    return returnNode(node);
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _attribute;
  -	}
  -
  -	public void gotoMark() {
  -	    _attribute = _markedNode;
  -	}
  +         private final int _nodeType;
  +         private int _attribute;
  +         
  +         public TypedAttributeIterator(int nodeType) {
  +             _nodeType = nodeType;
  +         }
  +                  
  +         // assumes caller will pass element nodes
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  for (node = _lengthOrAttr[_startNode = node];
  +                       node != NULL && _type[node] != _nodeType;
  +                       node = _nextSibling[node]);
  +                  _attribute = node;
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +                  
  +         public int next() {
  +             final int node = _attribute;
  +             _attribute = NULL;         // singleton iterator
  +             return returnNode(node);
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _attribute;
  +         }
  +
  +         public void gotoMark() {
  +             _attribute = _markedNode;
  +         }
       } // end of TypedAttributeIterator
   
   
  @@ -817,39 +861,39 @@
        * Iterator that returns preceding siblings of a given node
        */
       private class PrecedingSiblingIterator extends NodeIteratorBase {
  -	private int _start;
  -	private int _node;
  -	
  -	public boolean isReverse() {
  -	    return true;
  -	}
  -	
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		_node = _offsetOrChild[_parent[_startNode = _start = node]];
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -		
  -	public int next() {
  -	    if (_node == _start) {
  -		return NULL;
  -	    }
  -	    else {
  -		final int node = _node;
  -		_node = _nextSibling[node];
  -		return returnNode(node);
  -	    }
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _node;
  -	}
  -
  -	public void gotoMark() {
  -	    _node = _markedNode;
  -	}
  +         private int _start;
  +         private int _node;
  +         
  +         public boolean isReverse() {
  +             return true;
  +         }
  +         
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  _node = _offsetOrChild[_parent[_startNode = _start = node]];
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +                  
  +         public int next() {
  +             if (_node == _start) {
  +                  return NULL;
  +             }
  +             else {
  +                  final int node = _node;
  +                  _node = _nextSibling[node];
  +                  return returnNode(node);
  +             }
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _node;
  +         }
  +
  +         public void gotoMark() {
  +             _node = _markedNode;
  +         }
       } // end of PrecedingSiblingIterator
   
   
  @@ -858,19 +902,19 @@
        * a given node
        */
       private final class TypedPrecedingSiblingIterator
  -	extends PrecedingSiblingIterator {
  -	private final int _nodeType;
  +         extends PrecedingSiblingIterator {
  +         private final int _nodeType;
   
  -	public TypedPrecedingSiblingIterator(int type) {
  -	    _nodeType = type;
  -	}
  -	
  -	public int next() {
  -	    int node;
  -	    while ((node = super.next()) != NULL && _type[node] != _nodeType) {
  -	    }
  -	    return node;
  -	}
  +         public TypedPrecedingSiblingIterator(int type) {
  +             _nodeType = type;
  +         }
  +         
  +         public int next() {
  +             int node;
  +             while ((node = super.next()) != NULL && _type[node] != _nodeType) {
  +             }
  +             return node;
  +         }
   
       } // end of PrecedingSiblingIterator
   
  @@ -881,80 +925,80 @@
        * all ancestors.
        */
       private class PrecedingIterator extends NodeIteratorBase {
  -	// start node + ancestors up to ROOTNODE
  -	private int[] _stack = new int[8];
  -	private int _sp, _oldsp;
  -	
  -	//  _node precedes candidates
  -	private int _node;
  -
  -	public boolean isReverse() {
  -	    return true;
  -	}
  -	
  -	public NodeIterator cloneIterator() {
  -	    _isRestartable = false;
  -	    final int[] stackCopy = new int[8];
  -	    try {
  -		final PrecedingIterator clone = 
  -		    (PrecedingIterator)super.clone();
  -		System.arraycopy(_stack, 0, stackCopy, 0, _stack.length);
  -		clone._stack = stackCopy; 
  -		return clone.reset();
  -	    }
  -	    catch (CloneNotSupportedException e) {
  -		BasisLibrary.runTimeError("Iterator clone not supported.");
  -		return null;
  -	    }
  -	}
  -	
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		// iterator is not a clone
  -		int parent, index;
  -		_startNode = node;
  -		_node = ROOTNODE;
  -		_stack[index = 0] = node;
  -		if (node > ROOTNODE) {
  -		    while ((parent = _parent[node]) != ROOTNODE) {
  -			if (++index == _stack.length) {
  -			    final int[] stack = new int[index + 4];
  -			    System.arraycopy(_stack, 0, stack, 0, index);
  -			    _stack = stack;
  -			}
  -			_stack[index] = node = parent;
  -		    }
  -		}
  -		_oldsp = _sp = index;
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -		
  -	public int next() {
  -	    final int node = _node + 1;
  -	    if ((_sp >= 0) && (node < _stack[_sp])) {
  -		return returnNode(_node = node);
  -	    }
  -	    else {
  -		_node = node;	// skip ancestor
  -		return --_sp >= 0 ? next() : NULL;
  -	    }
  -	}
  -
  -	// redefine NodeIteratorBase's reset
  -	public NodeIterator reset() {
  -	    _sp = _oldsp;
  -	    return resetPosition();
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _node;
  -	}
  -
  -	public void gotoMark() {
  -	    _node = _markedNode;
  -	}
  +         // start node + ancestors up to ROOTNODE
  +         private int[] _stack = new int[8];
  +         private int _sp, _oldsp;
  +         
  +         //  _node precedes candidates
  +         private int _node;
  +
  +         public boolean isReverse() {
  +             return true;
  +         }
  +         
  +         public NodeIterator cloneIterator() {
  +             _isRestartable = false;
  +             final int[] stackCopy = new int[8];
  +             try {
  +                  final PrecedingIterator clone = 
  +                      (PrecedingIterator)super.clone();
  +                  System.arraycopy(_stack, 0, stackCopy, 0, _stack.length);
  +                  clone._stack = stackCopy; 
  +                  return clone.reset();
  +             }
  +             catch (CloneNotSupportedException e) {
  +                  BasisLibrary.runTimeError("Iterator clone not supported.");
  +                  return null;
  +             }
  +         }
  +         
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  // iterator is not a clone
  +                  int parent, index;
  +                  _startNode = node;
  +                  _node = ROOTNODE;
  +                  _stack[index = 0] = node;
  +                  if (node > ROOTNODE) {
  +                      while ((parent = _parent[node]) != ROOTNODE) {
  +                           if (++index == _stack.length) {
  +                               final int[] stack = new int[index + 4];
  +                               System.arraycopy(_stack, 0, stack, 0, index);
  +                               _stack = stack;
  +                           }
  +                           _stack[index] = node = parent;
  +                      }
  +                  }
  +                  _oldsp = _sp = index;
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +                  
  +         public int next() {
  +             final int node = _node + 1;
  +             if ((_sp >= 0) && (node < _stack[_sp])) {
  +                  return returnNode(_node = node);
  +             }
  +             else {
  +                  _node = node;         // skip ancestor
  +                  return --_sp >= 0 ? next() : NULL;
  +             }
  +         }
  +
  +         // redefine NodeIteratorBase's reset
  +         public NodeIterator reset() {
  +             _sp = _oldsp;
  +             return resetPosition();
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _node;
  +         }
  +
  +         public void gotoMark() {
  +             _node = _markedNode;
  +         }
       } // end of PrecedingIterator
   
   
  @@ -964,18 +1008,18 @@
        * excludes all ancestors.
        */
       private final class TypedPrecedingIterator extends PrecedingIterator {
  -	private final int _nodeType;
  +         private final int _nodeType;
   
  -	public TypedPrecedingIterator(int type) {
  -	    _nodeType = type;
  -	}
  -	
  -	public int next() {
  -	    int node;
  -	    while ((node = super.next()) != NULL && _type[node] != _nodeType) {
  -	    }
  -	    return node;
  -	}
  +         public TypedPrecedingIterator(int type) {
  +             _nodeType = type;
  +         }
  +         
  +         public int next() {
  +             int node;
  +             while ((node = super.next()) != NULL && _type[node] != _nodeType) {
  +             }
  +             return node;
  +         }
   
       } // end of TypedPrecedingIterator
   
  @@ -984,35 +1028,35 @@
        * Iterator that returns following nodes of for a given node.
        */
       private class FollowingIterator extends NodeIteratorBase {
  -	//  _node precedes search for next
  -	protected int _node;
  -		
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		_startNode = node;
  -		// find rightmost descendant (or self)
  -		int current;
  -		while ((node = lastChild(current = node)) != NULL) {
  -		}
  -		_node = current;
  -		// _node precedes possible following(node) nodes
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -		    
  -	public int next() {
  -	    final int node = _node + 1;
  -	    return node < _treeNodeLimit ? returnNode(_node = node) : NULL;
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _node;
  -	}
  -
  -	public void gotoMark() {
  -	    _node = _markedNode;
  -	}
  +         //  _node precedes search for next
  +         protected int _node;
  +                  
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  _startNode = node;
  +                  // find rightmost descendant (or self)
  +                  int current;
  +                  while ((node = lastChild(current = node)) != NULL) {
  +                  }
  +                  _node = current;
  +                  // _node precedes possible following(node) nodes
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +                      
  +         public int next() {
  +             final int node = _node + 1;
  +             return node < _treeNodeLimit ? returnNode(_node = node) : NULL;
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _node;
  +         }
  +
  +         public void gotoMark() {
  +             _node = _markedNode;
  +         }
       } // end of FollowingIterator
   
   
  @@ -1020,22 +1064,22 @@
        * Iterator that returns following nodes of a given type for a given node.
        */
       private final class TypedFollowingIterator extends FollowingIterator {
  -	private final int _nodeType;
  +         private final int _nodeType;
   
  -	public TypedFollowingIterator(int type) {
  -	    _nodeType = type;
  -	}
  -		
  -	public int next() {
  -	    final int limit = _treeNodeLimit;
  -	    int node = _node + 1;
  -	    final int type = _nodeType;
  -	    // skipping nodes not of desired type
  -	    while (node < limit && _type[node] != type) {
  -		++node;
  -	    }
  -	    return node == limit ? NULL : returnNode(_node = node);
  -	}
  +         public TypedFollowingIterator(int type) {
  +             _nodeType = type;
  +         }
  +                  
  +         public int next() {
  +             final int limit = _treeNodeLimit;
  +             int node = _node + 1;
  +             final int type = _nodeType;
  +             // skipping nodes not of desired type
  +             while (node < limit && _type[node] != type) {
  +                  ++node;
  +             }
  +             return node == limit ? NULL : returnNode(_node = node);
  +         }
       } // end of TypedFollowingIterator
   
   
  @@ -1044,232 +1088,232 @@
        * The nodes are returned in reverse document order, so you
        * get the context node (or its parent node) first, and the
        * root node in the very, very end.
  -     */	
  +     */         
       private class AncestorIterator extends NodeIteratorBase {
   
  -	protected int _index;
  +         protected int _index;
   
  -	public final boolean isReverse() {
  -	    return true;
  -	}
  -
  -	public int getLast() {
  -	    return(ROOT);
  -	}
  -	
  -	public NodeIterator cloneIterator() {
  -	    _isRestartable = false;	// must set to false for any clone
  -	    try {
  -		final AncestorIterator clone = (AncestorIterator)super.clone();
  -		clone._startNode = _startNode;
  -		return clone.reset();
  -	    } catch (CloneNotSupportedException e) {
  -		BasisLibrary.runTimeError("Iterator clone not supported.");
  -		return null;
  -	    }
  -	}
  -		
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		if (_includeSelf)
  -		    _startNode = node;
  -		else
  -		    _startNode = _parent[node];
  -		_index = _startNode;
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -
  -	public NodeIterator reset() {
  -	    _index = _startNode;
  -	    return resetPosition();
  -	}
  -		
  -	public int next() {
  -	    if (_index >= 0) {
  -		int bob = _index;
  -		if (_index == 0)
  -		    _index = -1;
  -		else
  -		    _index = _parent[_index];
  -		return returnNode(bob);
  -	    }
  -	    return(NULL);
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _index;
  -	}
  -
  -	public void gotoMark() {
  -	    _index = _markedNode;
  -	}
  +         public final boolean isReverse() {
  +             return true;
  +         }
  +
  +         public int getLast() {
  +             return(ROOT);
  +         }
  +         
  +         public NodeIterator cloneIterator() {
  +             _isRestartable = false;         // must set to false for any clone
  +             try {
  +                  final AncestorIterator clone = (AncestorIterator)super.clone();
  +                  clone._startNode = _startNode;
  +                  return clone.reset();
  +             } catch (CloneNotSupportedException e) {
  +                  BasisLibrary.runTimeError("Iterator clone not supported.");
  +                  return null;
  +             }
  +         }
  +                  
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  if (_includeSelf)
  +                      _startNode = node;
  +                  else
  +                      _startNode = _parent[node];
  +                  _index = _startNode;
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +
  +         public NodeIterator reset() {
  +             _index = _startNode;
  +             return resetPosition();
  +         }
  +                  
  +         public int next() {
  +             if (_index >= 0) {
  +                  int bob = _index;
  +                  if (_index == 0)
  +                      _index = -1;
  +                  else
  +                      _index = _parent[_index];
  +                  return returnNode(bob);
  +             }
  +             return(NULL);
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _index;
  +         }
  +
  +         public void gotoMark() {
  +             _index = _markedNode;
  +         }
       } // end of AncestorIterator
   
   
       /**************************************************************
        * Typed iterator that returns the ancestors of a given node.
  -     */	    
  +     */             
       private final class TypedAncestorIterator extends AncestorIterator {
   
  -	private final int _nodeType;
  -		
  -	public TypedAncestorIterator(int type) {
  -	    _nodeType = type;
  -	}
  -
  -	public int next() {
  -	    int node;
  -	    while ((node = super.next()) != NULL) {
  -		if (_type[node] == _nodeType)
  -		    return returnNode(node);
  -	    }
  -	    return(NULL);
  -	}
  -
  -	public int getLast() {
  -	    int last = _index;
  -	    int curr = _index;
  -
  -	    while (curr >= 0) {
  -		if (curr == 0)
  -		    curr = -1;
  -		else
  -		    curr = _parent[curr];
  -		if (_type[curr] == _nodeType)
  -		    last = curr;
  -	    }
  -	    return(last);
  -	}
  +         private final int _nodeType;
  +                  
  +         public TypedAncestorIterator(int type) {
  +             _nodeType = type;
  +         }
  +
  +         public int next() {
  +             int node;
  +             while ((node = super.next()) != NULL) {
  +                  if (_type[node] == _nodeType)
  +                      return returnNode(node);
  +             }
  +             return(NULL);
  +         }
  +
  +         public int getLast() {
  +             int last = _index;
  +             int curr = _index;
  +
  +             while (curr >= 0) {
  +                  if (curr == 0)
  +                      curr = -1;
  +                  else
  +                      curr = _parent[curr];
  +                  if (_type[curr] == _nodeType)
  +                      last = curr;
  +             }
  +             return(last);
  +         }
   
       } // end of TypedAncestorIterator
   
   
       /**************************************************************
        * Iterator that returns the descendants of a given node.
  -     */	    
  +     */             
       private class DescendantIterator extends NodeIteratorBase {
  -	//  _node precedes search for next
  -	protected int _node;
  -	// first node outside descendant range
  -	protected int _limit;
  -
  -	public NodeIterator setStartNode(int node) {
  -	    if (_isRestartable) {
  -		_node = _startNode = _includeSelf ? node - 1 : node;
  -		// no descendents if no children
  -		if (hasChildren(node) == false) {
  -		    // set _limit to match next()'s criteria for end
  -		    _limit = node + 1;
  -		}
  -		// find leftmost descendant of next sibling
  -		else if ((node = _nextSibling[node]) == 0) {
  -		    // no next sibling, array end is the limit
  -		    _limit = _treeNodeLimit;
  -		}
  -		else {
  -		    _limit = leftmostDescendant(node);
  -		}
  -		return resetPosition();
  -	    }
  -	    return this;
  -	}
  -
  -	public int next() {
  -	    if (++_node >= (_limit))
  -		return(NULL);
  -	    else
  -		return(returnNode(_node));
  -	}
  -
  -	public void setMark() {
  -	    _markedNode = _node;
  -	}
  -
  -	public void gotoMark() {
  -	    _node = _markedNode;
  -	}
  +         //  _node precedes search for next
  +         protected int _node;
  +         // first node outside descendant range
  +         protected int _limit;
  +
  +         public NodeIterator setStartNode(int node) {
  +             if (_isRestartable) {
  +                  _node = _startNode = _includeSelf ? node - 1 : node;
  +                  // no descendents if no children
  +                  if (hasChildren(node) == false) {
  +                      // set _limit to match next()'s criteria for end
  +                      _limit = node + 1;
  +                  }
  +                  // find leftmost descendant of next sibling
  +                  else if ((node = _nextSibling[node]) == 0) {
  +                      // no next sibling, array end is the limit
  +                      _limit = _treeNodeLimit;
  +                  }
  +                  else {
  +                      _limit = leftmostDescendant(node);
  +                  }
  +                  return resetPosition();
  +             }
  +             return this;
  +         }
  +
  +         public int next() {
  +             if (++_node >= (_limit))
  +                  return(NULL);
  +             else
  +                  return(returnNode(_node));
  +         }
  +
  +         public void setMark() {
  +             _markedNode = _node;
  +         }
  +
  +         public void gotoMark() {
  +             _node = _markedNode;
  +         }
   
       } // end of DescendantIterator
   
   
       /**************************************************************
        * Typed iterator that returns the descendants of a given node.
  -     */	    
  +     */             
       private final class TypedDescendantIterator extends DescendantIterator {
  -	private final int _nodeType;
  -		
  -	public TypedDescendantIterator(int nodeType) {
  -	    _nodeType = nodeType;
  -	}
  -		
  -	public int next() {
  -	    final int limit = _limit;
  -	    final int type = _nodeType;
  -	    int node = _node + 1; // start search w/ next
  -	    // while condition == which nodes to skip
  -	    // iteration stops when at end or node w/ desired type
  -	    while (node < limit && _type[node] != type) {
  -		++node;
  -	    }
  -	    return node < limit ? returnNode(_node = node) : NULL;
  -	}
  +         private final int _nodeType;
  +                  
  +         public TypedDescendantIterator(int nodeType) {
  +             _nodeType = nodeType;
  +         }
  +                  
  +         public int next() {
  +             final int limit = _limit;
  +             final int type = _nodeType;
  +             int node = _node + 1; // start search w/ next
  +             // while condition == which nodes to skip
  +             // iteration stops when at end or node w/ desired type
  +             while (node < limit && _type[node] != type) {
  +                  ++node;
  +             }
  +             return node < limit ? returnNode(_node = node) : NULL;
  +         }
   
       } // end of TypedDescendantIterator
   
   
       /**************************************************************
        * Iterator that returns the descendants of a given node.
  -     */	    
  +     */             
       private class NthDescendantIterator extends DescendantIterator {
   
  -	int _pos;
  +         int _pos;
   
  -	public NthDescendantIterator(int pos) {
  -	    _pos = pos;
  -	    _limit = _treeNodeLimit;
  -	}
  -
  -	// The start node of this iterator is always the root!!!
  -	public NodeIterator setStartNode(int node) {
  -	    NodeIterator iterator = super.setStartNode(1);
  -	    _limit = _treeNodeLimit;
  -	    return iterator;
  -	}
  -
  -	public int next() {
  -	    int node;
  -	    while ((node = super.next()) != END) {
  -		int parent = _parent[node];
  -		int child = _offsetOrChild[parent];
  -		int pos = 0;
  -
  -		do {
  -		    if (isElement(child)) pos++;
  -		} while ((pos < _pos) && (child = _nextSibling[child]) != 0);
  -		if (node == child) return node;
  -	    }
  -	    return(END);
  -	}
  +         public NthDescendantIterator(int pos) {
  +             _pos = pos;
  +             _limit = _treeNodeLimit;
  +         }
  +
  +         // The start node of this iterator is always the root!!!
  +         public NodeIterator setStartNode(int node) {
  +             NodeIterator iterator = super.setStartNode(1);
  +             _limit = _treeNodeLimit;
  +             return iterator;
  +         }
  +
  +         public int next() {
  +             int node;
  +             while ((node = super.next()) != END) {
  +                  int parent = _parent[node];
  +                  int child = _offsetOrChild[parent];
  +                  int pos = 0;
  +
  +                  do {
  +                      if (isElement(child)) pos++;
  +                  } while ((pos < _pos) && (child = _nextSibling[child]) != 0);
  +                  if (node == child) return node;
  +             }
  +             return(END);
  +         }
   
       } // end of NthDescendantIterator
   
   
       /**************************************************************
        * Iterator that returns a given node only if it is of a given type.
  -     */	    
  +     */             
       private final class TypedSingletonIterator extends SingletonIterator {
  -	private final int _nodeType;
  +         private final int _nodeType;
   
  -	public TypedSingletonIterator(int nodeType) {
  -	    _nodeType = nodeType;
  -	}
  -	
  -	public int next() {
  -	    final int result = super.next();
  -	    return _type[result] == _nodeType ? result : NULL;
  -	}
  +         public TypedSingletonIterator(int nodeType) {
  +             _nodeType = nodeType;
  +         }
  +         
  +         public int next() {
  +             final int result = super.next();
  +             return _type[result] == _nodeType ? result : NULL;
  +         }
       } // end of TypedSingletonIterator
   
   
  @@ -1278,173 +1322,173 @@
        * nodes from the underlaying iterator and return all but
        * whitespace text nodes. The iterator needs to be a supplied
        * with a filter that tells it what nodes are WS text.
  -     */	    
  +     */             
       private final class StrippingIterator extends NodeIteratorBase {
   
  -	private static final int USE_PREDICATE  = 0;
  -	private static final int STRIP_SPACE    = 1;
  -	private static final int PRESERVE_SPACE = 2;
  -
  -	private StripWhitespaceFilter _filter = null;
  -	private short[] _mapping = null;
  -	private final NodeIterator _source;
  -	private boolean _children = false;
  -	private int _action = USE_PREDICATE;
  -	private int _last = -1;
  -
  -	public StrippingIterator(NodeIterator source,
  -				 short[] mapping,
  -				 StripWhitespaceFilter filter) {
  -
  -	    _filter = filter;
  -	    _mapping = mapping;
  -	    _source = source;
  -
  -	    if (_source instanceof ChildrenIterator ||
  -		_source instanceof TypedChildrenIterator) {
  -		_children = true;
  -	    }
  -	}
  -
  -	public NodeIterator setStartNode(int node) {
  -	    if (_children) {
  -		if (_filter.stripSpace((DOM)DOMImpl.this, node,
  -				       _mapping[_type[node]]))
  -		    _action = STRIP_SPACE;
  -		else
  -		    _action = PRESERVE_SPACE;
  -	    }
  -
  -	    _source.setStartNode(node);
  -	    return resetPosition();
  -	}
  +         private static final int USE_PREDICATE  = 0;
  +         private static final int STRIP_SPACE    = 1;
  +         private static final int PRESERVE_SPACE = 2;
  +
  +         private StripWhitespaceFilter _filter = null;
  +         private short[] _mapping = null;
  +         private final NodeIterator _source;
  +         private boolean _children = false;
  +         private int _action = USE_PREDICATE;
  +         private int _last = -1;
  +
  +         public StrippingIterator(NodeIterator source,
  +                                     short[] mapping,
  +                                     StripWhitespaceFilter filter) {
  +
  +             _filter = filter;
  +             _mapping = mapping;
  +             _source = source;
  +
  +             if (_source instanceof ChildrenIterator ||
  +                  _source instanceof TypedChildrenIterator) {
  +                  _children = true;
  +             }
  +         }
  +
  +         public NodeIterator setStartNode(int node) {
  +             if (_children) {
  +                  if (_filter.stripSpace((DOM)DOMImpl.this, node,
  +                                           _mapping[_type[node]]))
  +                      _action = STRIP_SPACE;
  +                  else
  +                      _action = PRESERVE_SPACE;
  +             }
  +
  +             _source.setStartNode(node);
  +             return resetPosition();
  +         }
       
  -	public int next() {
  -	    int node;
  -	    while ((node = _source.next()) != END) {
  -		switch(_action) {
  -		case STRIP_SPACE:
  -		    if (_whitespace.getBit(node)) continue;
  -		    // fall through...
  -		case PRESERVE_SPACE:
  -		    return returnNode(node);
  -		case USE_PREDICATE:
  -		    if (_whitespace.getBit(node) &&
  -			_filter.stripSpace((DOM)DOMImpl.this, node,
  -					   _mapping[_type[_parent[node]]]))
  -			continue;
  -		    return returnNode(node);
  -		}
  -	    }
  -	    return END;
  -	}
  +         public int next() {
  +             int node;
  +             while ((node = _source.next()) != END) {
  +                  switch(_action) {
  +                  case STRIP_SPACE:
  +                      if (_whitespace.getBit(node)) continue;
  +                      // fall through...
  +                  case PRESERVE_SPACE:
  +                      return returnNode(node);
  +                  case USE_PREDICATE:
  +                      if (_whitespace.getBit(node) &&
  +                           _filter.stripSpace((DOM)DOMImpl.this, node,
  +                                                _mapping[_type[_parent[node]]]))
  +                           continue;
  +                      return returnNode(node);
  +                  }
  +             }
  +             return END;
  +         }
       
  -	public void setMark() {
  -	    _source.setMark();
  -	}
  -
  -	public void gotoMark() {
  -	    _source.gotoMark();
  -	}
  -
  -	public int getLast() {
  -	    // Return chached value (if we have it)
  -	    if (_last != -1) return _last;
  -
  -	    int count = getPosition();
  -	    int node;
  -
  -	    _source.setMark();
  -	    while ((node = _source.next()) != END) {
  -		switch(_action) {
  -		case STRIP_SPACE:
  -		    if (_whitespace.getBit(node))
  -			continue;
  -		    // fall through...
  -		case PRESERVE_SPACE:
  -		    count++;
  -		    break;
  -		case USE_PREDICATE:
  -		    if (_whitespace.getBit(node) &&
  -			_filter.stripSpace((DOM)DOMImpl.this, node,
  -					   _mapping[_type[_parent[node]]]))
  -			continue;
  -		    else
  -			count++;
  -		}
  -	    }
  -	    _source.gotoMark();
  -	    _last = count;
  -	    return(count);
  -	}
  +         public void setMark() {
  +             _source.setMark();
  +         }
  +
  +         public void gotoMark() {
  +             _source.gotoMark();
  +         }
  +
  +         public int getLast() {
  +             // Return chached value (if we have it)
  +             if (_last != -1) return _last;
  +
  +             int count = getPosition();
  +             int node;
  +
  +             _source.setMark();
  +             while ((node = _source.next()) != END) {
  +                  switch(_action) {
  +                  case STRIP_SPACE:
  +                      if (_whitespace.getBit(node))
  +                           continue;
  +                      // fall through...
  +                  case PRESERVE_SPACE:
  +                      count++;
  +                      break;
  +                  case USE_PREDICATE:
  +                      if (_whitespace.getBit(node) &&
  +                           _filter.stripSpace((DOM)DOMImpl.this, node,
  +                                                _mapping[_type[_parent[node]]]))
  +                           continue;
  +                      else
  +                           count++;
  +                  }
  +             }
  +             _source.gotoMark();
  +             _last = count;
  +             return(count);
  +         }
   
       } // end of StrippingIterator
   
       public NodeIterator strippingIterator(NodeIterator iterator, short[] mapping,
  -			     StripWhitespaceFilter filter) {
  -	return(new StrippingIterator(iterator, mapping, filter));
  +                                StripWhitespaceFilter filter) {
  +         return(new StrippingIterator(iterator, mapping, filter));
       }
  -			     
  +                                
   
       /**************************************************************
        * Iterator that assured that a single node is only returned once
        * and that the nodes are returned in document order.
  -     */	    
  +     */             
       private final class OrderedIterator extends NodeIteratorBase {
   
  -	private BitArray  _nodes = null;
  -	private int       _save = 0;
  -	private int       _mark = 0;
  -	private int       _start = 0;
  -	private int       _node = -1;
  -	private int       _last = 0;
  -
  -	public OrderedIterator(NodeIterator source, int node) {
  -	    _nodes = new BitArray(_treeNodeLimit);
  -	    source.setStartNode(node);
  -	    while ((_node = source.next()) != END) {
  -		if (_start == -1) _start = _node;
  -		_last = _node;
  -		_nodes.setBit(_node);
  -	    }
  -	    _node = -1;
  -	}
  +         private BitArray  _nodes = null;
  +         private int       _save = 0;
  +         private int       _mark = 0;
  +         private int       _start = 0;
  +         private int       _node = -1;
  +         private int       _last = 0;
  +
  +         public OrderedIterator(NodeIterator source, int node) {
  +             _nodes = new BitArray(_treeNodeLimit);
  +             source.setStartNode(node);
  +             while ((_node = source.next()) != END) {
  +                  if (_start == -1) _start = _node;
  +                  _last = _node;
  +                  _nodes.setBit(_node);
  +             }
  +             _node = -1;
  +         }
    
  -	public int next() {
  -	    while ((_node < _treeNodeLimit) && (!_nodes.getBit(++_node))) ;
  -	    if (_node >= _treeNodeLimit) return(END);
  -	    return returnNode(_node);
  -	}
  -
  -	public NodeIterator reset() {
  -	    _node = _start - 1;
  -	    return(this);
  -	}
  -
  -	public int getLast() {
  -	    return(_last);
  -	}
  -	
  -	public void setMark() {
  -	    _save = _node;
  -	}
  -
  -	public void gotoMark() {
  -	    _node = _save;
  -	}
  -
  -	public NodeIterator setStartNode(int start) {
  -	    _start = start;
  -	    return((NodeIterator)this);
  -	}
  -
  -	public boolean isReverse() {
  -	    return(false);
  -	}
  -
  -	public NodeIterator cloneIterator() {
  -	    return((NodeIterator)this);
  -	}
  +         public int next() {
  +             while ((_node < _treeNodeLimit) && (!_nodes.getBit(++_node))) ;
  +             if (_node >= _treeNodeLimit) return(END);
  +             return returnNode(_node);
  +         }
  +
  +         public NodeIterator reset() {
  +             _node = _start - 1;
  +             return(this);
  +         }
  +
  +         public int getLast() {
  +             return(_last);
  +         }
  +         
  +         public void setMark() {
  +             _save = _node;
  +         }
  +
  +         public void gotoMark() {
  +             _node = _save;
  +         }
  +
  +         public NodeIterator setStartNode(int start) {
  +             _start = start;
  +             return((NodeIterator)this);
  +         }
  +
  +         public boolean isReverse() {
  +             return(false);
  +         }
  +
  +         public NodeIterator cloneIterator() {
  +             return((NodeIterator)this);
  +         }
   
       } // end of OrderedIterator
   
  @@ -1452,40 +1496,40 @@
        *
        */
       public NodeIterator orderNodes(NodeIterator source, int node) {
  -	return new OrderedIterator(source, node);
  +         return new OrderedIterator(source, node);
       }
   
       /**
        * Returns the leftmost descendant of a node (bottom left in sub-tree)
        */
       private int leftmostDescendant(int node) {
  -	int current;
  -	while (_type[current = node] >= NTYPES 
  -	       && (node = _offsetOrChild[node]) != NULL) {
  -	}
  -	return current;
  +         int current;
  +         while (_type[current = node] >= NTYPES 
  +                && (node = _offsetOrChild[node]) != NULL) {
  +         }
  +         return current;
       }
   
       /**
        * Returns index of last child or 0 if no children
        */
       private int lastChild(int node) {
  -	if (isElement(node) || node == ROOTNODE) {
  -	    int child;
  -	    if ((child = _offsetOrChild[node]) != NULL) {
  -		while ((child = _nextSibling[node = child]) != NULL) {
  -		}
  -		return node;
  -	    }
  -	}
  -	return 0;
  +         if (isElement(node) || node == ROOTNODE) {
  +             int child;
  +             if ((child = _offsetOrChild[node]) != NULL) {
  +                  while ((child = _nextSibling[node = child]) != NULL) {
  +                  }
  +                  return node;
  +             }
  +         }
  +         return 0;
       }
   
       /**
        * Returns the parent of a node
        */
       public int getParent(final int node) {
  -	return _parent[node];
  +         return _parent[node];
       }
   
       /**
  @@ -1493,130 +1537,130 @@
        */
       public int getTypedPosition(NodeIterator iterator, int type, int node) {
   
  -	// Just return the basic position if no type is specified
  -	if (type == -1) type = _type[node];
  -	//if (type == -1) return(iterator.getPosition()); DEAD WRONG!!!!
  -
  -	int match = 1;
  -	int curr  = 0;
  -	iterator.reset();
  -
  -	while ( ((curr = iterator.next()) != NULL) && (curr != node)) {
  -	    if (_type[curr] == type) match++;
  -	}
  -	return match;	
  +         // Just return the basic position if no type is specified
  +         if (type == -1) type = _type[node];
  +         //if (type == -1) return(iterator.getPosition()); DEAD WRONG!!!!
  +
  +         int match = 1;
  +         int curr  = 0;
  +         iterator.reset();
  +
  +         while ( ((curr = iterator.next()) != NULL) && (curr != node)) {
  +             if (_type[curr] == type) match++;
  +         }
  +         return match;         
       }
   
       /**
        * Returns an iterator's last node of a given type
        */
       public int getTypedLast(NodeIterator iterator, int type, int node) {
  -	// Just return the basic position if no type is specified
  -	if (type == -1) return(iterator.getLast());
  +         // Just return the basic position if no type is specified
  +         if (type == -1) return(iterator.getLast());
   
  -	int match = 0;
  -	int curr  = 0;
  -	iterator.setMark();
  -	iterator.reset();
  -
  -	while ((curr = iterator.next()) != NULL) {
  -	    if (_type[curr] == type) match++;
  -	}
  -	iterator.gotoMark();
  -	return match;	
  +         int match = 0;
  +         int curr  = 0;
  +         iterator.setMark();
  +         iterator.reset();
  +
  +         while ((curr = iterator.next()) != NULL) {
  +             if (_type[curr] == type) match++;
  +         }
  +         iterator.gotoMark();
  +         return match;         
       }
   
  -	
  +         
       /**
        * Returns singleton iterator containg the document root
        * Works for them main document (mark == 0)
        */
       public NodeIterator getIterator() {
  -	return new SingletonIterator(ROOTNODE);
  +         return new SingletonIterator(ROOTNODE);
       }
   
       public int getType(final int node) {
  -	if (node >= _type.length)
  -	    return(0);
  -	else
  -	    return _type[node];
  +         if (node >= _type.length)
  +             return(0);
  +         else
  +             return _type[node];
       }
       
       public int getNamespaceType(final int node) {
  -	final int type = _type[node];
  -	if (type >= NTYPES)
  -	    return(_namespace[type-NTYPES]);
  -	else
  -	    return(0); // default namespace
  +         final int type = _type[node];
  +         if (type >= NTYPES)
  +             return(_namespace[type-NTYPES]);
  +         else
  +             return(0); // default namespace
       }
   
       public short[] getTypeArray() {
  -	return _type;
  +         return _type;
       }
   
       public String getNodeValue(final int node) {
  -	if (node == NULL) return EMPTYSTRING;
  -	switch(_type[node]) {
  -	case ROOT:
  -	    return getNodeValue(_offsetOrChild[node]);
  -	case TEXT:
  -	    return makeStringValue(node);
  -	default:
  -	    return node < _treeNodeLimit
  -		? getElementValue(node) // element string value
  -		: makeStringValue(node); // attribute value
  -	}
  +         if (node == NULL) return EMPTYSTRING;
  +         switch(_type[node]) {
  +         case ROOT:
  +             return getNodeValue(_offsetOrChild[node]);
  +         case TEXT:
  +             return makeStringValue(node);
  +         default:
  +             return node < _treeNodeLimit
  +                  ? getElementValue(node) // element string value
  +                  : makeStringValue(node); // attribute value
  +         }
       }
   
       private Hashtable setupMapping(String[] namesArray) {
  -	final int nNames = namesArray.length;
  -	final Hashtable types = new Hashtable(nNames);
  -	for (int i = 0; i < nNames; i++) {
  -	    types.put(namesArray[i], new Integer(i + NTYPES));
  -	}
  -	return types;
  +         final int nNames = namesArray.length;
  +         final Hashtable types = new Hashtable(nNames);
  +         for (int i = 0; i < nNames; i++) {
  +             types.put(namesArray[i], new Integer(i + NTYPES));
  +         }
  +         return types;
       }
   
       public int getGeneralizedType(final String name) {
  -	final Integer type = (Integer)_types.get(name);
  -	if (type == null) {
  -	    // memorize default type
  -	    final int code = name.charAt(0) == '@' ? ATTRIBUTE : ELEMENT;
  -	    _types.put(name, new Integer(code));
  -	    return code;
  -	}
  -	else {
  -	    return type.intValue();
  -	}
  +         final Integer type = (Integer)_types.get(name);
  +         if (type == null) {
  +             // memorize default type
  +             final int code = name.charAt(0) == '@' ? ATTRIBUTE : ELEMENT;
  +             _types.put(name, new Integer(code));
  +             return code;
  +         }
  +         else {
  +             return type.intValue();
  +         }
       }
   
       /**
        * Get mapping from DOM element/attribute types to external types
        */
       public short[] getMapping(String[] names) {
  -	final int namesLength = names.length;
  -	final int mappingLength = _namesArray.length + NTYPES;
  -	final short[] result = new short[mappingLength];
  -
  -	// primitive types map to themselves
  -	for (int i = 0; i < NTYPES; i++)
  -	    result[i] = (short)i;
  -
  -	// extended types initialized to "beyond caller's types"
  -	// unknown element or Attr
  -	for (int i = NTYPES; i < mappingLength; i++) {
  -	    final String name = _namesArray[i - NTYPES];
  -	    final int atPos = name.lastIndexOf(':')+1;
  -	    result[i] = (short)(name.charAt(atPos) == '@'
  -				? ATTRIBUTE : ELEMENT);
  -	}
  -
  -	// actual mapping of caller requested names
  -	for (int i = 0; i < namesLength; i++) {
  -	    result[getGeneralizedType(names[i])] = (short)(i + NTYPES);
  -	}
  -	    
  -	return(result);
  +         final int namesLength = names.length;
  +         final int mappingLength = _namesArray.length + NTYPES;
  +         final short[] result = new short[mappingLength];
  +
  +         // primitive types map to themselves
  +         for (int i = 0; i < NTYPES; i++)
  +             result[i] = (short)i;
  +
  +         // extended types initialized to "beyond caller's types"
  +         // unknown element or Attr
  +         for (int i = NTYPES; i < mappingLength; i++) {
  +             final String name = _namesArray[i - NTYPES];
  +             final int atPos = name.lastIndexOf(':')+1;
  +             result[i] = (short)(name.charAt(atPos) == '@'
  +                                    ? ATTRIBUTE : ELEMENT);
  +         }
  +
  +         // actual mapping of caller requested names
  +         for (int i = 0; i < namesLength; i++) {
  +             result[getGeneralizedType(names[i])] = (short)(i + NTYPES);
  +         }
  +             
  +         return(result);
   
       }
   
  @@ -1624,133 +1668,133 @@
        * Get mapping from external element/attribute types to DOM types
        */
       public short[] getReverseMapping(String[] names) {
  -	final short[] result = new short[names.length + NTYPES];
  -	// primitive types map to themselves
  -	for (int i = 0; i < NTYPES; i++) {
  -	    result[i] = (short)i;
  -	}
  -	// caller's types map into appropriate dom types
  -	for (int i = 0; i < names.length; i++) {
  -	    result[i + NTYPES] = (short)getGeneralizedType(names[i]);
  -	    if (result[i + NTYPES] == ELEMENT)
  -		result[i + NTYPES] = NO_TYPE;
  -	}
  -	return(result);
  +         final short[] result = new short[names.length + NTYPES];
  +         // primitive types map to themselves
  +         for (int i = 0; i < NTYPES; i++) {
  +             result[i] = (short)i;
  +         }
  +         // caller's types map into appropriate dom types
  +         for (int i = 0; i < names.length; i++) {
  +             result[i + NTYPES] = (short)getGeneralizedType(names[i]);
  +             if (result[i + NTYPES] == ELEMENT)
  +                  result[i + NTYPES] = NO_TYPE;
  +         }
  +         return(result);
       }
   
       /**
        * Get mapping from DOM namespace types to external namespace types
        */
       public short[] getNamespaceMapping(String[] namespaces) {
  -	final int nsLength = namespaces.length;
  -	final int mappingLength = _nsNamesArray.length;
  -	final short[] result = new short[mappingLength];
  -
  -	// Initialize all entries to -1
  -	for (int i=0; i<mappingLength; i++)
  -	    result[i] = (-1);
  -
  -	for (int i=0; i<nsLength; i++) {
  -	    Integer type = (Integer)_nsIndex.get(namespaces[i]);
  -	    if (type != null) {
  -		result[type.intValue()] = (short)i;
  -	    }
  -	}
  +         final int nsLength = namespaces.length;
  +         final int mappingLength = _nsNamesArray.length;
  +         final short[] result = new short[mappingLength];
  +
  +         // Initialize all entries to -1
  +         for (int i=0; i<mappingLength; i++)
  +             result[i] = (-1);
  +
  +         for (int i=0; i<nsLength; i++) {
  +             Integer type = (Integer)_nsIndex.get(namespaces[i]);
  +             if (type != null) {
  +                  result[type.intValue()] = (short)i;
  +             }
  +         }
   
  -	return(result);
  +         return(result);
       }
   
       /**
        * Get mapping from external namespace types to DOM namespace types
        */
       public short[] getReverseNamespaceMapping(String[] namespaces) {
  -	final int length = namespaces.length;
  -	final short[] result = new short[length];
  +         final int length = namespaces.length;
  +         final short[] result = new short[length];
   
  -	for (int i=0; i<length; i++) {
  -	    Integer type = (Integer)_nsIndex.get(namespaces[i]);
  -	    if (type == null)
  -		result[i] = -1;
  -	    else
  -		result[i] = type.shortValue();
  -	}
  +         for (int i=0; i<length; i++) {
  +             Integer type = (Integer)_nsIndex.get(namespaces[i]);
  +             if (type == null)
  +                  result[i] = -1;
  +             else
  +                  result[i] = type.shortValue();
  +         }
   
  -	return(result);
  +         return(result);
       }
   
       public void writeExternal(ObjectOutput out) throws IOException {
  -	out.writeInt(_treeNodeLimit);
  -	out.writeObject(_type);
  -	out.writeObject(_parent);
  -	out.writeObject(_nextSibling);
  -	out.writeObject(_offsetOrChild);
  -	out.writeObject(_lengthOrAttr);
  -	out.writeObject(_text);
  -	out.writeObject(_namesArray);
  -	out.writeObject(_whitespace);
  -	out.flush();
  +         out.writeInt(_treeNodeLimit);
  +         out.writeObject(_type);
  +         out.writeObject(_parent);
  +         out.writeObject(_nextSibling);
  +         out.writeObject(_offsetOrChild);
  +         out.writeObject(_lengthOrAttr);
  +         out.writeObject(_text);
  +         out.writeObject(_namesArray);
  +         out.writeObject(_whitespace);
  +         out.flush();
       }
   
       public void readExternal(ObjectInput in)
  -	throws IOException, ClassNotFoundException {
  -	_treeNodeLimit = in.readInt();
  -	_type          = (short[])in.readObject();
  -	_parent        = (int[])in.readObject();
  -	_nextSibling   = (int[])in.readObject();
  -	_offsetOrChild = (int[])in.readObject();
  -	_lengthOrAttr  = (int[])in.readObject();
  -	_text          = (char[])in.readObject();
  -	_namesArray    = (String[])in.readObject();
  -	_whitespace    = (BitArray)in.readObject();
  +         throws IOException, ClassNotFoundException {
  +         _treeNodeLimit = in.readInt();
  +         _type          = (short[])in.readObject();
  +         _parent        = (int[])in.readObject();
  +         _nextSibling   = (int[])in.readObject();
  +         _offsetOrChild = (int[])in.readObject();
  +         _lengthOrAttr  = (int[])in.readObject();
  +         _text          = (char[])in.readObject();
  +         _namesArray    = (String[])in.readObject();
  +         _whitespace    = (BitArray)in.readObject();
   
  -	_types         = setupMapping(_namesArray);
  +         _types         = setupMapping(_namesArray);
       }
   
       public DOMImpl() {
  -	this(32*1024);
  +         this(32*1024);
       }
  -	
  +         
       public DOMImpl(final int size) {
  -	_type          = new short[size];
  -	_parent        = new int[size];
  -	_nextSibling   = new int[size];
  -	_offsetOrChild = new int[size];
  -	_lengthOrAttr  = new int[size];
  -	_text          = new char[size * 10];
  -	_whitespace    = new BitArray(size);
  -	// _namesArray will be allocated at endDocument
  +         _type          = new short[size];
  +         _parent        = new int[size];
  +         _nextSibling   = new int[size];
  +         _offsetOrChild = new int[size];
  +         _lengthOrAttr  = new int[size];
  +         _text          = new char[size * 10];
  +         _whitespace    = new BitArray(size);
  +         // _namesArray will be allocated at endDocument
       }
   
       public void print(int node, int level) {
  -	switch(_type[node]) {
  -	case ROOT:
  -	    print(_offsetOrChild[node], level);
  -	    break;
  -
  -	case TEXT:
  -	    System.out.print(makeStringValue(node));
  -	    break;
  -
  -	case PROCESSING_INSTRUCTION:
  -	case COMMENT:
  -	    System.out.println("***PI/CMT***");
  -	    break;
  -
  -	default:		// element
  -	    final String name = getNodeName(node);
  -	    System.out.print("<" + name);
  -	    for (int a = _lengthOrAttr[node]; a != NULL; a = _nextSibling[a]) {
  -		System.out.print("\n" + getNodeName(a) +
  -				 "=\"" + makeStringValue(a) + "\"");
  -	    }
  -	    System.out.print('>');
  -	    for (int child = _offsetOrChild[node]; child != NULL;
  -		 child = _nextSibling[child]) {
  -		print(child, level + 1);
  -	    }
  -	    System.out.println("</" + name + '>');
  -	    break;
  -	}
  +         switch(_type[node]) {
  +         case ROOT:
  +             print(_offsetOrChild[node], level);
  +             break;
  +
  +         case TEXT:
  +             System.out.print(makeStringValue(node));
  +             break;
  +
  +         case PROCESSING_INSTRUCTION:
  +         case COMMENT:
  +             System.out.println("***PI/CMT***");
  +             break;
  +
  +         default:                  // element
  +             final String name = getNodeName(node);
  +             System.out.print("<" + name);
  +             for (int a = _lengthOrAttr[node]; a != NULL; a = _nextSibling[a]) {
  +                  System.out.print("\n" + getNodeName(a) +
  +                                     "=\"" + makeStringValue(a) + "\"");
  +             }
  +             System.out.print('>');
  +             for (int child = _offsetOrChild[node]; child != NULL;
  +                   child = _nextSibling[child]) {
  +                  print(child, level + 1);
  +             }
  +             System.out.println("</" + name + '>');
  +             break;
  +         }
       }
   
       /**
  @@ -1759,9 +1803,9 @@
        */
       /*
       private String namedNodeName(final int type) {
  -	final String rawName = _namesArray[type - NTYPES];
  +         final String rawName = _namesArray[type - NTYPES];
   
  -	return rawName.charAt(0) == '@' ? rawName.substring(1) : rawName;
  +         return rawName.charAt(0) == '@' ? rawName.substring(1) : rawName;
       }
       */
   
  @@ -1769,469 +1813,469 @@
        * Returns the name of a node (attribute or element).
        */
       public String getNodeName(final int node) {
  -	// Get the node type and make sure that it is within limits
  -	final short type = _type[node];
  -	if (type == DOM.PROCESSING_INSTRUCTION)
  -	    return("a-pi");
  -	else if (type < NTYPES)
  -	    return EMPTYSTRING;
  -
  -	// Get node's name (attribute or element)
  -	final String rawName = _namesArray[type - NTYPES];
  -	// Make sure attributes are returned without the leading '@'
  -	if (node < _firstAttributeNode)
  -	    return(rawName);
  -	else {
  -	    final int col = rawName.lastIndexOf(':');
  -	    if (col < 0)
  -		return(rawName.substring(1));
  -	    else
  -		return(rawName.substring(0,col)+':'+rawName.substring(col+2));
  -	}
  +         // Get the node type and make sure that it is within limits
  +         final short type = _type[node];
  +         if (type == DOM.PROCESSING_INSTRUCTION)
  +             return("a-pi");
  +         else if (type < NTYPES)
  +             return EMPTYSTRING;
  +
  +         // Get node's name (attribute or element)
  +         final String rawName = _namesArray[type - NTYPES];
  +         // Make sure attributes are returned without the leading '@'
  +         if (node < _firstAttributeNode)
  +             return(rawName);
  +         else {
  +             final int col = rawName.lastIndexOf(':');
  +             if (col < 0)
  +                  return(rawName.substring(1));
  +             else
  +                  return(rawName.substring(0,col)+':'+rawName.substring(col+2));
  +         }
       }
   
       public String getNamespaceName(final int node) {
  -	final int type = getNamespaceType(node);
  -	return(_nsNamesArray[type]);
  +         final int type = getNamespaceType(node);
  +         return(_nsNamesArray[type]);
       }
   
       private String makeStringValue(final int node) {
  -	return new String(_text, _offsetOrChild[node], _lengthOrAttr[node]);
  +         return new String(_text, _offsetOrChild[node], _lengthOrAttr[node]);
       }
   
       public String getAttributeValue(final int eType,
  -				    final int node,
  -				    final short[] reverseMapping) {
  -	return getAttributeValue(reverseMapping[eType], node);
  +                                        final int node,
  +                                        final short[] reverseMapping) {
  +         return getAttributeValue(reverseMapping[eType], node);
       }
       
       public String getAttributeValue(final int gType, final int element) {
  -	for (int attr = _lengthOrAttr[element];
  -	     attr != NULL;
  -	     attr = _nextSibling[attr]) {
  -	    if (_type[attr] == gType) {
  -		return makeStringValue(attr);
  -	    }
  -	}
  -	return EMPTYSTRING;
  +         for (int attr = _lengthOrAttr[element];
  +              attr != NULL;
  +              attr = _nextSibling[attr]) {
  +             if (_type[attr] == gType) {
  +                  return makeStringValue(attr);
  +             }
  +         }
  +         return EMPTYSTRING;
       }
   
       public int getAttributeNode(final int gType, final int element) {
  -	for (int attr = _lengthOrAttr[element]; attr != NULL;
  -	     attr = _nextSibling[attr]) {
  -	    if (_type[attr] == gType) {
  -		return attr;
  -	    }
  -	}
  -	return NULL;
  +         for (int attr = _lengthOrAttr[element]; attr != NULL;
  +              attr = _nextSibling[attr]) {
  +             if (_type[attr] == gType) {
  +                  return attr;
  +             }
  +         }
  +         return NULL;
       }
   
       // for testing
       public String getAttributeValue(final String name, final int element) {
  -	return getAttributeValue(getGeneralizedType(name), element);
  +         return getAttributeValue(getGeneralizedType(name), element);
       }
       
       public boolean hasAttribute(final int gType, final int node) {
  -	for (int attr = _lengthOrAttr[node]; attr != NULL;
  -	     attr = _nextSibling[attr]) {
  -	    if (_type[attr] == gType) {
  -		return true;
  -	    }
  -	}
  -	return false;
  +         for (int attr = _lengthOrAttr[node]; attr != NULL;
  +              attr = _nextSibling[attr]) {
  +             if (_type[attr] == gType) {
  +                  return true;
  +             }
  +         }
  +         return false;
       }
   
       private boolean hasChildren(final int node) {
  -	if (node < _treeNodeLimit) {
  -	    final int type = _type[node];
  -	    return(((type >= NTYPES) || (type == ROOT)) &&
  -		   (_offsetOrChild[node] != 0));
  -	}
  -	return(false);
  +         if (node < _treeNodeLimit) {
  +             final int type = _type[node];
  +             return(((type >= NTYPES) || (type == ROOT)) &&
  +                     (_offsetOrChild[node] != 0));
  +         }
  +         return(false);
       }
   
       public NodeIterator getChildren(final int node) {
  -	if (hasChildren(node)) {
  -	    return(new ChildrenIterator());
  -	}
  -	else {
  -	    return(EMPTYITERATOR);
  -	}
  +         if (hasChildren(node)) {
  +             return(new ChildrenIterator());
  +         }
  +         else {
  +             return(EMPTYITERATOR);
  +         }
       }
   
       // shortcut for a popular one
       public NodeIterator getTypedChildren(final int type) {
  -	return(new TypedChildrenIterator(type));
  +         return(new TypedChildrenIterator(type));
       }
   
       public NodeIterator getAxisIterator(final int axis) {
  -	NodeIterator iterator = null;
  +         NodeIterator iterator = null;
   
  -	switch (axis) {
  -	case Axis.SELF:
  -	    iterator = new SingletonIterator();
  -	    break;
  -	case Axis.CHILD:
  -	    iterator = new ChildrenIterator();
  -	    break;
  -	case Axis.PARENT:
  -	    return(new ParentIterator());
  -	case Axis.ANCESTOR:
  -	    return(new AncestorIterator());
  -	case Axis.ANCESTORORSELF:
  -	    return((new AncestorIterator()).includeSelf());
  -	case Axis.ATTRIBUTE:
  -	    return(new AttributeIterator());
  -	case Axis.DESCENDANT:
  -	    iterator = new DescendantIterator();
  -	    break;
  -	case Axis.DESCENDANTORSELF:
  -	    iterator = (new DescendantIterator()).includeSelf();
  -	    break;
  -	case Axis.FOLLOWING:
  -	    iterator = new FollowingIterator();
  -	    break;
  -	case Axis.PRECEDING:
  -	    iterator = new PrecedingIterator();
  -	    break;
  -	case Axis.FOLLOWINGSIBLING:
  -	    iterator = new FollowingSiblingIterator();
  -	    break;
  -	case Axis.PRECEDINGSIBLING:
  -	    iterator = new PrecedingSiblingIterator();
  -	    break;
  -	case Axis.NAMESPACE:
  -	    return(new TypedAttributeIterator(getGeneralizedType("xmlns")));
  -	default:
  -	    BasisLibrary.runTimeError("Error: iterator for axis '" + 
  -				      Axis.names[axis] + "' not implemented");
  -	    System.exit(1);
  -	}
  -	return(iterator);
  +         switch (axis) {
  +         case Axis.SELF:
  +             iterator = new SingletonIterator();
  +             break;
  +         case Axis.CHILD:
  +             iterator = new ChildrenIterator();
  +             break;
  +         case Axis.PARENT:
  +             return(new ParentIterator());
  +         case Axis.ANCESTOR:
  +             return(new AncestorIterator());
  +         case Axis.ANCESTORORSELF:
  +             return((new AncestorIterator()).includeSelf());
  +         case Axis.ATTRIBUTE:
  +             return(new AttributeIterator());
  +         case Axis.DESCENDANT:
  +             iterator = new DescendantIterator();
  +             break;
  +         case Axis.DESCENDANTORSELF:
  +             iterator = (new DescendantIterator()).includeSelf();
  +             break;
  +         case Axis.FOLLOWING:
  +             iterator = new FollowingIterator();
  +             break;
  +         case Axis.PRECEDING:
  +             iterator = new PrecedingIterator();
  +             break;
  +         case Axis.FOLLOWINGSIBLING:
  +             iterator = new FollowingSiblingIterator();
  +             break;
  +         case Axis.PRECEDINGSIBLING:
  +             iterator = new PrecedingSiblingIterator();
  +             break;
  +         case Axis.NAMESPACE:
  +             return(new TypedAttributeIterator(getGeneralizedType("xmlns")));
  +         default:
  +             BasisLibrary.runTimeError("Error: iterator for axis '" + 
  +                                          Axis.names[axis] + "' not implemented");
  +             System.exit(1);
  +         }
  +         return(iterator);
       }
   
       public NodeIterator getTypedAxisIterator(int axis, int type) {
  -	NodeIterator iterator = null;
  +         NodeIterator iterator = null;
   
  -	/* This causes an error when using patterns for elements that
  -	   do not exist in the DOM (translet types which do not correspond
  -	   to a DOM type are mapped to the DOM.ELEMENT type).
  -	*/
  -
  -	if (type == NO_TYPE) {
  -	    return(EMPTYITERATOR);
  -	}
  +         /* This causes an error when using patterns for elements that
  +            do not exist in the DOM (translet types which do not correspond
  +            to a DOM type are mapped to the DOM.ELEMENT type).
  +         */
  +
  +         if (type == NO_TYPE) {
  +             return(EMPTYITERATOR);
  +         }
           else if (type == ELEMENT) {
  -	    iterator = new FilterIterator(getAxisIterator(axis),
  -					  getElementFilter());
  -	}
  -	else
  -	{
  -	    switch (axis) {
  -	    case Axis.SELF:
  -		iterator = new TypedSingletonIterator(type);
  -		break;
  -	    case Axis.CHILD:
  -		iterator = new TypedChildrenIterator(type);
  -		break;
  -	    case Axis.PARENT:
  -		return(new ParentIterator().setNodeType(type));
  -	    case Axis.ANCESTOR:
  -		return(new TypedAncestorIterator(type));
  -	    case Axis.ANCESTORORSELF:
  -		return((new TypedAncestorIterator(type)).includeSelf());
  -	    case Axis.ATTRIBUTE:
  -		return(new TypedAttributeIterator(type));
  -	    case Axis.DESCENDANT:
  -		iterator = new TypedDescendantIterator(type);
  -		break;
  -	    case Axis.DESCENDANTORSELF:
  -		iterator = (new TypedDescendantIterator(type)).includeSelf();
  -		break;
  -	    case Axis.FOLLOWING:
  -		iterator = new TypedFollowingIterator(type);
  -		break;
  -	    case Axis.PRECEDING:
  -		iterator = new TypedPrecedingIterator(type);
  -		break;
  -	    case Axis.FOLLOWINGSIBLING:
  -		iterator = new TypedFollowingSiblingIterator(type);
  -		break;
  -	    case Axis.PRECEDINGSIBLING:
  -		iterator = new TypedPrecedingSiblingIterator(type);
  -		break;
  -	    default:
  -		BasisLibrary.runTimeError("Error: typed iterator for axis " + 
  -					  Axis.names[axis]+"not implemented");
  -	    }
  -	}
  -	return(iterator);
  +             iterator = new FilterIterator(getAxisIterator(axis),
  +                                               getElementFilter());
  +         }
  +         else
  +         {
  +             switch (axis) {
  +             case Axis.SELF:
  +                  iterator = new TypedSingletonIterator(type);
  +                  break;
  +             case Axis.CHILD:
  +                  iterator = new TypedChildrenIterator(type);
  +                  break;
  +             case Axis.PARENT:
  +                  return(new ParentIterator().setNodeType(type));
  +             case Axis.ANCESTOR:
  +                  return(new TypedAncestorIterator(type));
  +             case Axis.ANCESTORORSELF:
  +                  return((new TypedAncestorIterator(type)).includeSelf());
  +             case Axis.ATTRIBUTE:
  +                  return(new TypedAttributeIterator(type));
  +             case Axis.DESCENDANT:
  +                  iterator = new TypedDescendantIterator(type);
  +                  break;
  +             case Axis.DESCENDANTORSELF:
  +                  iterator = (new TypedDescendantIterator(type)).includeSelf();
  +                  break;
  +             case Axis.FOLLOWING:
  +                  iterator = new TypedFollowingIterator(type);
  +                  break;
  +             case Axis.PRECEDING:
  +                  iterator = new TypedPrecedingIterator(type);
  +                  break;
  +             case Axis.FOLLOWINGSIBLING:
  +                  iterator = new TypedFollowingSiblingIterator(type);
  +                  break;
  +             case Axis.PRECEDINGSIBLING:
  +                  iterator = new TypedPrecedingSiblingIterator(type);
  +                  break;
  +             default:
  +                  BasisLibrary.runTimeError("Error: typed iterator for axis " + 
  +                                               Axis.names[axis]+"not implemented");
  +             }
  +         }
  +         return(iterator);
       }
   
       public NodeIterator getNamespaceAxisIterator(int axis, int ns) {
   
  -	NodeIterator iterator = null;
  +         NodeIterator iterator = null;
   
  -	if (ns == NO_TYPE) {
  -	    return(EMPTYITERATOR);
  -	}
  -	else {
  -	    switch (axis) {
  -	    case Axis.CHILD:
  -		iterator = new NamespaceChildrenIterator(ns);
  -		break;
  -	    case Axis.ATTRIBUTE:
  -		iterator = new NamespaceAttributeIterator(ns);
  -		break;
  -	    default:
  -		BasisLibrary.runTimeError("Error: typed iterator for axis " + 
  -					  Axis.names[axis]+"not implemented");
  -	    }
  -	}
  -	return(iterator);
  +         if (ns == NO_TYPE) {
  +             return(EMPTYITERATOR);
  +         }
  +         else {
  +             switch (axis) {
  +             case Axis.CHILD:
  +                  iterator = new NamespaceChildrenIterator(ns);
  +                  break;
  +             case Axis.ATTRIBUTE:
  +                  iterator = new NamespaceAttributeIterator(ns);
  +                  break;
  +             default:
  +                  BasisLibrary.runTimeError("Error: typed iterator for axis " + 
  +                                               Axis.names[axis]+"not implemented");
  +             }
  +         }
  +         return(iterator);
       }
   
       public NodeIterator getTypedDescendantIterator(int type) {
  -	NodeIterator iterator = new TypedDescendantIterator(type);
  -	iterator.setStartNode(1);
  -	return(iterator);
  +         NodeIterator iterator = new TypedDescendantIterator(type);
  +         iterator.setStartNode(1);
  +         return(iterator);
       }    
   
       public NodeIterator getNthDescendant(int node, int n) {
  -	return (new NthDescendantIterator(n));
  +         return (new NthDescendantIterator(n));
       }
   
       public void characters(final int textNode, TransletOutputHandler handler)
  -	throws TransletException {
  -	handler.characters(_text,
  -			   _offsetOrChild[textNode],
  -			   _lengthOrAttr[textNode]);
  +         throws TransletException {
  +         handler.characters(_text,
  +                              _offsetOrChild[textNode],
  +                              _lengthOrAttr[textNode]);
       }
   
       /**
        * Copy a node-set to an output handler
        */
       public void copy(NodeIterator nodes, TransletOutputHandler handler)
  -	throws TransletException {
  -	int node;
  -	while ((node = nodes.next()) != NULL) {
  -	    copy(node, handler);
  -	}
  +         throws TransletException {
  +         int node;
  +         while ((node = nodes.next()) != NULL) {
  +             copy(node, handler);
  +         }
       }
   
       /**
        * Copy the whole tree to an output handler
        */
       public void copy(TransletOutputHandler handler) throws TransletException {
  -	copy(ROOTNODE, handler);
  +         copy(ROOTNODE, handler);
       }
   
       /** 
        * Copy a single node to an output handler
        */
       public void copy(final int node, TransletOutputHandler handler)
  -	throws TransletException {
  +         throws TransletException {
   
  -	if (node >= _treeNodeLimit) {
  -	    return;
  -	}
  -
  -	switch(_type[node]) {
  -	case ROOT:
  -	    for (int child = _offsetOrChild[node];
  -		 child != NULL;
  -		 child = _nextSibling[child]) {
  -		copy(child, handler);
  -	    }
  -	    break;
  -
  -	case PROCESSING_INSTRUCTION:
  -	case COMMENT:
  -	    //!!! TODO
  -	    break;
  -
  -	case TEXT:
  -	    handler.characters(_text,
  -			       _offsetOrChild[node],
  -			       _lengthOrAttr[node]);
  -	    break;
  -
  -	default:
  -	    if (isElement(node)) {
  -		final String name = getNodeName(node);
  -		// Copy element name - start tag
  -		int col = name.lastIndexOf(':');
  -		if (col > 0) {
  -		    final String prefix = generateNamespacePrefix();
  -		    handler.startElement(prefix+':'+name.substring(col+1));
  -		    handler.attribute("xmlns:"+prefix, name.substring(0,col));
  -		}
  -		else {
  -		    handler.startElement(name);
  -		}
  -
  -		// Copy element attribute
  -		for (int attr = _lengthOrAttr[node];
  -		     attr != NULL;
  -		     attr = _nextSibling[attr]) {
  -		    final String aname = getNodeName(attr);
  -		    col = aname.lastIndexOf(':');
  -		    if (col < 0) {
  -			handler.attribute(aname,makeStringValue(attr));
  -		    }
  -		    else {
  -			final String prefix = generateNamespacePrefix();
  -			handler.attribute("xmlns:"+prefix,
  -					  aname.substring(0,col));
  -			handler.attribute(prefix+':'+aname.substring(col+1),
  -					  makeStringValue(attr));
  -		    }
  -		}
  -		// Copy element namespace declarations ???
  -		
  -
  -		// Copy element children
  -		for (int child = _offsetOrChild[node];
  -		     child != NULL;
  -		     child = _nextSibling[child]) {
  -		    copy(child, handler);
  -		}
  -		handler.endElement(name);
  -	    }
  -	    else {
  -		System.err.println("NYI: non element in copy");
  -	    }
  -	    break;
  -	}
  +         if (node >= _treeNodeLimit) {
  +             return;
  +         }
  +
  +         switch(_type[node]) {
  +         case ROOT:
  +             for (int child = _offsetOrChild[node];
  +                   child != NULL;
  +                   child = _nextSibling[child]) {
  +                  copy(child, handler);
  +             }
  +             break;
  +
  +         case PROCESSING_INSTRUCTION:
  +         case COMMENT:
  +             //!!! TODO
  +             break;
  +
  +         case TEXT:
  +             handler.characters(_text,
  +                                  _offsetOrChild[node],
  +                                  _lengthOrAttr[node]);
  +             break;
  +
  +         default:
  +             if (isElement(node)) {
  +                  final String name = getNodeName(node);
  +                  // Copy element name - start tag
  +                  int col = name.lastIndexOf(':');
  +                  if (col > 0) {
  +                      final String prefix = generateNamespacePrefix();
  +                      handler.startElement(prefix+':'+name.substring(col+1));
  +                      handler.attribute("xmlns:"+prefix, name.substring(0,col));
  +                  }
  +                  else {
  +                      handler.startElement(name);
  +                  }
  +
  +                  // Copy element attribute
  +                  for (int attr = _lengthOrAttr[node];
  +                       attr != NULL;
  +                       attr = _nextSibling[attr]) {
  +                      final String aname = getNodeName(attr);
  +                      col = aname.lastIndexOf(':');
  +                      if (col < 0) {
  +                           handler.attribute(aname,makeStringValue(attr));
  +                      }
  +                      else {
  +                           final String prefix = generateNamespacePrefix();
  +                           handler.attribute("xmlns:"+prefix,
  +                                               aname.substring(0,col));
  +                           handler.attribute(prefix+':'+aname.substring(col+1),
  +                                               makeStringValue(attr));
  +                      }
  +                  }
  +                  // Copy element namespace declarations ???
  +                  
  +
  +                  // Copy element children
  +                  for (int child = _offsetOrChild[node];
  +                       child != NULL;
  +                       child = _nextSibling[child]) {
  +                      copy(child, handler);
  +                  }
  +                  handler.endElement(name);
  +             }
  +             else {
  +                  System.err.println("NYI: non element in copy");
  +             }
  +             break;
  +         }
       }
   
       private void copyPI(final int node, TransletOutputHandler handler)
  -	throws TransletException {
  -	final char[] text = _text;
  -	final int start = _offsetOrChild[node];
  -	final int length = _lengthOrAttr[node];
  -	int i = start + 1;
  -	while (text[i] != ' ') {
  -	    ++i;
  -	}
  -	handler.processingInstruction(new String(text, start, i - start),
  -				      new String(text, i + 1, length - i));
  +         throws TransletException {
  +         final char[] text = _text;
  +         final int start = _offsetOrChild[node];
  +         final int length = _lengthOrAttr[node];
  +         int i = start + 1;
  +         while (text[i] != ' ') {
  +             ++i;
  +         }
  +         handler.processingInstruction(new String(text, start, i - start),
  +                                          new String(text, i + 1, length - i));
       }
   
       public String shallowCopy(final int node, TransletOutputHandler handler)
  -	throws TransletException {
  -	switch(_type[node]) {
  -	case ROOT:
  -	    // do nothing
  -	    return EMPTYSTRING;
  -	    
  -	case TEXT:
  -	    handler.characters(_text,
  -			       _offsetOrChild[node],
  -			       _lengthOrAttr[node]);
  -	    return null;
  -	    
  -	case PROCESSING_INSTRUCTION:
  -	    copyPI(node, handler);
  -	    return null;
  -	    
  -	case COMMENT:
  -	    // !!! implement; not in the tree currently
  -	    return null;
  -	    
  -	default:		// element or attribute
  -	    final String name = getNodeName(node);
  -	    if (node < _treeNodeLimit) { // element
  -		handler.startElement(name);
  -		return name;
  -	    }
  -	    else {		// attribute
  -		handler.attribute(name, makeStringValue(node));
  -		return null;
  -	    }
  -	}
  +         throws TransletException {
  +         switch(_type[node]) {
  +         case ROOT:
  +             // do nothing
  +             return EMPTYSTRING;
  +             
  +         case TEXT:
  +             handler.characters(_text,
  +                                  _offsetOrChild[node],
  +                                  _lengthOrAttr[node]);
  +             return null;
  +             
  +         case PROCESSING_INSTRUCTION:
  +             copyPI(node, handler);
  +             return null;
  +             
  +         case COMMENT:
  +             // !!! implement; not in the tree currently
  +             return null;
  +             
  +         default:                  // element or attribute
  +             final String name = getNodeName(node);
  +             if (node < _treeNodeLimit) { // element
  +                  handler.startElement(name);
  +                  return name;
  +             }
  +             else {                  // attribute
  +                  handler.attribute(name, makeStringValue(node));
  +                  return null;
  +             }
  +         }
       }
  -	
  +         
       public String getStringValue() {
  -	return getElementValue(ROOTNODE);
  +         return getElementValue(ROOTNODE);
       }
   
       public String getElementValue(final int element) {
  -	// optimization: only create StringBuffer if > 1 child
  -	final int child = _offsetOrChild[element];
  -	return child != NULL
  -	    ? (_type[child] == TEXT && _nextSibling[child] == NULL
  -	       ? makeStringValue(child)
  -	       : stringValueAux(new StringBuffer(), element).toString())
  -	    : EMPTYSTRING;
  +         // optimization: only create StringBuffer if > 1 child
  +         final int child = _offsetOrChild[element];
  +         return child != NULL
  +             ? (_type[child] == TEXT && _nextSibling[child] == NULL
  +                ? makeStringValue(child)
  +                : stringValueAux(new StringBuffer(), element).toString())
  +             : EMPTYSTRING;
       }
   
       private StringBuffer stringValueAux(StringBuffer buffer, final int element) {
  -	for (int child = _offsetOrChild[element];
  -	     child != NULL;
  -	     child = _nextSibling[child]) {
  -	    switch (_type[child]) {
  -	    case TEXT:
  -		/* WHITESPACE
  -		if (_filter != null) {
  -		    if ((_whitespace.getBit(child)) &&
  -			(_filter.stripSpace((DOM)this, child, 
  -					    _type[_parent[child]]))) {
  -			break;
  -		    }
  -		}
  -		*/
  -		buffer.append(_text,
  -			      _offsetOrChild[child],
  -			      _lengthOrAttr[child]);
  -		break;
  -		
  -	    case PROCESSING_INSTRUCTION:
  -	    case COMMENT:
  -		break;
  -				
  -		// !!! at the moment default can only be an element???
  -	    default:
  -		stringValueAux(buffer, child);
  -	    }
  -	}
  -	return buffer;
  +         for (int child = _offsetOrChild[element];
  +              child != NULL;
  +              child = _nextSibling[child]) {
  +             switch (_type[child]) {
  +             case TEXT:
  +                  /* WHITESPACE
  +                  if (_filter != null) {
  +                      if ((_whitespace.getBit(child)) &&
  +                           (_filter.stripSpace((DOM)this, child, 
  +                                                 _type[_parent[child]]))) {
  +                           break;
  +                      }
  +                  }
  +                  */
  +                  buffer.append(_text,
  +                                 _offsetOrChild[child],
  +                                 _lengthOrAttr[child]);
  +                  break;
  +                  
  +             case PROCESSING_INSTRUCTION:
  +             case COMMENT:
  +                  break;
  +                                    
  +                  // !!! at the moment default can only be an element???
  +             default:
  +                  stringValueAux(buffer, child);
  +             }
  +         }
  +         return buffer;
       }
   
       /**
        * Returns the defined language for a node (if any)
        */
       public String getLanguage(int node) {
  -	final Integer langType = (Integer)_types.get("xml:@lang");
  -	if (langType != null) {
  -	    final int type = langType.intValue();
  -	    while (node != DOM.NULL) {
  -		int attr = _lengthOrAttr[node];
  -		while (attr != DOM.NULL) {
  -		    if (_type[attr] == type) {
  -			return(getNodeValue(attr));
  -		    }
  -		    attr = _nextSibling[attr];
  -		}
  -		node = getParent(node);
  -	    }
  -	}
  -	return(null);
  +         final Integer langType = (Integer)_types.get("xml:@lang");
  +         if (langType != null) {
  +             final int type = langType.intValue();
  +             while (node != DOM.NULL) {
  +                  int attr = _lengthOrAttr[node];
  +                  while (attr != DOM.NULL) {
  +                      if (_type[attr] == type) {
  +                           return(getNodeValue(attr));
  +                      }
  +                      attr = _nextSibling[attr];
  +                  }
  +                  node = getParent(node);
  +             }
  +         }
  +         return(null);
       }
   
       public HandlerBase getBuilder() {
  -	return new DOMBuilder();
  +         return new DOMBuilder();
       }
   
       public TransletOutputHandler getOutputDomBuilder() {
  -	return new SAXAdapter(getBuilder());
  +         return new SAXAdapter(getBuilder());
       }
   
       /**
        * Returns true if a character is an XML whitespace character
        */
       private static final boolean isWhitespaceChar(char c) {
  -	return c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09;
  +         return c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09;
       }
   
   
  @@ -2240,656 +2284,656 @@
        */
       private final class DOMBuilder extends HandlerBase {
   
  -	private final static int REUSABLE_TEXT_SIZE = 32;
  -	private Hashtable _shortTexts           = null;
  +         private final static int REUSABLE_TEXT_SIZE = 32;
  +         private Hashtable _shortTexts           = null;
   
  -	private Hashtable _names                = null;
  -	private int       _nextNameCode         = NTYPES;
  -	private int[]     _parentStack          = new int[64];
  -	private int[]     _previousSiblingStack = new int[64];
  -	private int       _sp;
  -	private int       _baseOffset           = 0;
  -	private int       _currentOffset        = 0;
  -	private int       _currentNode          = 0;
  -
  -	// attribute node stuff
  -	private int       _currentAttributeNode = 0;
  -	private short[]  _type2        = new short[32];
  -	private int[]    _parent2      = new int[32];
  -	private int[]    _nextSibling2 = new int[32];
  -	private int[]    _offset       = new int[32];
  -	private int[]    _length       = new int[32];
  -
  -	// namespace node stuff
  -	private int       _nsCount      = 0;
  -	private int       _nsLimit      = 32;
  -	private String[]  _nsNames      = new String[_nsLimit];
  -	private Hashtable _nsPrefixes   = new Hashtable();
  -
  -	NSDeclStack _nsDeclarations = new NSDeclStack(64);
  -	
  -	// Stack used to keep track of what whitespace text nodes are protected
  -	// by xml:space="preserve" attributes and which nodes that are not.
  -	private int[]   _xmlSpaceStack = new int[64];
  -	private int     _idx = 1;
  -	private boolean _preserve = false;
  -
  -	private static final String XML_STRING = "xml";
  -	private static final String XMLNS_STRING = "xmlns";
  -	private static final String XMLSPACE_STRING = "xmlns";
  -	private static final String PRESERVE_STRING = "preserve";
  -
  -	/**************************************************************
  -	 * Class containing a stack that is used to keep track of the varying
  -	 * namespace URIs (types) behind a namespace prefix.
  -	 */
  -	private final class NSNodeStack {
  -
  -	    private final static int DEFAULT_SIZE = 8;
  -
  -	    private int[] _data;
  -	    private int _size;
  -	    private int _sp = 0;
  -
  -	    // Constructor
  -	    NSNodeStack(int size) {
  -		_size = size;
  -		_data = new int[size];
  -	    }
  -
  -	    // Default constructor
  -	    NSNodeStack() {
  -		this(DEFAULT_SIZE);
  -	    }
  -
  -	    // Push a namespace type the prefix will refer to for now
  -	    void push(int nsIndex) {
  -		if (_sp == _size) {
  -		    _size = _size << 1;
  -		    final int[] newData = new int[_size];
  -		    System.arraycopy(_data,0,newData,0,_sp);
  -		    _data = newData;
  -		}
  -		_data[_sp++] = nsIndex;
  -	    }
  -	    
  -	    // Pop the current namespace type for this prefix
  -	    int pop() {
  -		if (_sp != 0)
  -		    return(_data[--_sp]);
  -		else
  -		    return(-1);
  -	    }
  -
  -	    // Get the current namespace type for this prefix
  -	    int get() {
  -		if (_sp != 0)
  -		    return(_data[_sp-1]);
  -		else
  -		    return(-1);
  -	    }
  -	}
  -
  -
  -	/**************************************************************
  -	 * Class containg a stack that is used for keeping track of what nodes
  -	 * contained the latest namespace declarations.
  -	 */
  -	private final class NSDeclStack {
  -
  -	    private final static int DEFAULT_SIZE = 64;
  -
  -	    private int _sp = 0;
  -	    private int _size = 0;
  -	    private NSNodeStack[] _stacks = null;
  -	    private int[] _nodes = null;
  -
  -	    // Constructor
  -	    NSDeclStack(int size) {
  -		_size = size;
  -		_stacks = new NSNodeStack[size];
  -		_nodes = new int[size];
  -	    }
  -
  -	    NSDeclStack() {
  -		this(DEFAULT_SIZE);
  -	    }
  -
  -	    // Push a NS node stack with the node where the decl. was found.
  -	    void push(int node, NSNodeStack stack) {
  -		// time to resize arrays?
  -		if (_sp == _size) {
  -		    _size = _size << 1;
  -		    final NSNodeStack[] newStacks = new NSNodeStack[_size];
  -		    final int[] newNodes = new int[_size];
  -		    System.arraycopy(_stacks,0,newStacks,0,_sp);
  -		    System.arraycopy(_nodes,0,newNodes,0,_sp);
  -		    _stacks = newStacks;
  -		    _nodes = newNodes;
  -		}
  -
  -		// now push the new namespace node
  -		_nodes[_sp] = node;
  -		_stacks[_sp] = stack;
  -		_sp++;
  -	    }
  -	    
  -	    // Pop all namespace declarations for a given node (if any).
  -	    void pop(int node) {
  -		while ((_sp != 0) && (_nodes[_sp-1] == node)) {
  -		    _sp--;
  -		    _stacks[_sp].pop();
  -		    _stacks[_sp] = null;
  -		}
  -	    }
  -	}
  -
  -	/**
  -	 * Add a new namespace URI to the _namespaceNames table
  -	 */
  -	private int addNamespaceURI(String uri) {
  -	    // Check if we already have this URI
  -	    Integer index = (Integer)_nsIndex.get(uri);
  -	    // Add new namespace type if we do not have this one.
  -	    if (index == null) {
  -		// Resize namespace array if necessary
  -		if (_nsCount == _nsLimit) {
  -		    _nsLimit = _nsLimit << 1;
  -		    final String[] newData = new String[_nsLimit];
  -		    System.arraycopy(_nsNames,0,newData,0,_nsCount);
  -		    _nsNames = newData;
  -		}
  -		index = new Integer(_nsCount);
  -		_nsIndex.put(uri,index);
  -		_nsNames[_nsCount++] = uri;
  -	    }
  -	    return(index.intValue());
  -	}
  -
  -	/**
  -	 * Add a new prefix for a namespace type
  -	 */
  -	private void addNamespacePrefix(int node, String prefix, int type) {
  -	    NSNodeStack stack = (NSNodeStack)_nsPrefixes.get(prefix);
  -	    if (stack == null) { // add new namespace prefix in table
  -		stack = new NSNodeStack(8); // what size ? dynamic ?
  -		_nsPrefixes.put(prefix,stack);
  -	    }
  -	    stack.push(type);
  -	    _nsDeclarations.push(node,stack);
  -	}
  -
  -	/**
  -	 * Add a new namespace - prefix and uri
  -	 */
  -	private int addNamespace(int node, String prefix, String uri) {
  -	    final int type = addNamespaceURI(uri);
  -	    addNamespacePrefix(node,prefix,type);
  -	    return(type);
  -	}
  -
  -	/**
  -	 * Get the namespace type from a namespace prefix
  -	 */
  -	private int getNamespaceType(String prefix) {
  -	    // Get the stack for this prefix.
  -	    final NSNodeStack stack = (NSNodeStack)_nsPrefixes.get(prefix);
  -	    if (stack != null)
  -		return(stack.get()); // return namespace type id
  -	    else
  -		return(0xffffffff);  //undeclared prefix - should not occur
  -	}
  -
  -	/**
  -	 * Get the namespace URI from a namespace type
  -	 */
  -	private String getNamespaceURI(int nsType) {
  -	    if (nsType < _nsCount)
  -		return(_nsNames[nsType]);
  -	    else
  -		return(null);
  -	}
  -
  -	/**
  -	 * Get the namespace URI from a namespace prefix
  -	 */
  -	private String getNamespaceURI(String prefix) {
  -	    return(getNamespaceURI(getNamespaceType(prefix)));
  -	}
  -
  -	/**
  -	 * Create internal name for an element node
  -	 */
  -	private short internElement(String name) throws SAXException {
  -	    int i;
  -	    
  -	    // Expand prefix:localname to full QName
  -	    if ((i = name.lastIndexOf(':')) != -1) {
  -		name = getNamespaceURI(name.substring(0,i))+name.substring(i);
  -	    }
  -	    // Append default namespace with the name has no prefix
  -	    else {
  -		final String uri = getNamespaceURI(EMPTYSTRING);
  -		if (!uri.equals(EMPTYSTRING)) name = uri + ':' + name;
  -	    }
  -
  -	    // Stuff the QName into the names vector & hashtable
  -	    Integer obj = (Integer)_names.get(name);
  -	    if (obj == null) {
  -		_names.put(name, obj = new Integer(_nextNameCode++));
  -	    }
  -	    return (short)obj.intValue();
  -	}
  -
  -	/**
  -	 * Create internal name for an attribute node
  -	 */
  -	private short internAttribute(String name, boolean xmlAttr)
  -	    throws SAXException {
  -
  -	    // Leave XML attributes as the are
  -	    if (!xmlAttr) {
  -		int col;
  -		// Expand prefix:localname to full QName
  -		if ((col = name.lastIndexOf(':')) != -1) {
  -		    name = getNamespaceURI(name.substring(0,col))+
  -			':'+'@'+name.substring(col+1);
  -		}
  -		// Append default namespace with the name has no prefix
  -		else {
  -		    // Attributes with no prefix belong in the "" namespace,
  -		    // and not in the namespace that the "" prefix points to,
  -		    // so the attribute name remains the way it is.
  -		    name = '@'+name;
  -		}
  -	    }
  -	    else {
  -		name = name.substring(0,4)+'@'+name.substring(4);
  -	    }
  -
  -	    // Stuff the QName into the names vector & hashtable
  -	    Integer obj = (Integer)_names.get(name);
  -	    if (obj == null) {
  -		_names.put(name, obj = new Integer(_nextNameCode++));
  -	    }
  -
  -	    return (short)obj.intValue();
  -	}
  -
  -	/**
  -	 * Default constructor for the DOMBuiler class
  -	 */
  -	public DOMBuilder() {
  -	    _xmlSpaceStack[0] = DOM.ROOTNODE;
  -	}
  -	
  -	/**
  -	 * Call this when an xml:space attribute is encountered
  -	 */
  -	public void xmlSpaceDefine(String val, final int node) {
  -	    final boolean setting = val.equals(PRESERVE_STRING);
  -	    if (setting != _preserve) {
  -		_xmlSpaceStack[_idx++] = node;
  -		_preserve = setting;
  -	    }
  -	}
  -
  -	/**
  -	 * Call this from endElement() to revert strip/preserve setting
  -	 */
  -	public void xmlSpaceRevert(final int node) {
  -	    if (node == _xmlSpaceStack[_idx - 1]) {
  -		_idx--;
  -		_preserve = !_preserve;
  -	    }
  -	}
  -	
  -	/**
  -	 *
  -	 */
  -	private int nextNode() {
  -	    final int index = _currentNode++;
  -	    if (index == _type.length) {
  -		resizeArrays(_type.length * 2, index);
  -	    }
  -	    return index;
  -	}
  -
  -	/**
  -	 *
  -	 */
  -	private int nextAttributeNode() {
  -	    final int index = _currentAttributeNode++;
  -	    if (index == _type2.length) {
  -		resizeArrays2(_type2.length * 2, index);
  -	    }
  -	    return index;
  -	}
  -
  -	/**
  -	 *
  -	 */
  -	private void resizeTextArray(final int newSize) {
  -	    final char[] newText = new char[newSize];
  -	    System.arraycopy(_text, 0, newText, 0, _currentOffset);
  -	    _text = newText;
  -	}
  -	
  -	/**
  -	 *
  -	 */
  -	private void linkChildren(final int node) {
  -	    _parent[node] = _parentStack[_sp];
  -	    if (_previousSiblingStack[_sp] != 0) { // current not first child
  -		_nextSibling[_previousSiblingStack[_sp]] = node;
  -	    }
  -	    else {
  -		_offsetOrChild[_parentStack[_sp]] = node;
  -	    }
  -	    _previousSiblingStack[_sp] = node;
  -	}
  -
  -	/**
  -	 * Creates a text-node and checks if it is a whitespace node.
  -	 */
  -	private void maybeCreateTextNode() {
  -	    if (_currentOffset > _baseOffset) {
  -		final int node = nextNode();
  -		final int limit = _currentOffset;
  -		// Check if whitespace unless protected by xml:space="preserve"
  -		if (!_preserve) {
  -		    // Check if this text node is purely whitespace
  -		    int i = _baseOffset;
  -		    while (isWhitespaceChar(_text[i++]) && i < limit) ;
  -		    if ((i == limit) && isWhitespaceChar(_text[i-1]))
  -			_whitespace.setBit(node);
  -		}
  -		_type[node] = TEXT;
  -		linkChildren(node);
  -		storeTextRef(node);
  -	    }
  -	}
  -
  -	/*
  -	 * returns offset new or existing
  -	 * updates _baseOffset, _currentOffset state
  -	 */
  -	private int maybeReuseText(final int length) {
  -	    final int base = _baseOffset;
  -	    if (length <= REUSABLE_TEXT_SIZE) {
  -		// Use a char array instead of string for performance benefit
  -		char[] chars = new char[length];
  -		System.arraycopy(_text, base, chars, 0, length);
  -		final Integer offsetObj = (Integer)_shortTexts.get(chars);
  -
  -		if (offsetObj != null) {
  -		    _currentOffset = base;       // step back current
  -		    return offsetObj.intValue(); // reuse previous string
  -		}
  -		else {
  -		    _shortTexts.put(chars, new Integer(base));
  -		}
  -	    }
  -	    _baseOffset = _currentOffset; // advance base to current
  -	    return base;
  -	}
  -
  -	/**
  -	 *
  -	 */
  -	private void storeTextRef(final int node) {
  -	    final int length = _currentOffset - _baseOffset;
  -	    _offsetOrChild[node] = maybeReuseText(length);
  -	    _lengthOrAttr[node]  = length;
  -	}
  -	
  -	/**
  -	 *
  -	 */
  -	private void storeAttrValRef(final int attributeNode) {
  -	    final int length = _currentOffset - _baseOffset;
  -	    _offset[attributeNode] = maybeReuseText(length);
  -	    _length[attributeNode] = length;
  -	}
  -	
  -	/**
  -	 * Part of SAX handler interface - initializes the DOM builder
  -	 */
  -	public void startDocument() {
  -	    _shortTexts     = new Hashtable();
  -	    _names          = new Hashtable();
  -	    _sp             = 0;
  -	    _parentStack[0] = ROOTNODE;	// root
  -	    _currentNode    = ROOTNODE + 1;
  -	    _currentAttributeNode = 0;
  -	    addNamespace(0,EMPTYSTRING,EMPTYSTRING); // default namespace
  -	}
  -
  -	/**
  -	 * Part of SAX handler interfaces - finalizes the DOM
  -	 */
  -	public void endDocument() {
  -
  -	    maybeCreateTextNode();
  -	    _shortTexts = null;
  -	    final int namesSize = _nextNameCode - NTYPES;
  -
  -	    // Fill the names array
  -	    _namesArray = new String[namesSize];
  -	    Enumeration keys = _names.keys();
  -	    while (keys.hasMoreElements()) {
  -		final String name = (String)keys.nextElement();
  -		final Integer idx = (Integer)_names.get(name);
  -		_namesArray[idx.intValue() - NTYPES] = name;
  -	    }
  -
  -	    _names = null;
  -	    _types = setupMapping(_namesArray);
  -
  -	    // trim arrays' sizes
  -	    resizeTextArray(_currentOffset);
  -	    
  -	    _firstAttributeNode = _currentNode;
  -	    shiftAttributes(_currentNode);
  -	    resizeArrays(_currentNode + _currentAttributeNode, _currentNode);
  -	    appendAttributes();
  -	    _treeNodeLimit = _currentNode;
  -
  -	    // Fill the _namespace[] array
  -	    _namespace = new short[namesSize];
  -	    for (int i=0; i<namesSize; i++) {
  -		int col = _namesArray[i].lastIndexOf(':');
  -		if (col == -1) { // default namespace
  -		    _namespace[i] = 0;
  -		}
  -		else {           // other namespaces
  -		    _namespace[i] =
  -			(short)addNamespaceURI(_namesArray[i].substring(0,col));
  -		}
  -	    }
  -
  -	    // Fill the _nsNamesArray[] array
  -	    _nsNamesArray = new String[_nsCount];
  -	    System.arraycopy(_nsNames,0,_nsNamesArray,0,_nsCount);
  -	    _nsNames = null;
  -	}
  -	
  -	/**
  -	 * Part of SAX handler interface
  -	 */
  -	public void startElement(String elementName, AttributeList attList)
  -	    throws SAXException {
  -
  -	    maybeCreateTextNode();
  -	    final int node = nextNode();
  -	    linkChildren(node);
  -	    _parentStack[++_sp] = node;
  -
  -	    // process attribute list - including namespace declarations
  -	    final int length = attList.getLength();
  -	    if (length > 0) {
  -		int i = 1, attrNode = makeAttributeNode(node, attList, 0);
  -		while (attrNode == -1 && i < length) {
  -		    attrNode = makeAttributeNode(node, attList, i++);
  -		}
  -		if (attrNode != -1) {
  -		    _lengthOrAttr[node] = attrNode;	// first attr
  -		    while (i < length) {
  -			final int attrNode2 =
  -			    makeAttributeNode(node, attList, i++);
  -			if (attrNode2 != -1) {
  -			    _nextSibling2[attrNode] = attrNode2;
  -			    attrNode = attrNode2;
  -			}
  -		    }
  -		}
  -	    }
  -	    _type[node] = internElement(elementName);
  -	}
  -
  -	/**
  -	 * Part of SAX handler interface
  -	 */
  -	private int makeAttributeNode(int parent, AttributeList attList, int i)
  -	    throws SAXException {
  -	    final String name = attList.getName(i);
  -	    boolean xmlAttr = false;
  -
  -	    // process namespace declaration
  -	    if (name.startsWith(XML_STRING)) {
  -		if (name.startsWith(XMLNS_STRING)) {
  -		    // declaring the default namespace ?
  -		    if (name.length() == 5)
  -			addNamespace(parent, EMPTYSTRING, attList.getValue(i));
  -		    // declaring some other namespace
  -		    else
  -			addNamespace(parent, name.substring(6),
  -				     attList.getValue(i));
  -		    return -1;
  -		}
  -		else if (name.startsWith(XMLSPACE_STRING)) {
  -		    xmlSpaceDefine(attList.getValue(i), parent);
  -		}
  -		xmlAttr = true;
  -	    }
  -
  -	    // fall through to handle a regular attribute
  -    	    final int node = nextAttributeNode();
  -	    _type2[node] = internAttribute(name,xmlAttr);
  -	    _parent2[node] = parent;
  -	    characters(attList.getValue(i));
  -	    storeAttrValRef(node);
  -	    return node;
  -	}
  -	
  -	/**
  -	 * Part of SAX handler interface
  -	 */
  -	public void endElement(String elementName) {
  -	    maybeCreateTextNode();
  -	    // Revert to strip/preserve-space setting from before this element
  -	    xmlSpaceRevert(_parentStack[_sp]);
  -	    // Pop all namespace declarations found in this element
  -	    _nsDeclarations.pop(_parentStack[_sp]);
  -	    _previousSiblingStack[_sp--] = 0;
  -	}
  -
  -	/**
  -	 * Part of SAX handler interface
  -	 */
  -	public void processingInstruction(String target, String data) {
  -	    maybeCreateTextNode();
  -	    final int node = nextNode();
  -	    _type[node] = PROCESSING_INSTRUCTION;
  -	    linkChildren(node);
  -	    characters(target + ' ' + data);
  -	    storeTextRef(node);
  -	}
  -		
  -	/**
  -	 * Part of SAX handler interface - NO, THIS IS NOT SAX, THIS IS SHITE!!
  -	 */
  -	public void characters(final String string) {
  -	    final int length = string.length();
  -	    if (_currentOffset + length > _text.length) {
  -		resizeTextArray(_text.length * 2);
  -	    }
  -	    string.getChars(0, length, _text, _currentOffset);
  -	    _currentOffset += length;
  -	}
  -
  -	/**
  -	 * can accumulate text from consecutive calls
  -	 */
  -	public void characters(char[] ch, int start, int length) {
  -	    if (_currentOffset + length > _text.length) {
  -		resizeTextArray(_text.length * 2);
  -	    }
  -	    System.arraycopy(ch, start, _text, _currentOffset, length);
  -	    _currentOffset += length;
  -	    maybeCreateTextNode();
  -	}
  -	
  -	private void resizeArrays(final int newSize, final int length) {
  -	    final short[] newType = new short[newSize];
  -	    System.arraycopy(_type, 0, newType, 0, length);
  -	    _type = newType;
  -	    final int[] newParent = new int[newSize];
  -	    System.arraycopy(_parent, 0, newParent, 0, length);
  -	    _parent = newParent;
  -	    final int[] newNextSibling = new int[newSize];
  -	    System.arraycopy(_nextSibling, 0, newNextSibling, 0, length);
  -	    _nextSibling = newNextSibling;
  -	    final int[] newOffsetOrChild = new int[newSize];
  -	    System.arraycopy(_offsetOrChild, 0, newOffsetOrChild, 0, length);
  -	    _offsetOrChild = newOffsetOrChild;
  -	    final int[] newLengthOrAttr = new int[newSize];
  -	    System.arraycopy(_lengthOrAttr, 0, newLengthOrAttr, 0, length);
  -	    _lengthOrAttr = newLengthOrAttr;
  -	    _whitespace.resize(newSize);
  -	}
  -	
  -	private void resizeArrays2(final int newSize, final int length) {
  -	    final short[] newType = new short[newSize];
  -	    System.arraycopy(_type2, 0, newType, 0, length);
  -	    _type2 = newType;
  -	    final int[] newParent = new int[newSize];
  -	    System.arraycopy(_parent2, 0, newParent, 0, length);
  -	    _parent2 = newParent;
  -	    final int[] newNextSibling = new int[newSize];
  -	    System.arraycopy(_nextSibling2, 0, newNextSibling, 0, length);
  -	    _nextSibling2 = newNextSibling;
  -	    final int[] newOffset = new int[newSize];
  -	    System.arraycopy(_offset, 0, newOffset, 0, length);
  -	    _offset = newOffset;
  -	    final int[] newLength = new int[newSize];
  -	    System.arraycopy(_length, 0, newLength, 0, length);
  -	    _length = newLength;
  -	}
  -	
  -	private void shiftAttributes(final int shift) {
  -	    final int limit = _currentAttributeNode;
  -	    int lastParent = -1;
  -	    for (int i = 0; i < limit; i++) {
  -		if (_parent2[i] != lastParent) {
  -		    lastParent = _parent2[i];
  -		    _lengthOrAttr[lastParent] = i + shift;
  -		}
  -		final int next = _nextSibling2[i];
  -		_nextSibling2[i] = next != 0 ? next + shift : 0;
  -	    }
  -	}
  -	
  -	private void appendAttributes() {
  -	    final int len = _currentAttributeNode;
  -	    if (len > 0) {
  -		final int dst = _currentNode;
  -		System.arraycopy(_type2,         0, _type,          dst, len);
  -		System.arraycopy(_parent2,       0, _parent,        dst, len);
  -		System.arraycopy(_nextSibling2,  0, _nextSibling,   dst, len);
  -		System.arraycopy(_offset,        0, _offsetOrChild, dst, len);
  -		System.arraycopy(_length,        0, _lengthOrAttr,  dst, len);
  -	    }
  -	}
  +         private Hashtable _names                = null;
  +         private int       _nextNameCode         = NTYPES;
  +         private int[]     _parentStack          = new int[64];
  +         private int[]     _previousSiblingStack = new int[64];
  +         private int       _sp;
  +         private int       _baseOffset           = 0;
  +         private int       _currentOffset        = 0;
  +         private int       _currentNode          = 0;
  +
  +         // attribute node stuff
  +         private int       _currentAttributeNode = 0;
  +         private short[]  _type2        = new short[32];
  +         private int[]    _parent2      = new int[32];
  +         private int[]    _nextSibling2 = new int[32];
  +         private int[]    _offset       = new int[32];
  +         private int[]    _length       = new int[32];
  +
  +         // namespace node stuff
  +         private int       _nsCount      = 0;
  +         private int       _nsLimit      = 32;
  +         private String[]  _nsNames      = new String[_nsLimit];
  +         private Hashtable _nsPrefixes   = new Hashtable();
  +
  +         NSDeclStack _nsDeclarations = new NSDeclStack(64);
  +         
  +         // Stack used to keep track of what whitespace text nodes are protected
  +         // by xml:space="preserve" attributes and which nodes that are not.
  +         private int[]   _xmlSpaceStack = new int[64];
  +         private int     _idx = 1;
  +         private boolean _preserve = false;
  +
  +         private static final String XML_STRING = "xml";
  +         private static final String XMLNS_STRING = "xmlns";
  +         private static final String XMLSPACE_STRING = "xmlns";
  +         private static final String PRESERVE_STRING = "preserve";
  +
  +         /**************************************************************
  +          * Class containing a stack that is used to keep track of the varying
  +          * namespace URIs (types) behind a namespace prefix.
  +          */
  +         private final class NSNodeStack {
  +
  +             private final static int DEFAULT_SIZE = 8;
  +
  +             private int[] _data;
  +             private int _size;
  +             private int _sp = 0;
  +
  +             // Constructor
  +             NSNodeStack(int size) {
  +                  _size = size;
  +                  _data = new int[size];
  +             }
  +
  +             // Default constructor
  +             NSNodeStack() {
  +                  this(DEFAULT_SIZE);
  +             }
  +
  +             // Push a namespace type the prefix will refer to for now
  +             void push(int nsIndex) {
  +                  if (_sp == _size) {
  +                      _size = _size << 1;
  +                      final int[] newData = new int[_size];
  +                      System.arraycopy(_data,0,newData,0,_sp);
  +                      _data = newData;
  +                  }
  +                  _data[_sp++] = nsIndex;
  +             }
  +             
  +             // Pop the current namespace type for this prefix
  +             int pop() {
  +                  if (_sp != 0)
  +                      return(_data[--_sp]);
  +                  else
  +                      return(-1);
  +             }
  +
  +             // Get the current namespace type for this prefix
  +             int get() {
  +                  if (_sp != 0)
  +                      return(_data[_sp-1]);
  +                  else
  +                      return(-1);
  +             }
  +         }
  +
  +
  +         /**************************************************************
  +          * Class containg a stack that is used for keeping track of what nodes
  +          * contained the latest namespace declarations.
  +          */
  +         private final class NSDeclStack {
  +
  +             private final static int DEFAULT_SIZE = 64;
  +
  +             private int _sp = 0;
  +             private int _size = 0;
  +             private NSNodeStack[] _stacks = null;
  +             private int[] _nodes = null;
  +
  +             // Constructor
  +             NSDeclStack(int size) {
  +                  _size = size;
  +                  _stacks = new NSNodeStack[size];
  +                  _nodes = new int[size];
  +             }
  +
  +             NSDeclStack() {
  +                  this(DEFAULT_SIZE);
  +             }
  +
  +             // Push a NS node stack with the node where the decl. was found.
  +             void push(int node, NSNodeStack stack) {
  +                  // time to resize arrays?
  +                  if (_sp == _size) {
  +                      _size = _size << 1;
  +                      final NSNodeStack[] newStacks = new NSNodeStack[_size];
  +                      final int[] newNodes = new int[_size];
  +                      System.arraycopy(_stacks,0,newStacks,0,_sp);
  +                      System.arraycopy(_nodes,0,newNodes,0,_sp);
  +                      _stacks = newStacks;
  +                      _nodes = newNodes;
  +                  }
  +
  +                  // now push the new namespace node
  +                  _nodes[_sp] = node;
  +                  _stacks[_sp] = stack;
  +                  _sp++;
  +             }
  +             
  +             // Pop all namespace declarations for a given node (if any).
  +             void pop(int node) {
  +                  while ((_sp != 0) && (_nodes[_sp-1] == node)) {
  +                      _sp--;
  +                      _stacks[_sp].pop();
  +                      _stacks[_sp] = null;
  +                  }
  +             }
  +         }
  +
  +         /**
  +          * Add a new namespace URI to the _namespaceNames table
  +          */
  +         private int addNamespaceURI(String uri) {
  +             // Check if we already have this URI
  +             Integer index = (Integer)_nsIndex.get(uri);
  +             // Add new namespace type if we do not have this one.
  +             if (index == null) {
  +                  // Resize namespace array if necessary
  +                  if (_nsCount == _nsLimit) {
  +                      _nsLimit = _nsLimit << 1;
  +                      final String[] newData = new String[_nsLimit];
  +                      System.arraycopy(_nsNames,0,newData,0,_nsCount);
  +                      _nsNames = newData;
  +                  }
  +                  index = new Integer(_nsCount);
  +                  _nsIndex.put(uri,index);
  +                  _nsNames[_nsCount++] = uri;
  +             }
  +             return(index.intValue());
  +         }
  +
  +         /**
  +          * Add a new prefix for a namespace type
  +          */
  +         private void addNamespacePrefix(int node, String prefix, int type) {
  +             NSNodeStack stack = (NSNodeStack)_nsPrefixes.get(prefix);
  +             if (stack == null) { // add new namespace prefix in table
  +                  stack = new NSNodeStack(8); // what size ? dynamic ?
  +                  _nsPrefixes.put(prefix,stack);
  +             }
  +             stack.push(type);
  +             _nsDeclarations.push(node,stack);
  +         }
  +
  +         /**
  +          * Add a new namespace - prefix and uri
  +          */
  +         private int addNamespace(int node, String prefix, String uri) {
  +             final int type = addNamespaceURI(uri);
  +             addNamespacePrefix(node,prefix,type);
  +             return(type);
  +         }
  +
  +         /**
  +          * Get the namespace type from a namespace prefix
  +          */
  +         private int getNamespaceType(String prefix) {
  +             // Get the stack for this prefix.
  +             final NSNodeStack stack = (NSNodeStack)_nsPrefixes.get(prefix);
  +             if (stack != null)
  +                  return(stack.get()); // return namespace type id
  +             else
  +                  return(0xffffffff);  //undeclared prefix - should not occur
  +         }
  +
  +         /**
  +          * Get the namespace URI from a namespace type
  +          */
  +         private String getNamespaceURI(int nsType) {
  +             if (nsType < _nsCount)
  +                  return(_nsNames[nsType]);
  +             else
  +                  return(null);
  +         }
  +
  +         /**
  +          * Get the namespace URI from a namespace prefix
  +          */
  +         private String getNamespaceURI(String prefix) {
  +             return(getNamespaceURI(getNamespaceType(prefix)));
  +         }
  +
  +         /**
  +          * Create internal name for an element node
  +          */
  +         private short internElement(String name) throws SAXException {
  +             int i;
  +             
  +             // Expand prefix:localname to full QName
  +             if ((i = name.lastIndexOf(':')) != -1) {
  +                  name = getNamespaceURI(name.substring(0,i))+name.substring(i);
  +             }
  +             // Append default namespace with the name has no prefix
  +             else {
  +                  final String uri = getNamespaceURI(EMPTYSTRING);
  +                  if (!uri.equals(EMPTYSTRING)) name = uri + ':' + name;
  +             }
  +
  +             // Stuff the QName into the names vector & hashtable
  +             Integer obj = (Integer)_names.get(name);
  +             if (obj == null) {
  +                  _names.put(name, obj = new Integer(_nextNameCode++));
  +             }
  +             return (short)obj.intValue();
  +         }
  +
  +         /**
  +          * Create internal name for an attribute node
  +          */
  +         private short internAttribute(String name, boolean xmlAttr)
  +             throws SAXException {
  +
  +             // Leave XML attributes as the are
  +             if (!xmlAttr) {
  +                  int col;
  +                  // Expand prefix:localname to full QName
  +                  if ((col = name.lastIndexOf(':')) != -1) {
  +                      name = getNamespaceURI(name.substring(0,col))+
  +                           ':'+'@'+name.substring(col+1);
  +                  }
  +                  // Append default namespace with the name has no prefix
  +                  else {
  +                      // Attributes with no prefix belong in the "" namespace,
  +                      // and not in the namespace that the "" prefix points to,
  +                      // so the attribute name remains the way it is.
  +                      name = '@'+name;
  +                  }
  +             }
  +             else {
  +                  name = name.substring(0,4)+'@'+name.substring(4);
  +             }
  +
  +             // Stuff the QName into the names vector & hashtable
  +             Integer obj = (Integer)_names.get(name);
  +             if (obj == null) {
  +                  _names.put(name, obj = new Integer(_nextNameCode++));
  +             }
  +
  +             return (short)obj.intValue();
  +         }
  +
  +         /**
  +          * Default constructor for the DOMBuiler class
  +          */
  +         public DOMBuilder() {
  +             _xmlSpaceStack[0] = DOM.ROOTNODE;
  +         }
  +         
  +         /**
  +          * Call this when an xml:space attribute is encountered
  +          */
  +         public void xmlSpaceDefine(String val, final int node) {
  +             final boolean setting = val.equals(PRESERVE_STRING);
  +             if (setting != _preserve) {
  +                  _xmlSpaceStack[_idx++] = node;
  +                  _preserve = setting;
  +             }
  +         }
  +
  +         /**
  +          * Call this from endElement() to revert strip/preserve setting
  +          */
  +         public void xmlSpaceRevert(final int node) {
  +             if (node == _xmlSpaceStack[_idx - 1]) {
  +                  _idx--;
  +                  _preserve = !_preserve;
  +             }
  +         }
  +         
  +         /**
  +          *
  +          */
  +         private int nextNode() {
  +             final int index = _currentNode++;
  +             if (index == _type.length) {
  +                  resizeArrays(_type.length * 2, index);
  +             }
  +             return index;
  +         }
  +
  +         /**
  +          *
  +          */
  +         private int nextAttributeNode() {
  +             final int index = _currentAttributeNode++;
  +             if (index == _type2.length) {
  +                  resizeArrays2(_type2.length * 2, index);
  +             }
  +             return index;
  +         }
  +
  +         /**
  +          *
  +          */
  +         private void resizeTextArray(final int newSize) {
  +             final char[] newText = new char[newSize];
  +             System.arraycopy(_text, 0, newText, 0, _currentOffset);
  +             _text = newText;
  +         }
  +         
  +         /**
  +          *
  +          */
  +         private void linkChildren(final int node) {
  +             _parent[node] = _parentStack[_sp];
  +             if (_previousSiblingStack[_sp] != 0) { // current not first child
  +                  _nextSibling[_previousSiblingStack[_sp]] = node;
  +             }
  +             else {
  +                  _offsetOrChild[_parentStack[_sp]] = node;
  +             }
  +             _previousSiblingStack[_sp] = node;
  +         }
  +
  +         /**
  +          * Creates a text-node and checks if it is a whitespace node.
  +          */
  +         private void maybeCreateTextNode() {
  +             if (_currentOffset > _baseOffset) {
  +                  final int node = nextNode();
  +                  final int limit = _currentOffset;
  +                  // Check if whitespace unless protected by xml:space="preserve"
  +                  if (!_preserve) {
  +                      // Check if this text node is purely whitespace
  +                      int i = _baseOffset;
  +                      while (isWhitespaceChar(_text[i++]) && i < limit) ;
  +                      if ((i == limit) && isWhitespaceChar(_text[i-1]))
  +                           _whitespace.setBit(node);
  +                  }
  +                  _type[node] = TEXT;
  +                  linkChildren(node);
  +                  storeTextRef(node);
  +             }
  +         }
  +
  +         /*
  +          * returns offset new or existing
  +          * updates _baseOffset, _currentOffset state
  +          */
  +         private int maybeReuseText(final int length) {
  +             final int base = _baseOffset;
  +             if (length <= REUSABLE_TEXT_SIZE) {
  +                  // Use a char array instead of string for performance benefit
  +                  char[] chars = new char[length];
  +                  System.arraycopy(_text, base, chars, 0, length);
  +                  final Integer offsetObj = (Integer)_shortTexts.get(chars);
  +
  +                  if (offsetObj != null) {
  +                      _currentOffset = base;       // step back current
  +                      return offsetObj.intValue(); // reuse previous string
  +                  }
  +                  else {
  +                      _shortTexts.put(chars, new Integer(base));
  +                  }
  +             }
  +             _baseOffset = _currentOffset; // advance base to current
  +             return base;
  +         }
  +
  +         /**
  +          *
  +          */
  +         private void storeTextRef(final int node) {
  +             final int length = _currentOffset - _baseOffset;
  +             _offsetOrChild[node] = maybeReuseText(length);
  +             _lengthOrAttr[node]  = length;
  +         }
  +         
  +         /**
  +          *
  +          */
  +         private void storeAttrValRef(final int attributeNode) {
  +             final int length = _currentOffset - _baseOffset;
  +             _offset[attributeNode] = maybeReuseText(length);
  +             _length[attributeNode] = length;
  +         }
  +         
  +         /**
  +          * Part of SAX handler interface - initializes the DOM builder
  +          */
  +         public void startDocument() {
  +             _shortTexts     = new Hashtable();
  +             _names          = new Hashtable();
  +             _sp             = 0;
  +             _parentStack[0] = ROOTNODE;         // root
  +             _currentNode    = ROOTNODE + 1;
  +             _currentAttributeNode = 0;
  +             addNamespace(0,EMPTYSTRING,EMPTYSTRING); // default namespace
  +         }
  +
  +         /**
  +          * Part of SAX handler interfaces - finalizes the DOM
  +          */
  +         public void endDocument() {
  +
  +             maybeCreateTextNode();
  +             _shortTexts = null;
  +             final int namesSize = _nextNameCode - NTYPES;
  +
  +             // Fill the names array
  +             _namesArray = new String[namesSize];
  +             Enumeration keys = _names.keys();
  +             while (keys.hasMoreElements()) {
  +                  final String name = (String)keys.nextElement();
  +                  final Integer idx = (Integer)_names.get(name);
  +                  _namesArray[idx.intValue() - NTYPES] = name;
  +             }
  +
  +             _names = null;
  +             _types = setupMapping(_namesArray);
  +
  +             // trim arrays' sizes
  +             resizeTextArray(_currentOffset);
  +             
  +             _firstAttributeNode = _currentNode;
  +             shiftAttributes(_currentNode);
  +             resizeArrays(_currentNode + _currentAttributeNode, _currentNode);
  +             appendAttributes();
  +             _treeNodeLimit = _currentNode;
  +
  +             // Fill the _namespace[] array
  +             _namespace = new short[namesSize];
  +             for (int i=0; i<namesSize; i++) {
  +                  int col = _namesArray[i].lastIndexOf(':');
  +                  if (col == -1) { // default namespace
  +                      _namespace[i] = 0;
  +                  }
  +                  else {           // other namespaces
  +                      _namespace[i] =
  +                           (short)addNamespaceURI(_namesArray[i].substring(0,col));
  +                  }
  +             }
  +
  +             // Fill the _nsNamesArray[] array
  +             _nsNamesArray = new String[_nsCount];
  +             System.arraycopy(_nsNames,0,_nsNamesArray,0,_nsCount);
  +             _nsNames = null;
  +         }
  +         
  +         /**
  +          * Part of SAX handler interface
  +          */
  +         public void startElement(String elementName, AttributeList attList)
  +             throws SAXException {
  +
  +             maybeCreateTextNode();
  +             final int node = nextNode();
  +             linkChildren(node);
  +             _parentStack[++_sp] = node;
  +
  +             // process attribute list - including namespace declarations
  +             final int length = attList.getLength();
  +             if (length > 0) {
  +                  int i = 1, attrNode = makeAttributeNode(node, attList, 0);
  +                  while (attrNode == -1 && i < length) {
  +                      attrNode = makeAttributeNode(node, attList, i++);
  +                  }
  +                  if (attrNode != -1) {
  +                      _lengthOrAttr[node] = attrNode;         // first attr
  +                      while (i < length) {
  +                           final int attrNode2 =
  +                               makeAttributeNode(node, attList, i++);
  +                           if (attrNode2 != -1) {
  +                               _nextSibling2[attrNode] = attrNode2;
  +                               attrNode = attrNode2;
  +                           }
  +                      }
  +                  }
  +             }
  +             _type[node] = internElement(elementName);
  +         }
  +
  +         /**
  +          * Part of SAX handler interface
  +          */
  +         private int makeAttributeNode(int parent, AttributeList attList, int i)
  +             throws SAXException {
  +             final String name = attList.getName(i);
  +             boolean xmlAttr = false;
  +
  +             // process namespace declaration
  +             if (name.startsWith(XML_STRING)) {
  +                  if (name.startsWith(XMLNS_STRING)) {
  +                      // declaring the default namespace ?
  +                      if (name.length() == 5)
  +                           addNamespace(parent, EMPTYSTRING, attList.getValue(i));
  +                      // declaring some other namespace
  +                      else
  +                           addNamespace(parent, name.substring(6),
  +                                         attList.getValue(i));
  +                      return -1;
  +                  }
  +                  else if (name.startsWith(XMLSPACE_STRING)) {
  +                      xmlSpaceDefine(attList.getValue(i), parent);
  +                  }
  +                  xmlAttr = true;
  +             }
  +
  +             // fall through to handle a regular attribute
  +                 final int node = nextAttributeNode();
  +             _type2[node] = internAttribute(name,xmlAttr);
  +             _parent2[node] = parent;
  +             characters(attList.getValue(i));
  +             storeAttrValRef(node);
  +             return node;
  +         }
  +         
  +         /**
  +          * Part of SAX handler interface
  +          */
  +         public void endElement(String elementName) {
  +             maybeCreateTextNode();
  +             // Revert to strip/preserve-space setting from before this element
  +             xmlSpaceRevert(_parentStack[_sp]);
  +             // Pop all namespace declarations found in this element
  +             _nsDeclarations.pop(_parentStack[_sp]);
  +             _previousSiblingStack[_sp--] = 0;
  +         }
  +
  +         /**
  +          * Part of SAX handler interface
  +          */
  +         public void processingInstruction(String target, String data) {
  +             maybeCreateTextNode();
  +             final int node = nextNode();
  +             _type[node] = PROCESSING_INSTRUCTION;
  +             linkChildren(node);
  +             characters(target + ' ' + data);
  +             storeTextRef(node);
  +         }
  +                  
  +         /**
  +          * Part of SAX handler interface - NO, THIS IS NOT SAX, THIS IS SHITE!!
  +          */
  +         public void characters(final String string) {
  +             final int length = string.length();
  +             if (_currentOffset + length > _text.length) {
  +                  resizeTextArray(_text.length * 2);
  +             }
  +             string.getChars(0, length, _text, _currentOffset);
  +             _currentOffset += length;
  +         }
  +
  +         /**
  +          * can accumulate text from consecutive calls
  +          */
  +         public void characters(char[] ch, int start, int length) {
  +             if (_currentOffset + length > _text.length) {
  +                  resizeTextArray(_text.length * 2);
  +             }
  +             System.arraycopy(ch, start, _text, _currentOffset, length);
  +             _currentOffset += length;
  +             maybeCreateTextNode();
  +         }
  +         
  +         private void resizeArrays(final int newSize, final int length) {
  +             final short[] newType = new short[newSize];
  +             System.arraycopy(_type, 0, newType, 0, length);
  +             _type = newType;
  +             final int[] newParent = new int[newSize];
  +             System.arraycopy(_parent, 0, newParent, 0, length);
  +             _parent = newParent;
  +             final int[] newNextSibling = new int[newSize];
  +             System.arraycopy(_nextSibling, 0, newNextSibling, 0, length);
  +             _nextSibling = newNextSibling;
  +             final int[] newOffsetOrChild = new int[newSize];
  +             System.arraycopy(_offsetOrChild, 0, newOffsetOrChild, 0, length);
  +             _offsetOrChild = newOffsetOrChild;
  +             final int[] newLengthOrAttr = new int[newSize];
  +             System.arraycopy(_lengthOrAttr, 0, newLengthOrAttr, 0, length);
  +             _lengthOrAttr = newLengthOrAttr;
  +             _whitespace.resize(newSize);
  +         }
  +         
  +         private void resizeArrays2(final int newSize, final int length) {
  +             final short[] newType = new short[newSize];
  +             System.arraycopy(_type2, 0, newType, 0, length);
  +             _type2 = newType;
  +             final int[] newParent = new int[newSize];
  +             System.arraycopy(_parent2, 0, newParent, 0, length);
  +             _parent2 = newParent;
  +             final int[] newNextSibling = new int[newSize];
  +             System.arraycopy(_nextSibling2, 0, newNextSibling, 0, length);
  +             _nextSibling2 = newNextSibling;
  +             final int[] newOffset = new int[newSize];
  +             System.arraycopy(_offset, 0, newOffset, 0, length);
  +             _offset = newOffset;
  +             final int[] newLength = new int[newSize];
  +             System.arraycopy(_length, 0, newLength, 0, length);
  +             _length = newLength;
  +         }
  +         
  +         private void shiftAttributes(final int shift) {
  +             final int limit = _currentAttributeNode;
  +             int lastParent = -1;
  +             for (int i = 0; i < limit; i++) {
  +                  if (_parent2[i] != lastParent) {
  +                      lastParent = _parent2[i];
  +                      _lengthOrAttr[lastParent] = i + shift;
  +                  }
  +                  final int next = _nextSibling2[i];
  +                  _nextSibling2[i] = next != 0 ? next + shift : 0;
  +             }
  +         }
  +         
  +         private void appendAttributes() {
  +             final int len = _currentAttributeNode;
  +             if (len > 0) {
  +                  final int dst = _currentNode;
  +                  System.arraycopy(_type2,         0, _type,          dst, len);
  +                  System.arraycopy(_parent2,       0, _parent,        dst, len);
  +                  System.arraycopy(_nextSibling2,  0, _nextSibling,   dst, len);
  +                  System.arraycopy(_offset,        0, _offsetOrChild, dst, len);
  +                  System.arraycopy(_length,        0, _lengthOrAttr,  dst, len);
  +             }
  +         }
       } // end of DOMBuilder
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org