You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mm...@locus.apache.org on 2000/07/25 18:05:48 UTC

cvs commit: xml-xalan/java/src/org/apache/xalan/xslt ElemExtensionCall.java StylesheetHandler.java StylesheetRoot.java XSLProcessorContext.java XSLProcessorVersion.java XSLTEngineImpl.java XSLTInputSource.java XSLTProcessor.java XSLTProcessorFactory.java XSLTResultTarget.java

mmidy       00/07/25 09:05:47

  Modified:    java     Makefile make.include
  Added:       java/src makecompat
               java/src/org/apache/xalan/xpath XObject.java XString.java
               java/src/org/apache/xalan/xpath/xml FormatterToDOM.java
                        FormatterToHTML.java FormatterToText.java
                        FormatterToXML.java ProblemListener.java
                        ProblemListenerDefault.java TreeWalker.java
                        XMLParserLiaison.java
               java/src/org/apache/xalan/xslt ElemExtensionCall.java
                        StylesheetHandler.java StylesheetRoot.java
                        XSLProcessorContext.java XSLProcessorVersion.java
                        XSLTEngineImpl.java XSLTInputSource.java
                        XSLTProcessor.java XSLTProcessorFactory.java
                        XSLTResultTarget.java
  Log:
  Check in compatibility layer to xalan 1.x.
  
  Revision  Changes    Path
  1.2       +9 -0      xml-xalan/java/Makefile
  
  Index: Makefile
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/Makefile,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Makefile	2000/06/19 16:51:35	1.1
  +++ Makefile	2000/07/25 16:05:35	1.2
  @@ -47,6 +47,8 @@
   
   jars: makesubdirs $(JARNAME)
   
  +compat: makecompat compatjars
  +
   PROPPATH = org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)res
   $(JARNAME)::
   	$(CP) src/$(PROPPATH)/*.properties src/$(CLASS_DIR)/$(PROPPATH)/.; \
  @@ -54,6 +56,11 @@
   	cd src/$(CLASS_DIR); $(JAR) $(JARFLAGS) ../../bin/$@ org trax; \
   	echo "done"
   
  +compatjars:
  +	echo -n "Jarring ../bin/$@ .. "; \
  +	cd src/$(CLASS_DIR); $(JAR) $(JARFLAGS) ../../bin/$@.jar org/apache/xalan/xslt org/apache/xalan/xpath; \
  +	echo "done"
  +
   # Note: When making dist, copy the built docs up one level
   # Note: Create both a super-jar and a tar.gz archive
   DISTDIR  = $(PRODUCT_NAME)$(VERSION)
  @@ -76,4 +83,6 @@
   
   # Subsidiary targets are defined in make.include
   clean:: cleansubdirs cleandocs cleansamples
  +
  +compatclean:: cleancompat
   
  
  
  
  1.2       +16 -0     xml-xalan/java/make.include
  
  Index: make.include
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/make.include,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- make.include	2000/06/19 16:51:36	1.1
  +++ make.include	2000/07/25 16:05:36	1.2
  @@ -106,6 +106,14 @@
   	$(MAKE) CURRENT_DIR=$(CURRENT_DIR)/$$i $(MFLAGS) -f makexslt4j JAVACFLAGS="$(JAVACFLAGS)" all); \
   	done
   
  +.PHONY: makecompat
  +makecompat:
  +	@for i in $(SUBDIRS) ; \
  +	do \
  +	(cd $$i; echo making compat engine in "$(CURRENT_DIR)/$$i...";pwd; \
  +	$(MAKE) CURRENT_DIR=$(CURRENT_DIR)/$$i $(MFLAGS) -f makecompat JAVACFLAGS="$(JAVACFLAGS)" all); \
  +	done
  +
   .PHONY: makedocs
   makedocs:
   	@for i in xdocs ; \
  @@ -130,6 +138,14 @@
   	$(MAKE) CURRENT_DIR=$(CURRENT_DIR)/$$i -f makexpath4j $(MFLAGS) clean); \
   	(cd $$i; echo cleaning in "$(CURRENT_DIR)/$$i..."; \
   	$(MAKE) CURRENT_DIR=$(CURRENT_DIR)/$$i -f makexslt4j $(MFLAGS) clean); \
  +	done
  +
  +.PHONY: cleancompat
  +cleancompat:
  +	-@for i in $(SUBDIRS) ; \
  +	do \
  +	(cd $$i; echo cleaning in "$(CURRENT_DIR)/$$i..."; \
  +	$(MAKE) CURRENT_DIR=$(CURRENT_DIR)/$$i -f makecompat $(MFLAGS) clean); \
   	done
   
   .PHONY: cleandocs
  
  
  
  1.1                  xml-xalan/java/src/makecompat
  
  Index: makecompat
  ===================================================================
  ###########################################################
  # Makefile for the XSLT engine.
  #
  # See ../Makefile for important environment notes
  #
  ###########################################################
  
  # Include common targets and variables
  include ../make.include
  
  SINCE_FILE       = sincexslt.last
  
  # Define our directory structure
  COMPATDIR = org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt
  COMPATXPATHDIR = org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xpath
  XPATHDIR = org$(PATHSEP)apache$(PATHSEP)xpath
  XMLLIAISONDIR = org$(PATHSEP)apache$(PATHSEP)xpath$(PATHSEP)xml
  XSLT4JDIR = org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt
  TRANSFORMERDIR = $(PROJDIR)$(PATHSEP)transformer
  PROCESSORDIR = $(PROJDIR)$(PATHSEP)processor
  TEMPLATESDIR = $(PROJDIR)$(PATHSEP)templates
  EXTENSIONSDIR = $(PROJDIR)$(PATHSEP)extensions
  CLIENTDIR = $(PROJDIR)$(PATHSEP)client
  LIBDIR = $(PROJDIR)$(PATHSEP)lib
  TRACEDIR = $(PROJDIR)$(PATHSEP)trace
  RESDIR = $(PROJDIR)$(PATHSEP)res
  STREEDIR = $(PROJDIR)$(PATHSEP)stree
  TRAXDIR = trax
  SUBDIRS = 
  
  SRCS = \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt$(PATHSEP)XSLTEngineImpl.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt$(PATHSEP)XSLTInputSource.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt$(PATHSEP)XSLTProcessor.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt$(PATHSEP)XSLTProcessorFactory.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt$(PATHSEP)XSLTResultTarget.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt$(PATHSEP)StylesheetRoot.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt$(PATHSEP)StylesheetHandler.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt$(PATHSEP)XSLProcessorVersion.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt$(PATHSEP)ElemExtensionCall.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xslt$(PATHSEP)XSLProcessorContext.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xpath$(PATHSEP)XObject.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xpath$(PATHSEP)XString.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xpath$(PATHSEP)xml$(PATHSEP)FormatterToXML.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xpath$(PATHSEP)xml$(PATHSEP)FormatterToHTML.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xpath$(PATHSEP)xml$(PATHSEP)FormatterToDOM.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xpath$(PATHSEP)xml$(PATHSEP)ProblemListener.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xpath$(PATHSEP)xml$(PATHSEP)ProblemListenerDefault.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xpath$(PATHSEP)xml$(PATHSEP)TreeWalker.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xpath$(PATHSEP)xml$(PATHSEP)XMLParserLiaison.java \
    org$(PATHSEP)apache$(PATHSEP)xalan$(PATHSEP)xpath$(PATHSEP)xml$(PATHSEP)FormatterToText.java
    
    
    
    
    
      
  OBJS = $($(subst /,\\,$(SRCS)):%.java=classes/%.class)
  
  all: sincelast makesubdirs
  
  clean::
  	$(RM) $(COMPATDIR)/XSLTEngineImpl.class \
          $(RM) $(COMPATDIR)/XSLTResultTarget.class \
          $(RM) $(COMPATDIR)/StylesheetRoot.class \
          $(RM) $(COMPATDIR)/StylesheetHandler.class \
          $(RM) $(COMPATDIR)/XSLProcessorVersion.class \
          $(RM) $(COMPATDIR)/XSLTInputSource.class \
          $(RM) $(COMPATDIR)/XSLTProcessor.class \
          $(RM) $(COMPATDIR)/XSLTProcessorFactory.class \
          $(RM) $(COMPATDIR)/ElemExtensionCall.class \
          $(RM) $(COMPATDIR)/XSLProcessorContext.class \
          $(RM) $(COMPATXPATHDIR)/*.class \
          $(RM) $(CLASS_DIR)/$(COMPATXPATHDIR)/*/*.class \
          $(SINCE_FILE)
  
  include ../make.include2
  
  
  
  1.3       +7 -326    xml-xalan/java/src/org/apache/xalan/xpath/XObject.java
  
  
  
  
  1.3       +3 -119    xml-xalan/java/src/org/apache/xalan/xpath/XString.java
  
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xpath/xml/FormatterToDOM.java
  
  Index: FormatterToDOM.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xpath.xml;
  
  import org.w3c.dom.*;
  import org.apache.xml.serialize.Serializer;
  import org.apache.xml.serialize.SerializerFactory;
  import org.apache.xml.serialize.BaseMarkupSerializer;
  import org.apache.xml.serialize.OutputFormat;
  
  /**
   * <meta name="usage" content="general"/>
   * This class takes SAX events (in addition to some extra events 
   * that SAX doesn't handle yet) and adds the result to a document 
   * or document fragment.
   */
  public class FormatterToDOM //extends BaseMarkupSerializer
  { 
      
    /**
     * FormatterToDOM instance constructor... it will add the DOM nodes 
     * to the document fragment.
     */
    public FormatterToDOM(Document doc, Element elem)
    {
      //super(new OutputFormat());
      
    }
  
    /**
     * FormatterToDOM instance constructor... it will add the DOM nodes 
     * to the document fragment.
     */
    public FormatterToDOM(Document doc, DocumentFragment docFrag)
    {
      //super(new OutputFormat()); 
      
    }
  
    /**
     * FormatterToDOM instance constructor... it will add the DOM nodes 
     * to the document.
     */
    public FormatterToDOM(Document doc)
    {
      //super(new OutputFormat());
      
    }
    
    
  
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xpath/xml/FormatterToHTML.java
  
  Index: FormatterToHTML.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xpath.xml;
  
  import java.io.Writer;
  import java.io.OutputStream;
  import java.io.OutputStreamWriter;
  import java.io.UnsupportedEncodingException;
  
  import org.apache.xml.serialize.Serializer;
  import org.apache.xml.serialize.SerializerFactory;
  import org.apache.xml.serialize.HTMLSerializer;
  import org.apache.xml.serialize.OutputFormat;
  
  /**
   * <meta name="usage" content="general"/>
   * FormatterToHTML formats SAX-style events into XML.
   * Warning: this class will be replaced by the Xerces Serializer classes.
   */
  public class FormatterToHTML extends HTMLSerializer 
  { 
    public FormatterToHTML()
    {  
      super();      
    }
    
    /**
     * Constructor using a writer.
     * @param writer        The character output stream to use.
     */
    public FormatterToHTML(Writer writer) 
    {
      super (writer, null);
    }
    
    /**
     * Constructor using an output stream, and a simple OutputFormat.
     * @param writer        The character output stream to use.
     */
    public FormatterToHTML(java.io.OutputStream os) 
      throws UnsupportedEncodingException
    {
      super (os, null);
    }
    
    /**
     * Constructor using a writer.
     * @param writer        The character output stream to use.
     */
    public FormatterToHTML(FormatterToXML xmlListener) 
    {
      super();
    }
    
  }
  
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xpath/xml/FormatterToText.java
  
  Index: FormatterToText.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xpath.xml;
  
  import java.io.Writer;
  
  import org.apache.xml.serialize.Serializer;
  import org.apache.xml.serialize.SerializerFactory;
  import org.apache.xml.serialize.TextSerializer;
  import org.apache.xml.serialize.OutputFormat;
  
  /**
   * <meta name="usage" content="general"/>
   * This class takes SAX events (in addition to some extra events 
   * that SAX doesn't handle yet) and produces simple text only.
   * Warning: this class will be replaced by the Xerces Serializer classes.
   */
  public class FormatterToText //extends TextSerializer
  {
    
    /**
     * FormatterToText instance constructor... it will add the DOM nodes 
     * to the document fragment.
     */
    public FormatterToText(Writer pw)
    {
      new TextSerializer(); //super();
    }
    
    
  
  
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xpath/xml/FormatterToXML.java
  
  Index: FormatterToXML.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xpath.xml;
  
  import java.io.Writer;
  import java.io.OutputStream;
  import java.io.OutputStreamWriter;
  import java.io.UnsupportedEncodingException;
  
  import org.apache.xml.serialize.Serializer;
  import org.apache.xml.serialize.SerializerFactory;
  import org.apache.xml.serialize.XMLSerializer;
  import org.apache.xml.serialize.BaseMarkupSerializer;
  import org.apache.xml.serialize.Method;
  import org.apache.xml.serialize.OutputFormat;
  
  
  /**
   * <meta name="usage" content="general"/>
   * FormatterToXML formats SAX-style events into XML.
   * Warning: this class will be replaced by the Xerces Serializer classes.
   */
  public class FormatterToXML //extends BaseMarkupSerializer 
  {
    XMLSerializer m_serializer;
    public void FormatterToXML()
    {
      m_serializer = new XMLSerializer();
      //super( new OutputFormat( Method.XML, null, false ) );     
    }
    
    /**
     * Constructor using a writer.
     * @param writer        The character output stream to use.
     */
    public FormatterToXML(Writer writer) 
    {
      m_serializer = new XMLSerializer(writer, null);
     // super( format != null ? format : new OutputFormat( Method.XML, null, false ) );
      //_format.setMethod( Method.XML );
      //setOutputCharStream( writer );
    }
    
    /**
     * Constructor using an output stream, and a simple OutputFormat.
     * @param writer        The character output stream to use.
     */
    public FormatterToXML(java.io.OutputStream os) 
      throws UnsupportedEncodingException
    {
      m_serializer = new XMLSerializer(os, null);
      //super( format != null ? format : new OutputFormat( Method.XML, null, false ) );
      //_format.setMethod( Method.XML );
      //setOutputByteStream( os );
    }
    
    /**
     * Constructor using a writer.
     * @param writer        The character output stream to use.
     */
    public FormatterToXML(FormatterToXML xmlListener) 
    {
      m_serializer = new XMLSerializer();
      //super( new OutputFormat( Method.XML, null, false ) );  
    }
    
    
    
    
  
  }  //ToXMLStringVisitor
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xpath/xml/ProblemListener.java
  
  Index: ProblemListener.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xpath.xml;
  
  import org.w3c.dom.*;
  
  /**
   * <meta name="usage" content="general"/>
   * This is the interface that the XSL processor calls when it 
   * has a problem of some kind, either an error or a warning.
   * Users should ass the XSLTEngineImpl class to setProblemListener
   * if they wish an object instance to be called when a problem
   * event occurs.
   */
  public interface ProblemListener
  {
    public static final short    WARNING         = 1;
    public static final short    ERROR           = 2;
    public static final short    MESSAGE         = 3;
  
    public static final short    XMLPARSER       = 1;
    public static final short    XSLPROCESSOR    = 2;
    public static final short    QUERYENGINE     = 3;
    public static final short    XPATHPROCESSOR  = 4;
    public static final short    XPATHPARSER  = 5;
  
    /**
     * Function that is called when a problem event occurs.
     * 
     * @param   where             Either and XMLPARSER, XSLPROCESSOR, or QUERYENGINE.
     * @param   classification    Either ERROR or WARNING.
     * @param   styleNode         The style tree node where the problem
     *                            occurred.  May be null.
     * @param   sourceNode        The source tree node where the problem
     *                            occurred.  May be null.
     * @param   msg               A string message explaining the problem.
     * @param   lineNo            The line number where the problem occurred,  
     *                            if it is known. May be zero.
     * @param   charOffset        The character offset where the problem,  
     *                            occurred if it is known. May be zero.
     * 
     * @return  true if the return is an ERROR, in which case
     *          exception will be thrown.  Otherwise the processor will 
     *          continue to process.
     */
    public boolean problem(short where, short classification, 
                         Object styleNode, Node sourceNode,
                         String msg, String id, int lineNo, int charOffset)
      throws org.xml.sax.SAXException  ;
    
    /**
     * Function that is called to issue a message.
     * @param   msg               A string message to output.
     */
    public boolean message(String msg);
  
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xpath/xml/ProblemListenerDefault.java
  
  Index: ProblemListenerDefault.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xpath.xml;
  
  import org.w3c.dom.*;
  import org.xml.sax.ErrorHandler;
  
  import trax.ProcessorException;
  
  /**
   * <meta name="usage" content="general"/>
   * This is the interface that the XSL processor calls when it 
   * has a problem of some kind, either an error or a warning.
   * Users should ass the XSLTEngineImpl class to setProblemListener
   * if they wish an object instance to be called when a problem
   * event occurs.
   */
  public class ProblemListenerDefault implements ProblemListener 
  {
    ErrorHandler m_errorHandler = null;
    ProblemListener m_problemListener = null;
    
    public ProblemListenerDefault()
    {
      m_errorHandler = new org.apache.xalan.utils.DefaultErrorHandler("");
    }
    
    public ProblemListenerDefault(ErrorHandler handler, ProblemListener l)
    { 
      m_errorHandler = handler;
      m_problemListener = l;
    }
    
    public void setErrorHandler (ErrorHandler handler)
    {
      m_errorHandler = handler;
    }
    
    public void setProblemListener (ProblemListener l)
    {
      m_problemListener = l;
    }
    
    public ErrorHandler getErrorHandler ()
    {
      return m_errorHandler;
    }
    
    public ProblemListener getProblemListener ()
    {
      return m_problemListener;
    }
    
    /**
     * Function that is called to issue a message.
     * @param   msg               A string message to output.
     */
    public boolean message(String msg)
    {
        
        synchronized (this)
        {  
          new java.io.PrintWriter(  System.err, true ).println( msg );
        } 
     
      return false;                    // we don't know this is an error 
    }
    
    public boolean problem(short where, short classification, 
                         Object styleNode, Node sourceNode,
                         String msg, String id, int lineNo, int charOffset)
    throws org.xml.sax.SAXException   
    {
      m_errorHandler.error(new trax.ProcessorException(msg));
      return false;   
    }  
    
  
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xpath/xml/TreeWalker.java
  
  Index: TreeWalker.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1 
   * 
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xpath.xml;
  
  import org.w3c.dom.*;
  import org.xml.sax.*;
  import org.xml.sax.ext.LexicalHandler;
  
  import org.apache.xalan.utils.AttList;
  import org.apache.xalan.utils.RawCharacterHandler;
  /**
   * <meta name="usage" content="advanced"/>
   * This class does a pre-order walk of the DOM tree, calling the FormatterListener
   * interface as it goes.
   */
  public class TreeWalker extends org.apache.xalan.utils.TreeWalker
  {
    /**
     * Constructor.
     * @param   formatterListener The implemention of the 
     * FormatterListener operation (toXMLString, digest, ...)
     */
    public TreeWalker(ContentHandler formatterListener) 
    {
      super(formatterListener);
    } 
   
    
  }  //TreeWalker
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xpath/xml/XMLParserLiaison.java
  
  Index: XMLParserLiaison.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xpath.xml;
  
  import org.w3c.dom.*;
  import org.apache.xpath.DOM2Helper;
  
  /**
   * <meta name="usage" content="general"/>
   * This is the interface that the XSL processor calls when it 
   * has a problem of some kind, either an error or a warning.
   * Users should ass the XSLTEngineImpl class to setProblemListener
   * if they wish an object instance to be called when a problem
   * event occurs.
   */
  public class XMLParserLiaison extends DOM2Helper
  {
    
  
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xslt/ElemExtensionCall.java
  
  Index: ElemExtensionCall.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1 
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xslt;
  
  import org.apache.xalan.templates.Stylesheet; 
  import java.io.*;
  import java.util.*;
  import org.xml.sax.AttributeList;
  
  /**
   * <meta name="usage" content="advanced"/>
   * Implement an extension element.
   */
  public class ElemExtensionCall extends org.apache.xalan.templates.ElemExtensionCall
  {
    
  
    ElemExtensionCall(XSLTEngineImpl processor,
                      Stylesheet stylesheetTree,
                      // ExtensionNSHandler nsh,
                      String extns,
                      String lang, String srcURL, String scriptSrc,
                      String name,
                      String localPart,
                      AttributeList atts,
                      int lineNumber, int columnNumber)
      throws org.xml.sax.SAXException
    {
      super();
  
      
    }  
  
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xslt/StylesheetHandler.java
  
  Index: StylesheetHandler.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xslt;
  
  import java.util.*;
  import org.xml.sax.*;
  import org.w3c.dom.*;
  import java.util.Vector;
  import java.io.*;
  import java.net.*;
  
  import org.apache.xalan.templates.Stylesheet; 
  
  /**
   * <meta name="usage" content="advanced"/>
   * Initializes and processes a stylesheet via SAX events.
   * If you need to alter the code in here,
   * it is not for the faint-of-heart, due to the state tracking
   * that has to be done due to the SAX event model.
   */
  public class StylesheetHandler extends org.apache.xalan.processor.StylesheetHandler
    implements DocumentHandler
  {
    /**
     * Instance constructor... 
     */
    public StylesheetHandler(XSLTEngineImpl processor, Stylesheet stylesheetTree)
      throws trax.ProcessorException
    {
      super(processor.getProcessor());
    }
    
    public void endElement (String name)
      throws SAXException
    {}
    
    public void startElement (String name, AttributeList atts)
      throws SAXException
    {}
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xslt/StylesheetRoot.java
  
  Index: StylesheetRoot.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xslt;
  
  import org.w3c.dom.*;
  import java.util.*;
  import java.net.*;
  import java.io.*;
  import org.xml.sax.*;
  import org.xml.sax.helpers.*;
  import trax.ProcessorException;
  import org.apache.xml.serialize.*;
  
  /**
   * <meta name="usage" content="general"/> 
   * Binary representation of a stylesheet -- use the {@link org.apache.xalan.xslt.XSLTProcessor} ProcessStylesheet
   * method to create a StylesheetRoot and improve performance for a stylesheet performing multiple transformations.
   * Also required for XSLTProcessor to function as SAX DocumentHandler.
   */
  public class StylesheetRoot extends org.apache.xalan.templates.StylesheetRoot
  {
    /**
     * Uses an XSL stylesheet document.
     * @param processor  The XSLTProcessor implementation.
     * @param baseIdentifier The file name or URL for the XSL stylesheet.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public StylesheetRoot(XSLTEngineImpl processor,
                          String baseIdentifier)
      throws ProcessorException
    {   
      super();     
    }
    
    /** Get the encoding string that was specified in the stylesheet. */
    public String getOutputEncoding()
    {
      return this.getOutputComposed().getEncoding();
    }
  
    /** Get the media-type string that was specified in the stylesheet. */
    public String getOutputMediaType() 
    { 
      return this.getOutputComposed().getMediaType(); 
    }
    
    
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xslt/XSLProcessorContext.java
  
  Index: XSLProcessorContext.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xslt;
  
  import org.w3c.dom.*;
  import org.apache.xalan.templates.Stylesheet;
  import org.apache.xalan.utils.QName;
  import org.apache.xalan.transformer.TransformerImpl;
  
  // import org.apache.xalan.xslt.*;  
  
  /**
   * <meta name="usage" content="general"/>
   * Captures processor context to be
   * passed to an extension element.
   *
   * @author Sanjiva Weerawarana (sanjiva@watson.ibm.com)
   */
  public class XSLProcessorContext extends org.apache.xalan.extensions.XSLProcessorContext
  {
    public XSLProcessorContext (XSLTEngineImpl processor,
  			      Stylesheet stylesheetTree,
  			      Node sourceTree, Node sourceNode, QName mode) 
      throws trax.TransformException, trax.ProcessorException
    {
      super((TransformerImpl)(processor.getProcessor().getTemplatesBuilder().getTemplates().newTransformer()),
            stylesheetTree, 
            sourceTree, sourceNode, mode);
    }
  
    
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xslt/XSLProcessorVersion.java
  
  Index: XSLProcessorVersion.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xslt;
  
  /**
   * <meta name="usage" content="general"/>
   * Administrative class to keep track of the version number of 
   * the Xalan release.
   * <P>See also: org/apache/xalan/xpath/xml/XSLTInfo.properties</P>
   */
  public class XSLProcessorVersion
  {
    /**
     * Print the processor version to the command line.
     */
    public static void main( String argv[] )
    {
      System.out.println(PRODUCT + " "+LANGUAGE+" Version "+S_VERSION);
    }
    
    /**
     * Version String like <CODE>"<B>Xalan</B>i v.r[.dd| <B>D</B>nn]"</CODE>.
     * <P>Semantics of the version string are identical to the Xerces project.</P>
     */
    public static String S_VERSION = "1.1";
  
    /**
     * Constant name of product.
     */
    public static final String PRODUCT = "Xalan";
  
    /**
     * Implementation Language.
     */
    public static String LANGUAGE = "Java";
  
    /**
     * Major version number.
     * Version number. This changes only when there is a
     *          significant, externally apparent enhancement from
     *          the previous release. 'n' represents the n'th
     *          version.
     *
     *          Clients should carefully consider the implications
     *          of new versions as external interfaces and behaviour
     *          may have changed.
     */
    public static int VERSION = 1;
  
    /**
     * Release Number.
     * Release number. This changes when:
     *            -  a new set of functionality is to be added, eg,
     *               implementation of a new W3C specification.
     *            -  API or behaviour change.
     *            -  its designated as a reference release.
     */
    public static int RELEASE = 1;
  
    /**
     * Maintenance Drop Number.
     * Optional identifier used to designate maintenance
     *          drop applied to a specific release and contains
     *          fixes for defects reported. It maintains compatibility
     *          with the release and contains no API changes.
     *          When missing, it designates the final and complete
     *          development drop for a release.
     */
    public static int MAINTENANCE = 0;
  
    /**
     * Development Drop Number.
     * Optional identifier designates development drop of
     *          a specific release. D01 is the first development drop
     *          of a new release.
     *
     *          Development drops are works in progress towards a
     *          compeleted, final release. A specific development drop
     *
     *          may not completely implement all aspects of a new
     *          feature, which may take several development drops to
     *          complete. At the point of the final drop for the
     *          release, the D suffix will be omitted.
     *
     *          Each 'D' drops can contain functional enhancements as
     *          well as defect fixes. 'D' drops may not be as stable as
     *          the final releases.
     */
    public static int DEVELOPMENT = 0;
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xslt/XSLTEngineImpl.java
  
  Index: XSLTEngineImpl.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xslt;
  
  import org.apache.xpath.*;
  import org.apache.xpath.compiler.XPathParser;
  import org.apache.xpath.compiler.Compiler;
  import org.apache.xpath.objects.XObject;
  import org.apache.xpath.objects.XString;
  import org.apache.xpath.objects.XNodeSet;
  import org.apache.xpath.objects.XBoolean;
  import org.apache.xpath.objects.XNumber;
  import org.apache.xpath.objects.XNull;
  
  import org.w3c.dom.*;
  import org.w3c.dom.traversal.NodeIterator;
  import org.xml.sax.ContentHandler;
  import org.xml.sax.*;
  import org.xml.sax.helpers.*;
  import org.xml.sax.ext.*;
  
  import trax.Transformer;
  import trax.Processor;
  import trax.TransformException;
  import trax.ProcessorException;
  import trax.ProcessorFactoryException;
  import trax.Templates;
  
  import java.util.*;
  import java.net.*;
  import java.io.*;
  import java.lang.reflect.*;
  
  import org.apache.xalan.templates.Stylesheet;
  //import org.apache.xalan.templates.StylesheetRoot;
  import org.apache.xalan.xpath.xml.XMLParserLiaison;
  import org.apache.xalan.xpath.xml.ProblemListenerDefault;
  import org.apache.xalan.xpath.xml.ProblemListener;
  import org.apache.xalan.templates.StylesheetComposed;
  import org.apache.xalan.transformer.TransformerImpl;
  import org.apache.xalan.processor.StylesheetHandler;
  import org.apache.xalan.processor.StylesheetProcessor;
  import org.apache.xalan.xslt.StylesheetSpec;
  import org.apache.xalan.trace.*;
  import org.apache.xalan.res.XSLTErrorResources;
  import org.apache.xalan.res.XSLMessages;
  import org.apache.xalan.utils.PrefixResolverDefault;
  import org.apache.xalan.utils.TreeWalker;
  import org.apache.xalan.utils.QName;
  import org.apache.xalan.stree.SourceTreeHandler;
  
  
  /**
   * <meta name="usage" content="advanced"/>
   * The Xalan workhorse -- Collaborates with the XML parser liaison, the DOM,
   * and the XPath engine, to transform a source tree of nodes into a result tree
   * according to instructions and templates specified by a stylesheet tree.
   * We suggest you use one of the
   * static XSLTProcessorFactory getProcessor() methods to instantiate the processor
   * and return an interface that greatly simplifies the process of manipulating
   * XSLTEngineImpl.
   *
   * <p>The methods <code>process(...)</code> are the primary public entry points.
   * The best way to perform transformations is to use the
   * {@link XSLTProcessor#process(XSLTInputSource, XSLTInputSource, XSLTResultTarget)} method,
   * but you may use any of process methods defined in XSLTEngineImpl.</p>
   * 
   * <p>Please note that this class is not safe per instance over multiple 
   * threads.  If you are in a multithreaded environment, you should 
   * keep a pool of these objects, or create a new one each time.  In a 
   * multithreaded environment, the right way to do things is to create a 
   * StylesheetRoot via processStylesheet, and then reuse this object 
   * over multiple threads.</p>
   *
   * <p>If you reuse the processor instance, you should call reset() between transformations.</p>
   * @see XSLTProcessorFactory
   * @see XSLTProcessor
   */
  public class XSLTEngineImpl implements  XSLTProcessor
  {
    private Processor m_processor;
    private TransformerImpl m_transformerImpl;
    private DOM2Helper m_liaison;
    private String m_outputFileName;
    private DocumentHandler m_documentHandler = null;
    private ProblemListenerDefault m_problemListener;
    private Hashtable m_stylesheetParams;
    
    /*
    * If this is true, then the diag function will
    * be called.
    */
    private boolean m_traceTemplateChildren = false;
  
    /*
    * If this is true, then the simple tracing of templates
    * will be performed.
    */
    private boolean m_traceTemplates = false;
    
    /*
    * If this is true, then diagnostics of each select
    * will be performed.
    */
    boolean m_traceSelects = false;
  
    /*
    * A stream to print diagnostics to.
    */
    java.io.PrintWriter m_diagnosticsPrintWriter = null;
  
    /* For diagnostics */
    Hashtable m_durationsTable = new Hashtable();
    
    /**
     * A XSLMessages instance capable of producing user messages.
     */
    private static XSLMessages m_XSLMessages = new XSLMessages();
    
    /**
     * Construct an XSLT processor 
     * @see XSLTProcessorFactory
     * @see XSLTProcessor
     */
    protected XSLTEngineImpl(Processor p)
      throws org.xml.sax.SAXException
    {
      m_processor = p;
      //m_transformerImpl = (TransformerImpl)t;
    }  
    
   /**
     * Construct an XSLT processor that uses the default DTM (Document Table Model) liaison
     * and XML parser. As a general rule, you should use XSLTProcessorFactory to create an
     * instance of this class and provide access to the instance via the XSLTProcessor interface.
     *
     * @see XSLTProcessorFactory
     * @see XSLTProcessor
     */
    protected XSLTEngineImpl()
      throws org.xml.sax.SAXException
    {
      m_processor = Processor.newInstance("xslt");
    /*  try
      {
        String parserLiaisonClassName = Constants.LIAISON_CLASS;
        Class parserLiaisonClass = Class.forName(parserLiaisonClassName);
        Constructor parserLiaisonCtor = parserLiaisonClass.getConstructor(null);
        m_parserLiaison
          = (XMLParserLiaison)parserLiaisonCtor.newInstance(null);
        m_parserLiaison.setEnvSupport(this);
      }
      catch(Exception e)
      {
        throw new XSLProcessorException(e);
      }*/
    }
  
    /**
     * Construct an XSLT processor that uses the the given parser liaison.
     * As a general rule, you should use XSLTProcessorFactory to create an
     * instance of this class and provide access to the instance via the XSLTProcessor interface.
     *
     * @see XSLTProcessorFactory
     * @see XSLTProcessor
     */
    public XSLTEngineImpl(String liaisonClassName)
      throws org.xml.sax.SAXException 
    {
      try
      {
      m_processor = Processor.newInstance("xslt");
      }
      catch (ProcessorFactoryException pfe)
      {
        throw new TransformException("Could not create Processor", pfe);
      }
      
      try 
        {
          DOM2Helper m_liaison =  (DOM2Helper)(Class.forName(liaisonClassName).newInstance());
          //getXPathContext().setDOMHelper(liaison);
          
        } 
        catch (ClassNotFoundException e1) 
        {
          throw new TransformException("XML Liaison class " + liaisonClassName +
            " specified but not found", e1);
        } 
        catch (IllegalAccessException e2) 
        {
            throw new TransformException("XML Liaison class " + liaisonClassName +
              " found but cannot be loaded", e2);
        } 
        catch (InstantiationException e3) 
        {
            throw new TransformException("XML Liaison class " + liaisonClassName +
              " loaded but cannot be instantiated (no empty public constructor?)",
              e3);
        } 
        catch (ClassCastException e4) 
        {
            throw new TransformException("XML Liaison class " + liaisonClassName +
              " does not implement DOM2Helper", e4);
        }
    }
      
      
  
    /**
     * Construct an XSL processor that uses the the given parser liaison.
     * As a general rule, you should use XSLTProcessorFactory to create an
     * instance of this class and provide access to the instance via the XSLTProcessor interface.
     *
     * @param XMLParserLiaison A liaison to an XML parser.
     *
     * @see org.apache.xalan.xpath.xml.XMLParserLiaison
     * @see XSLTProcessorFactory
     * @see XSLTProcessor
     */
    public XSLTEngineImpl(XMLParserLiaison parserLiaison)
      //throws org.xml.sax.SAXException
    {
      try{
        m_processor = Processor.newInstance("xslt");
      }
      catch (ProcessorFactoryException pfe)
      {
        //throw new TransformException("Could not create Processor", pfe);
      }
      DOM2Helper m_liaison =  (DOM2Helper)parserLiaison;
      //getXPathContext().setDOMHelper(liaison);
    }
  
    /**
     * Construct an XSLT processor that can call back to the XML parser, in order to handle
     * included files and the like.
     *
     * @param XMLParserLiaison A liaison to an XML parser.
     *
     * @see org.apache.xalan.xpath.xml.XMLParserLiaison
     * @see XSLTProcessorFactory
     * @see XSLTProcessor
     */
    XSLTEngineImpl(XMLParserLiaison parserLiaison, XPathFactory xpathFactory)    
      //throws org.xml.sax.SAXException
    {
      try{
        m_processor = Processor.newInstance("xslt");
      }  
      catch (ProcessorFactoryException pfe)
      {
        //throw new TransformException("Could not create Processor", pfe);
      }
      DOM2Helper m_liaison =  (DOM2Helper)parserLiaison;
      //getXPathContext().setDOMHelper(liaison);
    }
   
    /**
     * Reset the state.  This needs to be called after a process() call
     * is invoked, if the processor is to be used again.
     */
    public void reset()
    {
      if (m_transformerImpl != null)
        m_transformerImpl.reset();    
    }
    
   
  
    /**
     * Transform the source tree to the output in the given
     * result tree target. As a general rule, we recommend you use the
     * {@link XSLTProcessor#Process(XSLTInputSource, XSLTInputSource, XSLTResultTarget)} method.
     * @param inputSource  The input source.
     * @param stylesheetSource  The stylesheet source.  May be null if source has a xml-stylesheet PI.
     * @param outputTarget The output source tree.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void process( XSLTInputSource inputSource,
                         XSLTInputSource stylesheetSource,
                         XSLTResultTarget outputTarget)
      throws SAXException
    {
      try
      {
        Boolean totalTimeID = new Boolean(true);
        pushTime(totalTimeID);
        Node sourceTree = null;
        if(null != inputSource)
          sourceTree = getSourceTreeFromInput(inputSource);
        Templates templates = null;
        if(null != stylesheetSource)
        {
          templates = m_processor.process(stylesheetSource);
          //m_stylesheetRoot
        }      
        else if(null != sourceTree)
        {
          String stylesheetURI = null;
          Stack hrefs = new Stack();
          for(Node child=sourceTree.getFirstChild(); null != child; child=child.getNextSibling())
          {
            if(Node.PROCESSING_INSTRUCTION_NODE == child.getNodeType())
            {
              ProcessingInstruction pi = (ProcessingInstruction)child;
              if(pi.getNodeName().equals("xml-stylesheet")
                 || pi.getNodeName().equals("xml:stylesheet"))
              {
                boolean isOK = true;
                StringTokenizer tokenizer = new StringTokenizer(pi.getNodeValue(), " \t=");
                while(tokenizer.hasMoreTokens())
                {
                  if(tokenizer.nextToken().equals("type"))
                  {
                    String typeVal = tokenizer.nextToken();
                    typeVal = typeVal.substring(1, typeVal.length()-1);
                    if(!typeVal.equals("text/xsl"))
                    {
                      isOK = false;
                    }
                  }
                }
  
                if(isOK)
                {
                  tokenizer = new StringTokenizer(pi.getNodeValue(), " \t=");
                  while(tokenizer.hasMoreTokens())
                  {
                    if(tokenizer.nextToken().equals("href"))
                    {
                      stylesheetURI = tokenizer.nextToken();
                      stylesheetURI = stylesheetURI.substring(1, stylesheetURI.length()-1);
                      hrefs.push(stylesheetURI);
                    }
                  }
                  // break;
                }
              }
            }
          } // end for(int i = 0; i < nNodes; i++)
          boolean isRoot = true;
          Stylesheet prevStylesheet = null;
          while(!hrefs.isEmpty())
          {
            Stylesheet stylesheet = getStylesheetFromPIURL((String)hrefs.pop(), sourceTree,
                                                           (null != inputSource)
                                                           ? inputSource.getSystemId() : null,
                                                           isRoot);
            if(false == isRoot)
            {
              prevStylesheet.setImport((StylesheetComposed)stylesheet);
            }
            prevStylesheet = stylesheet;
            isRoot = false;
          }
        }
        else
        {
          error(XSLTErrorResources.ER_NO_INPUT_STYLESHEET); //"Stylesheet input was not specified!");
        }
  
        if(null == templates)
        {
          error(XSLTErrorResources.ER_FAILED_PROCESS_STYLESHEET); //"Failed to process stylesheet!");
        }
  
        if(null != sourceTree)
        {
          TransformerImpl t = (TransformerImpl)templates.newTransformer(); 
          
          if (m_stylesheetParams != null)
          {
            Enumeration keys = m_stylesheetParams.keys();
            while (keys.hasMoreElements())
            {
              String name = (String)keys.nextElement();
              Object value = m_stylesheetParams.get(name); 
              t.setParameter(name, null, value);
            } 
          }  
  
          t.transform(inputSource,
                      outputTarget);
          if(null != m_diagnosticsPrintWriter)
          {
            displayDuration("Total time", totalTimeID);
          }
        }
      }
      catch(MalformedURLException mue)
      {
        error(XSLTErrorResources.ERROR0000, new Object[] {mue.getMessage()}, mue);
        // throw se;
      }
      catch(FileNotFoundException fnfe)
      {
        error(XSLTErrorResources.ERROR0000, new Object[] {fnfe.getMessage()}, fnfe);
        // throw se;
      }
      catch(IOException ioe)
      {
        error(XSLTErrorResources.ERROR0000, new Object[] {ioe.getMessage()}, ioe);
        // throw se;
      }
      catch(SAXException se)
      {
        error(XSLTErrorResources.ER_SAX_EXCEPTION, se); //"SAX Exception", se);
        // throw se;
      }
    }
  
    /**
     * Bottleneck the creation of the stylesheet for derivation purposes.
     */
    public StylesheetRoot createStylesheetRoot(String baseIdentifier)
      throws MalformedURLException, FileNotFoundException,
             IOException, SAXException
    {
      if (baseIdentifier == null)
        return new StylesheetRoot(this, baseIdentifier); 
      
      Templates templates = m_processor.process(new InputSource(baseIdentifier));
      return (StylesheetRoot)((StylesheetHandler)(m_processor.getTemplatesBuilder())).getStylesheetRoot();
      //this, baseIdentifier);
    }
  
    /**
     * Given a URI to an XSL stylesheet,
     * Compile the stylesheet into an internal representation.
     * This calls reset() before processing if the stylesheet root has been set
     * to non-null.
     * @param xmldocURLString  The URL to the input XML document.
     * @return The compiled stylesheet object.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public StylesheetRoot processStylesheet(XSLTInputSource stylesheetSource)
      throws SAXException
    {
      if(null != m_processor.getTemplatesBuilder().getTemplates()) //m_stylesheetRoot)
        reset();
  
      String xslIdentifier = ((null == stylesheetSource) ||
                              (null == stylesheetSource.getSystemId()))
                             ? "Input XSL" : stylesheetSource.getSystemId();
  
      // In case we have a fragment identifier, go ahead and
      // try and parse the XML here.
      StylesheetRoot m_stylesheetRoot = null;
      try
      {
        m_stylesheetRoot = createStylesheetRoot(stylesheetSource.getSystemId());
        addTraceListenersToStylesheet();
        StylesheetHandler stylesheetProcessor
          = new StylesheetHandler((StylesheetProcessor)m_processor); //this, m_stylesheetRoot);
        if(null != stylesheetSource.getNode())
        {
          if(stylesheetSource.getNode() instanceof StylesheetRoot)
          {
            m_stylesheetRoot = (StylesheetRoot)stylesheetSource.getNode();
          }
          else
          {
            TreeWalker tw = new TreeWalker(stylesheetProcessor);
            tw.traverse(stylesheetSource.getNode());
          }
        }
        else
        {
          diag("========= Parsing "+xslIdentifier+" ==========");
          pushTime(xslIdentifier);
          String liaisonClassName = System.getProperty("org.apache.xalan.source.liaison");
  
          if(null != liaisonClassName)
          {
            DOM2Helper liaison =  (DOM2Helper)(Class.forName(liaisonClassName).newInstance());
            liaison.parse(stylesheetSource);
          }  
          if(null != m_diagnosticsPrintWriter)
            displayDuration("Parse of "+xslIdentifier, xslIdentifier);
        }
      }
      catch(Exception e)
      {
        error(XSLTErrorResources.ER_COULDNT_PARSE_DOC, new Object[] {xslIdentifier}, e); //"Could not parse "+xslIdentifier+" document!", e);
      }
      return m_stylesheetRoot;
    }
  
    /**
     * Given a URI to an XSL stylesheet,
     * Compile the stylesheet into an internal representation.
     * This calls reset() before processing if the stylesheet root has been set
     * to non-null.
     * @param xmldocURLString  The URL to the input XML document.
     * @return The compiled stylesheet object.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public StylesheetRoot processStylesheet(String xsldocURLString)
      throws SAXException
    {
      try
      {
        XSLTInputSource input = new XSLTInputSource(getURLFromString(xsldocURLString, null).toString());
        return processStylesheet(input);
      }
      catch(SAXException se)
      {
        error(XSLTErrorResources.ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL, se); //"processStylesheet not succesfull!", se);
        return null; // shut up compiler
      }
    }
  
    /**
     * Set the stylesheet for this processor.  If this is set, then the
     * process calls that take only the input .xml will use
     * this instead of looking for a stylesheet PI.  Also,
     * setting the stylesheet is needed if you are going
     * to use the processor as a SAX DocumentHandler.
     */
    public void setStylesheet(StylesheetRoot stylesheetRoot)
    {
      //m_stylesheetRoot = stylesheetRoot;
      m_transformerImpl = (TransformerImpl)stylesheetRoot.newTransformer();
    }
  
    /**
     * Get the current stylesheet for this processor.
     */
    public StylesheetRoot getStylesheet()    
    {
      try{
        return (StylesheetRoot)((StylesheetHandler)(m_processor.getTemplatesBuilder())).getStylesheetRoot(); //m_stylesheetRoot;
      }
      catch(ProcessorException pe)
      {
        return null;
      }  
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Get the filename of the output document, if it was set.
     * This is for use by multiple output documents, to determine
     * the base directory for the output document.  It needs to
     * be set by the caller.
     */
    public String getOutputFileName()
    {
      return m_outputFileName;
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Set the filename of the output document.
     * This is for use by multiple output documents, to determine
     * the base directory for the output document.  It needs to
     * be set by the caller.
     */
    public void setOutputFileName(String filename)
    {
      m_outputFileName = filename;
    }
  
    
  
    /**
     * Given an input source, get the source tree.
     */
    public Node getSourceTreeFromInput(XSLTInputSource inputSource)
      throws org.xml.sax.SAXException
    {
      Node sourceTree = null;
      String xmlIdentifier = ((null == inputSource) ||
                              (null == inputSource.getSystemId()))
                             ? "Input XML" : inputSource.getSystemId();
  
      if(null != inputSource.getNode())
      {
        //if(getXMLProcessorLiaison() instanceof org.apache.xalan.xpath.dtm.DTMLiaison)
         // error(XSLTErrorResources.ER_CANT_USE_DTM_FOR_INPUT); //"Can't use a DTMLiaison for a input DOM node... pass a org.apache.xalan.xpath.xdom.XercesLiaison instead!");
  
        sourceTree = inputSource.getNode();
      }
      else
      {
        // In case we have a fragment identifier, go ahead and
        // try and parse the XML here.
        try
        {
          diag("========= Parsing "+xmlIdentifier+" ==========");
          pushTime(xmlIdentifier);
          
          String liaisonClassName = System.getProperty("org.apache.xalan.source.liaison");
  
          if(null != liaisonClassName)
          {
            DOM2Helper liaison =  (DOM2Helper)(Class.forName(liaisonClassName).newInstance());
            liaison.parse(inputSource);
            if(null != m_diagnosticsPrintWriter)
              displayDuration("Parse of "+xmlIdentifier, xmlIdentifier);
            sourceTree = liaison.getDocument();
          }
          else
          {      
            XMLReader reader = XMLReaderFactory.createXMLReader();        
            try
            {
              reader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
            }
            catch(SAXException se)
            {
            // What can we do?
            // TODO: User diagnostics.
            }
          
            // Get the input content handler, which will handle the 
            // parse events and create the source tree.          
            //StylesheetHandler inputHandler = (StylesheetHandler)m_processor.getTemplatesBuilder();
            //reader.setContentHandler( inputHandler );
            
            SourceTreeHandler handler = new SourceTreeHandler();
            reader.setContentHandler(handler);
            reader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
          
            // Kick off the parse.  When the ContentHandler gets 
            // the startDocument event, it will call transformNode( node ).
            reader.parse( inputSource );
            sourceTree = handler.getRoot();
          }
        }
        catch(Exception e)
        {
          // Unwrap exception
          if((e instanceof SAXException) && (null != ((SAXException)e).getException()))
          {
            // ((SAXException)e).getException().printStackTrace();
            e = ((SAXException)e).getException();
          }
          sourceTree = null; // shutup compiler
          error(XSLTErrorResources.ER_COULDNT_PARSE_DOC, new Object[] {xmlIdentifier}, e); //"Could not parse "+xmlIdentifier+" document!", e);
        }
      }
  
      return sourceTree;
    }
  
    /**
     * Reset the state of the XSL processor by reading in a new
     * XSL stylesheet.
     * @param xslURLString a valid URI to an XSL stylesheet.
     * @param outDiagnostics The print stream to write diagnostics (may be null).
     */
    Stylesheet getStylesheetFromPIURL(String xslURLString, Node fragBase,
                                      String xmlBaseIdent, boolean isRoot)
      throws SAXException,
      MalformedURLException,
      FileNotFoundException,
      IOException
    {
      StylesheetRoot m_stylesheetRoot = null;
      Stylesheet stylesheet = null;
      String[] stringHolder =
      {
        null};
      xslURLString = xslURLString.trim();
      int fragIndex = xslURLString.indexOf('#');
      Document stylesheetDoc;
      if(fragIndex == 0)
      {
        diag("Locating stylesheet from fragment identifier...");
        String fragID = xslURLString.substring(1);
        
        // Try a bunch of really ugly stuff to find the fragment.
        // What's the right way to do this?
  
        // Create a XPath parser.
        XPathParser parser = new XPathParser();
        XPathContext xpathContext = new XPathContext();
        PrefixResolverDefault nsNode = new PrefixResolverDefault(fragBase); //xpathContext.getNamespaceContext();
  
        // Create the XPath object.
        XPath xpath = new XPath(fragID, null, nsNode, XPath.MATCH);
        Compiler compiler = new Compiler();
        // Parse the xpath
        parser.initXPath(compiler, "id("+fragID+")", nsNode);
        XObject xobj = xpath.execute(xpathContext, fragBase, nsNode);
  
        NodeIterator nl = xobj.nodeset();
        if(nl.nextNode() == null)
        {
          // xobj = Stylesheet.evalXPathStr(getExecContext(), "//*[@id='"+fragID+"']", fragBase, nsNode);
          // Create the XPath object.
          xpath = new XPath(fragID, null, nsNode, XPath.MATCH);
  
          // Parse the xpath
          parser.initXPath(compiler, "//*[@id='"+fragID+"']", nsNode);
          xobj = xpath.execute(xpathContext, fragBase, nsNode);
  
          nl = xobj.nodeset();
          if(nl.nextNode() == null)
          {
            // xobj = Stylesheet.evalXPathStr(getExecContext(), "//*[@name='"+fragID+"']", fragBase, nsNode);
            // Create the XPath object.
            xpath = new XPath(fragID, null, nsNode, XPath.MATCH);
  
            // Parse the xpath
            parser.initXPath(compiler, "//*[@name='"+fragID+"']", nsNode);
            xobj = xpath.execute(xpathContext, fragBase, nsNode);
            nl = xobj.nodeset();
            if(nl.nextNode() == null)
            {
              // Well, hell, maybe it's an XPath...
              // xobj = Stylesheet.evalXPathStr(getExecContext(), fragID, fragBase, nsNode);
              // Create the XPath object.
              //((StylesheetHandler)( m_processor.getTemplatesBuilder())).getLocator()
              xpath = new XPath(fragID, null, nsNode, XPath.MATCH);
  
              // Parse the xpath
              parser.initXPath(compiler, fragID, nsNode);
              xobj = xpath.execute(xpathContext, fragBase, nsNode);
              nl = xobj.nodeset();
            }
          }
        }
        if(nl.nextNode() == null)
        {
          error(XSLTErrorResources.ER_COULDNT_FIND_FRAGMENT, new Object[] {fragID}); //"Could not find fragment: "+fragID);
        }
        // Use previous because the previous call moved the pointer.
        // or should we use getRoot??
        Node frag = nl.previousNode(); //.item(0);
  
        if(Node.ELEMENT_NODE == frag.getNodeType())
        {
          pushTime(frag);
          if(isRoot)
          {
            m_stylesheetRoot = createStylesheetRoot(stringHolder[0]);
            stylesheet = m_stylesheetRoot;
          }
          else
          {
            //stylesheet = new Stylesheet(m_stylesheetRoot);
            stylesheet = ((StylesheetHandler)(m_processor.getTemplatesBuilder())).getStylesheetRoot();
          }
          addTraceListenersToStylesheet();
  
          StylesheetHandler stylesheetProcessor
            = (StylesheetHandler)m_processor.getTemplatesBuilder();
             //new StylesheetHandler(m_processor);
          TreeWalker tw = new TreeWalker(stylesheetProcessor);
          tw.traverse(frag);
  
          displayDuration("Setup of "+xslURLString, frag);
        }
        else
        {
          stylesheetDoc = null;
          error(XSLTErrorResources.ER_NODE_NOT_ELEMENT, new Object[] {fragID}); //"Node pointed to by fragment identifier was not an element: "+fragID);
        }
      }
      else
      {
        // TODO: Use Reader here??
        // hmmm.. for now I'll rely on the XML parser to handle
        // fragment URLs.
        diag(XSLMessages.createMessage(XSLTErrorResources.WG_PARSING_AND_PREPARING, new Object[] {xslURLString})); //"========= Parsing and preparing "+xslURLString+" ==========");
        pushTime(xslURLString);
  
        if(isRoot)
        {
          m_stylesheetRoot = createStylesheetRoot(xslURLString);
          stylesheet = m_stylesheetRoot;
        }
        else
        {
          stylesheet = new Stylesheet(m_stylesheetRoot);
        }
        addTraceListenersToStylesheet();
  
        StylesheetHandler stylesheetProcessor
          = (StylesheetHandler)m_processor.getTemplatesBuilder();
           // new StylesheetHandler(this, stylesheet);
  
        URL xslURL = getURLFromString(xslURLString, xmlBaseIdent);
  
        XSLTInputSource inputSource = new XSLTInputSource(xslURL.toString());
        String liaisonClassName = System.getProperty("org.apache.xalan.source.liaison");
  
        if(null != liaisonClassName)
        {
          try{
            DOM2Helper liaison =  (DOM2Helper)(Class.forName(liaisonClassName).newInstance());
            liaison.parse(inputSource);
          }
          catch (ClassNotFoundException e1) 
          {
            throw new TransformException("XML Liaison class " + liaisonClassName +
              " specified but not found", e1);
          } 
          catch (IllegalAccessException e2) 
          {
            throw new TransformException("XML Liaison class " + liaisonClassName +
              " found but cannot be loaded", e2);
          } 
          catch (InstantiationException e3) 
          {
            throw new TransformException("XML Liaison class " + liaisonClassName +
              " loaded but cannot be instantiated (no empty public constructor?)",
              e3);
          } 
        }  
        //m_parserLiaison.setDocumentHandler(stylesheetProcessor);
        //m_parserLiaison.parse(inputSource);
  
        displayDuration("Parsing and init of "+xslURLString, xslURLString);
      }
      return stylesheet;
    }
  
          
    /**
     * Take a user string and try and parse XML, and also return 
     * the url.
     * @exception XSLProcessorException thrown if the active ProblemListener and XPathContext decide 
     * the error condition is severe enough to halt processing.
     */
    public static URL getURLFromString(String urlString, String base)
      throws SAXException 
    {
      String origURLString = urlString;
      String origBase = base;
      
      // System.out.println("getURLFromString - urlString: "+urlString+", base: "+base);
      Object doc;
      URL url = null;
      int fileStartType = 0;
      try
      {
        
        if(null != base)
        {
          if(base.toLowerCase().startsWith("file:/"))
          {
            fileStartType = 1;
          }
          else if(base.toLowerCase().startsWith("file:"))
          {
            fileStartType = 2;
          }
        }
        
        boolean isAbsoluteURL;
        
        // From http://www.ics.uci.edu/pub/ietf/uri/rfc1630.txt
        // A partial form can be distinguished from an absolute form in that the
        // latter must have a colon and that colon must occur before any slash
        // characters. Systems not requiring partial forms should not use any
        // unencoded slashes in their naming schemes.  If they do, absolute URIs
        // will still work, but confusion may result.
        int indexOfColon = urlString.indexOf(':');
        int indexOfSlash = urlString.indexOf('/');
        if((indexOfColon != -1) && (indexOfSlash != -1) && (indexOfColon < indexOfSlash))
        {
          // The url (or filename, for that matter) is absolute.
          isAbsoluteURL = true;
        }
        else
        {
          isAbsoluteURL = false;
        }
        
        if(isAbsoluteURL || (null == base) || (base.length() == 0))
        {
          try 
          {
            url = new URL(urlString);
          }
          catch (MalformedURLException e) {}
        }
        // The Java URL handling doesn't seem to handle relative file names.
        else if(!((urlString.charAt(0) == '.') || (fileStartType > 0)))
        {
          try 
          {
            URL baseUrl = new URL(base);
            url = new URL(baseUrl, urlString);
          }
          catch (MalformedURLException e) 
          {
          }
        }
        
        if(null == url)
        {
          // Then we're going to try and make a file URL below, so strip 
          // off the protocol header.
          if(urlString.toLowerCase().startsWith("file:/"))
          {
            urlString = urlString.substring(6);
          }
          else if(urlString.toLowerCase().startsWith("file:"))
          {
            urlString = urlString.substring(5);
          }
        }
        
        if((null == url) && ((null == base) || (fileStartType > 0)))
        {
          if(1 == fileStartType)
          {
            if(null != base)
              base = base.substring(6);
            fileStartType = 1;
          }
          else if(2 == fileStartType)
          {
            if(null != base)
              base = base.substring(5);
            fileStartType = 2;
          }
          
          File f = new File(urlString);
          
          if(!f.isAbsolute() && (null != base))
          {
            // String dir = f.isDirectory() ? f.getAbsolutePath() : f.getParent();
            // System.out.println("prebuiltUrlString (1): "+base);
            StringTokenizer tokenizer = new StringTokenizer(base, "\\/");
            String fixedBase = null;
            while(tokenizer.hasMoreTokens())
            {
              String token = tokenizer.nextToken();
              if (null == fixedBase) 
              {
                // Thanks to Rick Maddy for the bug fix for UNIX here.
                if (base.charAt(0) == '\\' || base.charAt(0) == '/') 
                {
                  fixedBase = File.separator + token;
                }
                else 
                {
                  fixedBase = token;
                }
              }
              else 
              {
                fixedBase+= File.separator + token;
              }
            }
            // System.out.println("rebuiltUrlString (1): "+fixedBase);
            f = new File(fixedBase);
            String dir = f.isDirectory() ? f.getAbsolutePath() : f.getParent();
            // System.out.println("dir: "+dir);
            // System.out.println("urlString: "+urlString);
            // f = new File(dir, urlString);
            // System.out.println("f (1): "+f.toString());
            // urlString = f.getAbsolutePath();
            f = new File(urlString); 
            boolean isAbsolute =  f.isAbsolute() 
                                  || (urlString.charAt( 0 ) == '\\')
                                  || (urlString.charAt( 0 ) == '/');
            if(!isAbsolute)
            {
              // Getting more and more ugly...
              if(dir.charAt( dir.length()-1 ) != File.separator.charAt(0) && 
                 urlString.charAt( 0 ) != File.separator.charAt(0))
              {
                urlString = dir + File.separator + urlString;
              }
              else
              {
                urlString = dir + urlString;
              }
  
              // System.out.println("prebuiltUrlString (2): "+urlString);
              tokenizer = new StringTokenizer(urlString, "\\/");
              String rebuiltUrlString = null;
              while(tokenizer.hasMoreTokens())
              {
                String token = tokenizer.nextToken();
                if (null == rebuiltUrlString) 
                {
                  // Thanks to Rick Maddy for the bug fix for UNIX here.
                  if (urlString.charAt(0) == '\\' || urlString.charAt(0) == '/') 
                  {
                    rebuiltUrlString = File.separator + token;
                  }
                  else 
                  {
                    rebuiltUrlString = token;
                  }
                }
                else 
                {
                  rebuiltUrlString+= File.separator + token;
                }
              }
              // System.out.println("rebuiltUrlString (2): "+rebuiltUrlString);
              if(null != rebuiltUrlString)
                urlString = rebuiltUrlString;
            }
            // System.out.println("fileStartType: "+fileStartType);
            if(1 == fileStartType)
            {
              if (urlString.charAt(0) == '/') 
              {
                urlString = "file://"+urlString;
              }
              else
              {
                urlString = "file:/"+urlString;
              }
            }
            else if(2 == fileStartType)
            {
              urlString = "file:"+urlString;
            }
            try 
            {
              // System.out.println("Final before try: "+urlString);
              url = new URL(urlString);
            }
            catch (MalformedURLException e) 
            {
              // System.out.println("Error trying to make URL from "+urlString);
            }
          }
        }
        if(null == url)
        {
          // The sun java VM doesn't do this correctly, but I'll 
          // try it here as a second-to-last resort.
          if((null != origBase) && (origBase.length() > 0))
          {
            try 
            {
              URL baseURL = new URL(origBase);
              // System.out.println("Trying to make URL from "+origBase+" and "+origURLString);
              url = new URL(baseURL, origURLString);
              // System.out.println("Success! New URL is: "+url.toString());
            }
            catch (MalformedURLException e) 
            {
              // System.out.println("Error trying to make URL from "+origBase+" and "+origURLString);
            }
          }
          
          if(null == url)
          {
            try 
            {
              String lastPart;
              if(null != origBase)
              {
                File baseFile = new File(origBase);
                if(baseFile.isDirectory())
                {
                  lastPart = new File(baseFile, urlString).getAbsolutePath ();
                }
                else
                {
                  String parentDir = baseFile.getParent();
                  lastPart = new File(parentDir, urlString).getAbsolutePath ();
                }
              }
              else
              {
                lastPart = new File (urlString).getAbsolutePath ();
              }
              // Hack
              // if((lastPart.charAt(0) == '/') && (lastPart.charAt(2) == ':'))
              //   lastPart = lastPart.substring(1, lastPart.length() - 1);
              
              String fullpath;
              if (lastPart.charAt(0) == '\\' || lastPart.charAt(0) == '/') 
              {
                fullpath = "file://" + lastPart;
              }
              else
              {
                fullpath = "file:" + lastPart;
              }
              url = new URL(fullpath);
            }
            catch (MalformedURLException e2)
            {
              throw new SAXException("Cannot create url for: " + urlString, e2 ); 
                //XSLMessages.createXPATHMessage(XPATHErrorResources.ER_CANNOT_CREATE_URL, new Object[]{urlString}),e2); //"Cannot create url for: " + urlString, e2 );
            }
          }
        }
      }
      catch(SecurityException se)
      {
        try
        {
          url = new URL("http://xml.apache.org/xslt/"+java.lang.Math.random()); // dummy
        }
        catch (MalformedURLException e2)
        {
          // I give up
        }
      }
      // System.out.println("url: "+url.toString());
      return url;
    }
  
     /**
     * Add a trace listener for the purposes of debugging and diagnosis.
     * @param tl Trace listener to be added.
     */
    void addTraceListenersToStylesheet()
      throws SAXException
    {
      /*try
      {
        TraceManager tm = m_transformerImpl.getTraceManager();
        if(tm.hasTraceListeners)
        {
          int nListeners = tm.size();
          for(int i = 0; i < nListeners; i++)
          {
            TraceListener tl = (TraceListener)m_traceListeners.elementAt(i);
            if(null != m_stylesheetRoot)
              m_stylesheetRoot.addTraceListener(tl);
          }
        }
      }
      catch(TooManyListenersException tmle)
      {
        throw new SAXException(XSLMessages.createMessage(XSLTErrorResources.ER_TOO_MANY_LISTENERS, null),tmle ); //"addTraceListenersToStylesheet - TooManyListenersException", tmle);
      }*/
    }
    
    /**
     * Warn the user of an problem.
     * This is public for access by extensions.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void message(String msg)
      throws SAXException
    {
      message(null, null, msg);
    }
  
  
  
    /**
     * Warn the user of an problem.
     * This is public for access by extensions.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void message(Node styleNode, Node sourceNode, String msg)
      throws SAXException
    {
      //boolean shouldThrow = m_processor.getErrorHandler().message(msg);
      //if(shouldThrow)
      //{
      //  throw new XSLProcessorException(msg);
      //}
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Warn the user of an problem.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void warn(int msg)
      throws SAXException
    {
      warn(null, null, msg, null);
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Warn the user of an problem.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void warn(int msg, Object[] args)
      throws SAXException
    {
      warn(null, null, msg, args);
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Warn the user of an problem.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void warn(Node styleNode, Node sourceNode, int msg)
      throws SAXException
    {
      warn(styleNode, sourceNode, msg, null);
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Warn the user of an problem.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void warn(Node styleNode, Node sourceNode, int msg, Object args[])
      throws SAXException
    {
      Exception e = null;
      String fmsg = m_XSLMessages.createWarning(msg, args);
      Locator locator = ((StylesheetHandler)(m_processor.getTemplatesBuilder())).getLocator();
      
      ErrorHandler handler = m_processor.getErrorHandler ();
      ProcessorException pe = (null == e) ? new ProcessorException(fmsg, locator) :
                                            new ProcessorException(fmsg, locator, e);
      if(null != handler)
        handler.warning(pe);
      else
        throw pe;
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Tell the user of an error, and probably throw an
     * exception.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void error(String msg)
      throws SAXException
    {
      Exception e = null;
      Locator locator = ((StylesheetHandler)(m_processor.getTemplatesBuilder())).getLocator();
      
      ErrorHandler handler = m_processor.getErrorHandler ();
      ProcessorException pe = (null == e) ? new ProcessorException(msg, locator) :
                                            new ProcessorException(msg, locator, e);
      if(null != handler)
        handler.fatalError(pe);
      else
        throw pe;
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Tell the user of an error, and probably throw an
     * exception.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void error(int msg)
      throws SAXException
    {
      error(null, null, msg, null);
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Tell the user of an error, and probably throw an
     * exception.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void error(int msg, Object[] args)
      throws SAXException
    {
      error(null, null, msg, args);
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Tell the user of an error, and probably throw an
     * exception.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void error(int msg, Exception e)
      throws SAXException
    {
      error(msg, null, e);
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Tell the user of an error, and probably throw an
     * exception.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void error(int msg, Object args[], Exception e)
      throws SAXException
    {
      String fmsg = m_XSLMessages.createMessage(msg, args);
      Locator locator = ((StylesheetHandler)(m_processor.getTemplatesBuilder())).getLocator();
      
      ErrorHandler handler = m_processor.getErrorHandler ();
      ProcessorException pe = (null == e) ? new ProcessorException(fmsg, locator) :
                                            new ProcessorException(fmsg, locator, e);
      if(null != handler)
        handler.fatalError(pe);
      else
        throw pe;
    }
  
    /**
      * <meta name="usage" content="internal"/>
    * Tell the user of an error, and probably throw an
     * exception.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void error(Node styleNode, Node sourceNode, int msg)
      throws SAXException
    {
      error(styleNode, sourceNode, msg, null);
    }
  
    /**
     * <meta name="usage" content="internal"/>
     * Tell the user of an error, and probably throw an
     * exception.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void error(Node styleNode, Node sourceNode, int msg, Object args[])
      throws SAXException
    {
      Exception e = null;
      String fmsg = m_XSLMessages.createMessage(msg, args);
      Locator locator = ((StylesheetHandler)(m_processor.getTemplatesBuilder())).getLocator();
      
      ErrorHandler handler = m_processor.getErrorHandler ();
      ProcessorException pe = (null == e) ? new ProcessorException(fmsg, locator) :
                                            new ProcessorException(fmsg, locator, e);
      if(null != handler)
        handler.fatalError(pe);
      else
        throw pe;
      
     
    }
    
    /**
     * Mark the time, so that displayDuration can later
     * display the elapse.
     */
    void pushTime(Object key)
    {
      if(null != key)
      {
        m_durationsTable.put(key, new Long(System.currentTimeMillis()));
      }
    }
  
    /**
     * Returns the duration since pushTime was called,
     * in milliseconds.
     */
    long popDuration(Object key)
    {
      long millisecondsDuration = 0;
      if(null != key)
      {
        long start = ((Long)m_durationsTable.get(key)).longValue();
        long stop = System.currentTimeMillis();
        millisecondsDuration = stop - start;
        m_durationsTable.remove(key);
      }
      return millisecondsDuration;
    }
    
     /**
     * Display the duration since pushTime was called.
     */
    protected void displayDuration(String info, Object key)
    {
      long millisecondsDuration = 0;
      if(null != key)
      {
        Date date1 = (Date)m_durationsTable.get(key);
        Date date2 = new Date();
        millisecondsDuration = date2.getTime() - date1.getTime();
        if(null != m_diagnosticsPrintWriter)
        {
          m_diagnosticsPrintWriter.println(info + " took " + millisecondsDuration + " milliseconds");
        }
        m_durationsTable.remove(key);
      }
    }
    
    /**
     * If this is set, diagnostics will be
     * written to the m_diagnosticsPrintWriter stream. If
     * the value is null, then diagnostics will be turned
     * off.
     */
    public void setDiagnosticsOutput(java.io.OutputStream out)
    {
      setDiagnosticsOutput(new PrintWriter(out));
    }
  
    /**
     * If this is set, diagnostics will be
     * written to the m_diagnosticsPrintWriter stream. If
     * the value is null, then diagnostics will be turned
     * off.
     */
    public void setDiagnosticsOutput(java.io.PrintWriter pw)
    {
      m_diagnosticsPrintWriter = pw;
     /* if(getProblemListener() instanceof ProblemListenerDefault)
      {
        ((ProblemListenerDefault)getProblemListener()).setDiagnosticsOutput(pw);
      }*/
    }
  
    /**
     * Bottleneck output of diagnostics.
     */
    protected void diag(String s)
    {
      if(null != m_diagnosticsPrintWriter)
      {
        m_diagnosticsPrintWriter.println(s);
      }
    }
  
    /**
     * If this is set to true, simple traces of
     * template calls are made.
     */
    public void setTraceTemplates(boolean b)
    {
      m_traceTemplates = b;
    }
  
    /**
     * If this is set to true, simple traces of
     * template calls are made.
     */
    public void setTraceSelect(boolean b)
    {
      m_traceSelects = b;
    }
  
    /**
     * If this is set to true, debug diagnostics about
     * template children as they are being constructed
     * will be written to the m_diagnosticsPrintWriter
     * stream.  diagnoseTemplateChildren is false by
     * default.
     */
    public void setTraceTemplateChildren(boolean b)
    {
      m_traceTemplateChildren = b;
    }
    
    //
    // Lexical handler interface
    //
  
      /**
       * Report the start of DTD declarations, if any.
       *
       * <p>Any declarations are assumed to be in the internal subset
       * unless otherwise indicated by a {@link #startEntity startEntity}
       * event.</p>
       *
       * <p>Note that the start/endDTD events will appear within
       * the start/endDocument events from ContentHandler and
       * before the first startElement event.</p>
       *
       * @param name The document type name.
       * @param publicId The declared public identifier for the
       *        external DTD subset, or null if none was declared.
       * @param systemId The declared system identifier for the
       *        external DTD subset, or null if none was declared.
       * @exception SAXException The application may raise an
       *            exception.
       * @see #endDTD
       * @see #startEntity
       */
      public void startDTD (String name, String publicId, String systemId)
  	throws SAXException
      {
        if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
          m_transformerImpl.getInputLexicalHandler().startDTD(name, publicId, systemId);
      }
  
  
      /**
       * Report the end of DTD declarations.
       *
       * @exception SAXException The application may raise an exception.
       * @see #startDTD
       */
      public void endDTD ()
  	throws SAXException
      {
        if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
          m_transformerImpl.getInputLexicalHandler().endDTD();
      }
      
      public void startEntity (String name)
  	throws SAXException
      {
        if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
          m_transformerImpl.getInputLexicalHandler().startEntity (name);
      }
  
  
      /**
       * Report the end of an entity.
       *
       * @param name The name of the entity that is ending.
       * @exception SAXException The application may raise an exception.
       * @see #startEntity
       */
      public void endEntity (String name)
  	throws SAXException
        {
        if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
          m_transformerImpl.getInputLexicalHandler().endEntity (name);
      }
  
  
      /**
       * Report the start of a CDATA section.
       *
       * <p>The contents of the CDATA section will be reported through
       * the regular {@link org.xml.sax.ContentHandler#characters
       * characters} event.</p>
       *
       * @exception SAXException The application may raise an exception.
       * @see #endCDATA
       */
      public  void startCDATA ()
  	throws SAXException
      { 
        if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
          m_transformerImpl.getInputLexicalHandler().startCDATA();
      }
  
  
      /**
       * Report the end of a CDATA section.
       *
       * @exception SAXException The application may raise an exception.
       * @see #startCDATA
       */
      public void endCDATA ()
  	throws SAXException
      {
        if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
          m_transformerImpl.getInputLexicalHandler().endCDATA();
      }
  
  
      /**
       * Report an XML comment anywhere in the document.
       *
       * <p>This callback will be used for comments inside or outside the
       * document element, including comments in the external DTD
       * subset (if read).</p>
       *
       * @param ch An array holding the characters in the comment.
       * @param start The starting position in the array.
       * @param length The number of characters to use from the array.
       * @exception SAXException The application may raise an exception.
       */
      public  void comment (char ch[], int start, int length)
  	throws SAXException
        {
        if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
          m_transformerImpl.getInputLexicalHandler().comment (ch, start, length);
      }
      
      // DocumentHandler interface
      
          /**
       * Receive an object for locating the origin of SAX document events.
       *
       * <p>SAX parsers are strongly encouraged (though not absolutely
       * required) to supply a locator: if it does so, it must supply
       * the locator to the application by invoking this method before
       * invoking any of the other methods in the DocumentHandler
       * interface.</p>
       *
       * <p>The locator allows the application to determine the end
       * position of any document-related event, even if the parser is
       * not reporting an error.  Typically, the application will
       * use this information for reporting its own errors (such as
       * character content that does not match an application's
       * business rules).  The information returned by the locator
       * is probably not sufficient for use with a search engine.</p>
       *
       * <p>Note that the locator will return correct information only
       * during the invocation of the events in this interface.  The
       * application should not attempt to use it at any other time.</p>
       *
       * @param locator An object that can return the location of
       *                any SAX document event.
       * @see org.xml.sax.Locator
       */
      public void setDocumentLocator (Locator locator)
      {}
      
      
      /**
       * Receive notification of the beginning of a document.
       *
       * <p>The SAX parser will invoke this method only once, before any
       * other methods in this interface or in DTDHandler (except for
       * setDocumentLocator).</p>
       *
       * @exception org.xml.sax.SAXException Any SAX exception, possibly
       *            wrapping another exception.
       */
      public void startDocument ()
  	throws SAXException
      {
        if (m_documentHandler != null)
          m_documentHandler.startDocument();
        else if (m_transformerImpl != null)
          m_transformerImpl.getInputContentHandler().startDocument();
        //m_transformerImpl.getResultTreeHandler().startDocument();
      }
      
      
      /**
       * Receive notification of the end of a document.
       *
       * <p>The SAX parser will invoke this method only once, and it will
       * be the last method invoked during the parse.  The parser shall
       * not invoke this method until it has either abandoned parsing
       * (because of an unrecoverable error) or reached the end of
       * input.</p>
       *
       * @exception org.xml.sax.SAXException Any SAX exception, possibly
       *            wrapping another exception.
       */
      public void endDocument ()
  	throws SAXException
      {
        if (m_documentHandler != null)
          m_documentHandler.endDocument();
        else if (m_transformerImpl != null)
          m_transformerImpl.getInputContentHandler().endDocument();
        //m_transformerImpl.getResultTreeHandler().endDocument();
      }
      
      
      /**
       * Receive notification of the beginning of an element.
       *
       * <p>The Parser will invoke this method at the beginning of every
       * element in the XML document; there will be a corresponding
       * endElement() event for every startElement() event (even when the
       * element is empty). All of the element's content will be
       * reported, in order, before the corresponding endElement()
       * event.</p>
       *
       * <p>If the element name has a namespace prefix, the prefix will
       * still be attached.  Note that the attribute list provided will
       * contain only attributes with explicit values (specified or
       * defaulted): #IMPLIED attributes will be omitted.</p>
       *
       * @param name The element type name.
       * @param atts The attributes attached to the element, if any.
       * @exception org.xml.sax.SAXException Any SAX exception, possibly
       *            wrapping another exception.
       * @see #endElement
       * @see org.xml.sax.AttributeList 
       */
      public void startElement (String name, AttributeList atts)
  	throws SAXException
      {
        if (m_documentHandler != null)
          m_documentHandler.startElement(name, atts);
        else if (m_transformerImpl != null)
        {
          int index = name.indexOf(":");
          if (index < 0 )
            m_transformerImpl.getInputContentHandler().startElement(null, name, name, (Attributes)atts);
            //getResultTreeHandler().startElement(null, name, name, (Attributes)atts);
          else
            m_transformerImpl.getInputContentHandler().startElement(name.substring(0,index), name.substring(index+1), name, (Attributes)atts);        
          //m_transformerImpl.getResultTreeHandler().startElement(name.substring(0,index), name.substring(index+1), name, (Attributes)atts);
        }  
      }   
      
      /**
       * Receive notification of the end of an element.
       *
       * <p>The SAX parser will invoke this method at the end of every
       * element in the XML document; there will be a corresponding
       * startElement() event for every endElement() event (even when the
       * element is empty).</p>
       *
       * <p>If the element name has a namespace prefix, the prefix will
       * still be attached to the name.</p>
       *
       * @param name The element type name
       * @exception org.xml.sax.SAXException Any SAX exception, possibly
       *            wrapping another exception.
       */
      public void endElement (String name)
  	throws SAXException
      {
        if (m_documentHandler != null)
          m_documentHandler.endElement(name);
        else if (m_transformerImpl != null)
        {
          int index = name.indexOf(":");
          if (index < 0 )
            m_transformerImpl.getInputContentHandler().endElement(null, name, name);
            //m_transformerImpl.getResultTreeHandler().endElement(null, name, name);        
          else
            m_transformerImpl.getInputContentHandler().endElement(name.substring(0,index), name.substring(index+1), name);
            //m_transformerImpl.getResultTreeHandler().endElement(name.substring(0,index), name.substring(index+1), name);
        }  
      }     
      
      
      /**
       * Receive notification of character data.
       *
       * <p>The Parser will call this method to report each chunk of
       * character data.  SAX parsers may return all contiguous character
       * data in a single chunk, or they may split it into several
       * chunks; however, all of the characters in any single event
       * must come from the same external entity, so that the Locator
       * provides useful information.</p>
       *
       * <p>The application must not attempt to read from the array
       * outside of the specified range.</p>
       *
       * <p>Note that some parsers will report whitespace using the
       * ignorableWhitespace() method rather than this one (validating
       * parsers must do so).</p>
       *
       * @param ch The characters from the XML document.
       * @param start The start position in the array.
       * @param length The number of characters to read from the array.
       * @exception org.xml.sax.SAXException Any SAX exception, possibly
       *            wrapping another exception.
       * @see #ignorableWhitespace 
       * @see org.xml.sax.Locator
       */
      public void characters (char ch[], int start, int length)
  	throws SAXException
      {
        if (m_documentHandler != null)
          m_documentHandler.characters(ch, start, length);
        else if (m_transformerImpl != null)
        m_transformerImpl.getInputContentHandler().characters(ch, start, length);
        //m_transformerImpl.getResultTreeHandler().characters(ch, start, length);
      }  
      
      
      /**
       * Receive notification of ignorable whitespace in element content.
       *
       * <p>Validating Parsers must use this method to report each chunk
       * of ignorable whitespace (see the W3C XML 1.0 recommendation,
       * section 2.10): non-validating parsers may also use this method
       * if they are capable of parsing and using content models.</p>
       *
       * <p>SAX parsers may return all contiguous whitespace in a single
       * chunk, or they may split it into several chunks; however, all of
       * the characters in any single event must come from the same
       * external entity, so that the Locator provides useful
       * information.</p>
       *
       * <p>The application must not attempt to read from the array
       * outside of the specified range.</p>
       *
       * @param ch The characters from the XML document.
       * @param start The start position in the array.
       * @param length The number of characters to read from the array.
       * @exception org.xml.sax.SAXException Any SAX exception, possibly
       *            wrapping another exception.
       * @see #characters
       */
      public void ignorableWhitespace (char ch[], int start, int length)
  	throws SAXException
      {
        if (m_documentHandler != null)
          m_documentHandler.ignorableWhitespace(ch, start, length);
        else if (m_transformerImpl != null)
        m_transformerImpl.getInputContentHandler().ignorableWhitespace(ch, start, length);
        //m_transformerImpl.getResultTreeHandler().ignorableWhitespace(ch, start, length);
      }
      
      
      /**
       * Receive notification of a processing instruction.
       *
       * <p>The Parser will invoke this method once for each processing
       * instruction found: note that processing instructions may occur
       * before or after the main document element.</p>
       *
       * <p>A SAX parser should never report an XML declaration (XML 1.0,
       * section 2.8) or a text declaration (XML 1.0, section 4.3.1)
       * using this method.</p>
       *
       * @param target The processing instruction target.
       * @param data The processing instruction data, or null if
       *        none was supplied.
       * @exception org.xml.sax.SAXException Any SAX exception, possibly
       *            wrapping another exception.
       */
      public  void processingInstruction (String target, String data)
  	throws SAXException
      {
        if (m_documentHandler != null)
          m_documentHandler.processingInstruction(target, data);
        else if (m_transformerImpl != null)
        m_transformerImpl.getInputContentHandler().processingInstruction(target, data);
        //m_transformerImpl.getResultTreeHandler().processingInstruction(target, data);
      }
      
      // Implement XSLTProcessor
      
      /**
     * Set the output stream. Required when the XSLTProcessor is being used
     * as a SAX DocumentHandler.
     */
    public void setOutputStream(java.io.OutputStream os)
    {
      //serializer.setOutputStream(os);
    }
    
    /**
     * Convenience function to create an XString.
     * @param s A valid string.
     * @return An XString object.
     */
    public XString createXString(String s)
    {
      return new XString(s);
    }
  
    /**
     * Convenience function to create an XObject.
     * @param o Any java object.
     * @return An XObject object.
     */
    public XObject createXObject(Object o)
    {
      return new XObject(o);
    }
  
    /**
     * Convenience function to create an XNumber.
     * @param d Any double number.
     * @return An XNumber object.
     */
    public XNumber createXNumber(double d)
    {
      return new XNumber(d);
    }
  
    /**
     * Convenience function to create an XBoolean.
     * @param b boolean value.
     * @return An XBoolean object.
     */
    public XBoolean createXBoolean(boolean b)
    {
      return new XBoolean(b);
    }
  
    /**
     * Convenience function to create an XNodeSet.
     * @param nl A NodeList object.
     * @return An XNodeSet object.
     */
    public XNodeSet createXNodeSet(NodeList nl)
    {
      return new XNodeSet((NodeIterator)nl);
    }
  
    /**
     * Convenience function to create an XNodeSet from a node.
     * @param n A DOM node.
     * @return An XNodeSet object.
     */
    public XNodeSet createXNodeSet(Node n)
    {
      return new XNodeSet(n);
    }
  
    /**
     * Convenience function to create an XNull.
     * @return An XNull object.
     */
    public XNull createXNull()
    {
      return new XNull();
    }
    
    /**
     * Get the XMLParserLiaison that this processor uses.
     */
    public XMLParserLiaison getXMLProcessorLiaison()
    {
      return (XMLParserLiaison)m_liaison;
    }
  
    /**
     * Get the preferred stylesheet for the XSLTInputSource XML document,
     * as identified by the xml-stylesheet PI, and matching the media and
     * charset criteria. See {@link http://www.w3.org/TR/xml-stylesheet/
     * Associating Style Sheets with XML documents}
     * Does not yet handle the LINK REL="stylesheet" syntax.
     *
     * @param media The media attribute to be matched.  May be null, in which
     *              case the prefered stylesheet will be used (i.e., alternate = no).
     * @param title The value of the title attribute to match.  May be null.
     * @param charset The value of the charset attribute to match.  May be null.
     * @returns StylesheetSpec extends XSLTInputSource extedns SAX InputSource; the return value
     * can be passed to the processStylesheet method.
     */
    public StylesheetSpec getAssociatedStylesheet(XSLTInputSource source,
                                                        String media,
                                                        String charset)
      throws SAXException
    {
      InputSource[]in = m_processor.getAssociatedStylesheets(source, media, null, charset);
      if (in.length >0)
        return (StylesheetSpec)in[0];
      else 
        return null; 
    }
  
    /**
     * Get a list of stylesheet specifications for the XSLTInputSource XML document,
     * as identified by the xml-stylesheet PI, and matching the media and
     * charset criteria. See {@link http://www.w3.org/TR/xml-stylesheet/
     * Associating Style Sheets with XML documents}.
     * Does not yet handle the LINK REL="stylesheet" syntax.
     *
     * @param media The media attribute to be matched.  May be null, in which
     *              case the prefered stylesheet will be used (i.e., alternate = no).
     * @param title The value of the title attribute to match.  May be null.
     * @param charset The value of the charset attribute to match.  May be null.
     * @returns list of StylesheetSpecs (extend XSLTInputSources extend SAX InputSources; a
     * list member may be passsed to the processStylesheet method.
     */
    public Vector getAssociatedStylesheets(XSLTInputSource source,
                                                        String media,
                                                        String charset)
      throws SAXException
    {
      InputSource[]in = m_processor.getAssociatedStylesheets(source, media, null, charset);
      Vector v = new Vector();
      for (int i = 0; i< in.length; i++)
        v.addElement((StylesheetSpec)in[i]);
      return v;
    }
    
    /**
     * Submit a top-level stylesheet parameter.  This value can
     * be evaluated in the stylesheet via xsl:param-variable.
     * @param key The name of the param.
     * @param value An XObject that will be used.
     */
    public void setStylesheetParam(String key, XObject value)
    {
      if (m_transformerImpl != null)
        m_transformerImpl.setParameter(key, null, value);
      else
      {
        setParameter(key, value);
      }
    }
  
    /**
     * Set a top-level stylesheet parameter.  This value can
     * be evaluated via xsl:param-variable.  Note that the value
     * passed is an expression, and not a string.  This means that
     * setStylesheetParam("foo", "hello"); will look for the
     * element "hello".  If you want to pass a string, you'll
     * need to put quotes around it:
     * setStylesheetParam("foo", "'hello'"); will look for the
     * @param key The name of the param.
     * @param expression An expression that will be evaluated.
     */
    public void setStylesheetParam(String key, String expression)
    {
      if (m_transformerImpl != null)
        m_transformerImpl.setParameter(key, null, expression);
      else
      {
        setParameter(key, expression);
      }
    }
    
    /**
     * Set a top-level stylesheet parameter.  This value can
     * be evaluated via xsl:param-variable.  Note that the value
     * passed is an expression, and not a string.  This means that
     * setStylesheetParam("foo", "hello"); will look for the
     * element "hello".  If you want to pass a string, you'll
     * need to put quotes around it:
     * setStylesheetParam("foo", "'hello'"); will look for the
     * @param key The name of the param.
     * @param expression An expression that will be evaluated.
     */
    public void setParameter(String key,  Object value)
    {
      if (m_stylesheetParams == null)
        m_stylesheetParams = new Hashtable();
      m_stylesheetParams.put(key, value); 
    }
  
    /**
     * Get the current FormatterListener (SAX DocumentHandler), or null if none has been set.
     */
    public DocumentHandler getFormatterListener()
    {
      return m_documentHandler;
      
    }
  
    /**
     * Set the FormatterListener (the SAX DocumentHandler).
     */
    public void setFormatterListener(DocumentHandler flistener)
    {
      m_documentHandler = flistener;
    }
  
    /**
     * Get the current SAX DocumentHandler (the same object as the FormatterListener), or null if none has been set.
     */
    public DocumentHandler getDocumentHandler()
    {
      return m_documentHandler;
    }
  
    /**
     * Set the current SAX DocumentHandler (the same
     * object as the FormatterListener).
     */
    public void setDocumentHandler(DocumentHandler listener)
    {
      //m_transformerImpl.setContentHandler();
      m_documentHandler = listener;
    }
  
    /**
     * Add a trace listener for the purposes of debugging and diagnosis.
     * @param tl Trace listener to be added.
     */
    public void addTraceListener(TraceListener tl)
      throws TooManyListenersException
    {
      if (m_transformerImpl != null)
        m_transformerImpl.getTraceManager().addTraceListener(tl);
    }
    
    /**
     * If set to true (the default), pattern conflict warnings are not printed to the diagnostics stream.
     * @param b true if conflict warnings should be suppressed.
     */
    public void setQuietConflictWarnings(boolean b)
    {
      if (m_transformerImpl != null)
        m_transformerImpl.setQuietConflictWarnings(b);
    }
  
    /**
     * Remove a trace listener.
     * @param tl Trace listener to be removed.
     */
    public void removeTraceListener(TraceListener tl)
    {
      if (m_transformerImpl != null)
        m_transformerImpl.getTraceManager().removeTraceListener(tl);
    }
    
    /**
     * Set the problem listener property.
     * The XSL class can have a single listener to be informed
     * of errors and warnings. The problem listener normally controls whether an exception
     * is thrown or not (or the problem listeners can throw its own RuntimeException).
     * @param l A ProblemListener interface.
     */
    public void setProblemListener(ProblemListener l)
    {
      m_problemListener = new ProblemListenerDefault(m_processor.getErrorHandler(), l);        
    }
  
    /**
     * Get the problem listener property.
     * The XSL class can have a single listener to be informed
     * of errors and warnings. The problem listener normally controls whether an exception
     * is thrown or not (or the problem listener can throw its own RuntimeException).
     * @return A ProblemListener interface.
     */
    public ProblemListener getProblemListener()
    {
      return m_problemListener.getProblemListener();
    }
    
    public StylesheetProcessor getProcessor()
    {
      return (StylesheetProcessor)m_processor;
    }  
  
  
    
  } // end XSLTEngineImpl class
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xslt/XSLTInputSource.java
  
  Index: XSLTInputSource.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xslt;
  
  import org.xml.sax.InputSource;
  import org.w3c.dom.Node;
  import java.io.InputStream;
  import java.io.Reader;
  
  /**
   * <meta name="usage" content="general"/>
   * Represents an XML source document or XSL stylesheet.
   * Use XSLTInputSource objects to provide input to the XSLTProcessor process() method
   * for a transformation. This class extends the SAX input source to handle
   * DOM nodes as input as well as files, character streams, byte streams and SAX DocumentHandlers.
   *
   * @see XSLTProcessor#process(XSLTInputSource, XSLTInputSource, XSLTResultTarget)
   */
  public class XSLTInputSource extends InputSource
  {
    /**
      * Zero-argument default constructor -- Before you can use the new XSLTInputSource object in a transformation,
      * you must define the document source with setSystemId(), setNode(), setByteStream(), or setCharacterStream().
      *
      * @see #setSystemId(String)
      * @see #setNode(Node)
      * @see #setByteStream
      * @see #setCharacterStream
      * @see #setEncoding(String)
      * @see #setPublicId(String)
      */
    public XSLTInputSource ()
    {
    }
  
    /**
      * Create a new input source with a system identifier (for a URL or file name) --
      * the equivalent of creating an input source with the zero-argument
      * constructor and setting the new object's SystemId property.
  
      * If the system identifier is a URL, it must be fully resolved.
      *
      * @param systemId The system identifier (URI).
      * @see #setSystemId(String)
      * @see #setNode(Node)
      * @see #setByteStream
      * @see #setEncoding(String)
      * @see #setCharacterStream
      * @see #setPublicId(String)
      */
    public XSLTInputSource (String systemId)
    {
      setSystemId(systemId);
    }
  
  
    /**
      * Create a new input source with a byte stream -- the equivalent of creating an input source
      * with the zero-argument constructor and setting the new object's ByteStream property.
      *
      * @param byteStream The raw byte stream containing the document.
      * @see #setByteStream
      * @see #setSystemId(String)
      * @see #setNode(Node)
      * @see #setEncoding(String)
      * @see #setCharacterStream
      * @see #setPublicId(String)
      */
    public XSLTInputSource (InputStream byteStream)
    {
      setByteStream(byteStream);
    }
  
    /**
      * Create a new input source with a character stream -- the equivalent of creating an input source
      * with the zero-argument constructor and setting the new object's CharacterStream property.
      * <p>The character stream shall not include a byte order mark.</p>
      *
      * @param characterStream The character stream containing the document.
      * @see #setCharacterStream
      * @see #setByteStream
      * @see #setSystemId(String)
      * @see #setNode(Node)
      * @see #setEncoding(String)
      * @see #setPublicId(String)
      */
    public XSLTInputSource (Reader characterStream)
    {
      setCharacterStream(characterStream);
    }
  
    /**
      * Create a new input source with a DOM Node -- the equivalent of creating an input source
      * with the zero-argument constructor and setting the new object's Node property.
      *
      * @param node The DOM Node containing the document.
      * @see #setNode(Node)
      * @see #setCharacterStream
      * @see #setByteStream
      * @see #setSystemId(String)
      * @see #setEncoding(String)
      * @see #setPublicId(String)
      */
    public XSLTInputSource (Node node)
    {
      setNode(node);
    }
  
    /**
      * Create a new XSLTInputSource source from a SAX input source.
      * This operation sets the ByteStream, CharacterStream, SystemId, PublicID, and Encoding properties.
      *
      * @param isource The SAX input source.
      * @see #setCharacterStream
      * @see #setByteStream
      * @see #setSystemId(String)
      * @see #setEncoding(String)
      * @see #setPublicId(String)
      * @see #setNode(Node)
      */
    public XSLTInputSource (InputSource isource)
    {
      this.setByteStream(isource.getByteStream());
      this.setCharacterStream(isource.getCharacterStream());
      this.setEncoding(isource.getEncoding());
      this.setPublicId(isource.getPublicId());
      this.setSystemId(isource.getSystemId());
    }
  
    /**
      * Set the DOM Node for this input source.
      *
      * @param characterStream The character stream containing the
      *        XML document or XSL stylesheet.
      * @see #XSLTInputSource(Node)
      * @see #getCharacterStream()
      * @see java.io.Reader
      */
    public void setNode (Node node)
    {
      this.node = node;
    }
  
    /**
      * Get the DOM Node for this input source.
      *
      * @return The DOM node containing the document, or null if none was supplied.
      * @see #XSLTInputSource(Node)
      * @see #setNode(Node)
      */
    public Node getNode ()
    {
      return node;
    }
  
    private Node node = null;
  
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xslt/XSLTProcessor.java
  
  Index: XSLTProcessor.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xslt;
  
  import java.util.TooManyListenersException;
  import java.util.Vector;
  
  import org.apache.xpath.objects.XObject;
  import org.apache.xpath.objects.XString;
  import org.apache.xpath.objects.XNodeSet;
  import org.apache.xpath.objects.XBoolean;
  import org.apache.xpath.objects.XNumber;
  import org.apache.xpath.objects.XNull;
  import org.apache.xalan.xpath.xml.XMLParserLiaison;
  import org.apache.xalan.xpath.xml.ProblemListener;
  
  import org.apache.xalan.templates.Stylesheet;
  //import org.apache.xalan.templates.StylesheetRoot;
  import org.apache.xalan.xslt.StylesheetSpec;
  import org.apache.xalan.trace.*;
  
  import org.w3c.dom.NodeList;
  import org.w3c.dom.Node;
  import org.xml.sax.DocumentHandler;
  import org.xml.sax.SAXException;
  import java.io.OutputStream;
  import java.io.UnsupportedEncodingException;
  import org.apache.xml.serialize.OutputFormat;
  import org.xml.sax.ext.LexicalHandler;
  
  /**
   * <meta name="usage" content="general"/>
   * The transformation processor -- use {@link org.apache.xalan.xslt.XSLTProcessorFactory} to instantiate an implementation of this interface.
   * It's the responsibility of the implementation (XSLTEngineImpl),
   * collaborating with a XMLParserLiaison, the DOM,
   * and the XPath engine, to transform a source tree
   * of nodes into a result tree according to instructions
   * and templates specified by a stylesheet tree.
   * Use the <code>process(...)</code> are the primary
   * public entry points.
   *
   * Look at the Process class main() method for
   * for an advanced usage example.
   *
   * <p>If you reuse the processor instance, you should call reset() between transformations.</p>
   */
  public interface XSLTProcessor extends DocumentHandler, LexicalHandler
  {
    /**
     * Use the XSL stylesheet to transform the XML input, placing the result in the result tree.
     * @param xmlSource  The XML input to be transformed.
     * @param xslStylesheet  The XSL stylesheet to be used for the transformation.  May be null if XML input
     * has an XSL stylesheet PI.
     * @param resultTree The tree where the result of the transformation is placed.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public void process( XSLTInputSource xmlSource,
                         XSLTInputSource xslStylesheet,
                         XSLTResultTarget resultTree)
      throws SAXException;
  
    /**
     * Compile the XSL stylesheet represented by an XSLTInputSource object into an internal representation,
     * and use it to set the XSLTProcessor Stylesheet property.
     * This operation is required if the XSLTProcessor is to function as a
     * SAX DocumentHandler.
     * If the Stylesheet property has already been set to non-null, this operation
     * calls reset() before a transformation is performed.
     *
     * @param stylesheetSource  The XSL stylesheet.
     * @return The compiled stylesheet object.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public StylesheetRoot processStylesheet(XSLTInputSource stylesheetSource)
      throws SAXException;
  
    /**
     * Given a URL to (or file name of) an XSL stylesheet,
     * Compile the stylesheet into an internal representation, and use it to
     * set the XSLTProcessor Stylesheet property.
     * This operation is required if the XSLTProcessor is to function as a
     * SAX DocumentHandler.
     * If the Stylesheet property has already been set to non-null, this operation
     * calls reset() before a transformation is performed.
     *
     * @param xsldocURLString  The URL to the XSL stylesheet.
     * @return The compiled stylesheet object.
     * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
     * the error condition is severe enough to halt processing.
     */
    public StylesheetRoot processStylesheet(String xsldocURLString)
      throws SAXException;
  
    /**
     * Set the output stream. Required when the XSLTProcessor is being used
     * as a SAX DocumentHandler.
     */
    public void setOutputStream(java.io.OutputStream os);
  
    /**
     * Reset the XSLTProcessor state.  Must be used after a process() call
     * if the XSLTProcessor instance is to be used again.
     */
    public void reset();
  
    /**
     * Get the DOM Node from the XSLTInputSource object. Returns null if the XSLTInputSource
     * object does not contain a Node (it may, for example, contain an input stream).
     */
    public Node getSourceTreeFromInput(XSLTInputSource inputSource)
      throws org.xml.sax.SAXException;
  
    /**
     * Use a compiled stylesheet to set the Stylesheet property for this processor.
     * When this property is set, the process method uses this stylesheet rather than
     * looking for a stylesheet PI if the stylesheet parameter is null.  Also required
     * if you are going to use the XSLTProcessor as a SAX DocumentHandler.
     */
    public void setStylesheet(StylesheetRoot stylesheetRoot);
  
    /**
     * Get the current Stylesheet setting for this XSLTProcessor.
     */
    public StylesheetRoot getStylesheet();
  
    /**
     * Get the XMLParserLiaison that this processor uses.
     */
    public XMLParserLiaison getXMLProcessorLiaison();
  
    /**
     * Get the preferred stylesheet for the XSLTInputSource XML document,
     * as identified by the xml-stylesheet PI, and matching the media and
     * charset criteria. See {@link http://www.w3.org/TR/xml-stylesheet/
     * Associating Style Sheets with XML documents}
     * Does not yet handle the LINK REL="stylesheet" syntax.
     *
     * @param media The media attribute to be matched.  May be null, in which
     *              case the prefered stylesheet will be used (i.e., alternate = no).
     * @param title The value of the title attribute to match.  May be null.
     * @param charset The value of the charset attribute to match.  May be null.
     * @returns StylesheetSpec extends XSLTInputSource extedns SAX InputSource; the return value
     * can be passed to the processStylesheet method.
     */
    public StylesheetSpec getAssociatedStylesheet(XSLTInputSource source,
                                                        String media,
                                                        String charset)
      throws SAXException;
  
    /**
     * Get a list of stylesheet specifications for the XSLTInputSource XML document,
     * as identified by the xml-stylesheet PI, and matching the media and
     * charset criteria. See {@link http://www.w3.org/TR/xml-stylesheet/
     * Associating Style Sheets with XML documents}.
     * Does not yet handle the LINK REL="stylesheet" syntax.
     *
     * @param media The media attribute to be matched.  May be null, in which
     *              case the prefered stylesheet will be used (i.e., alternate = no).
     * @param title The value of the title attribute to match.  May be null.
     * @param charset The value of the charset attribute to match.  May be null.
     * @returns list of StylesheetSpecs (extend XSLTInputSources extend SAX InputSources; a
     * list member may be passsed to the processStylesheet method.
     */
    public Vector getAssociatedStylesheets(XSLTInputSource source,
                                                        String media,
                                                        String charset)
      throws SAXException;
  
  
    /**
     * Convenience function to create an XString.
     * @param s A valid string.
     * @return An XString object.
     */
    public XString createXString(String s);
  
    /**
     * Convenience function to create an XObject.
     * @param o Any java object.
     * @return An XObject object.
     */
    public XObject createXObject(Object o);
  
    /**
     * Convenience function to create an XNumber.
     * @param d Any double number.
     * @return An XNumber object.
     */
    public XNumber createXNumber(double d);
  
    /**
     * Convenience function to create an XBoolean.
     * @param b boolean value.
     * @return An XBoolean object.
     */
    public XBoolean createXBoolean(boolean b);
  
    /**
     * Convenience function to create an XNodeSet.
     * @param nl A NodeList object.
     * @return An XNodeSet object.
     */
    public XNodeSet createXNodeSet(NodeList nl);
  
    /**
     * Convenience function to create an XNodeSet from a node.
     * @param n A DOM node.
     * @return An XNodeSet object.
     */
    public XNodeSet createXNodeSet(Node n);
  
    /**
     * Convenience function to create an XNull.
     * @return An XNull object.
     */
    public XNull createXNull();
  
    /**
     * Submit a top-level stylesheet parameter.  This value can
     * be evaluated in the stylesheet via xsl:param-variable.
     * @param key The name of the param.
     * @param value An XObject that will be used.
     */
    public void setStylesheetParam(String key, XObject value);
  
    /**
     * Set a top-level stylesheet parameter.  This value can
     * be evaluated via xsl:param-variable.  Note that the value
     * passed is an expression, and not a string.  This means that
     * setStylesheetParam("foo", "hello"); will look for the
     * element "hello".  If you want to pass a string, you'll
     * need to put quotes around it:
     * setStylesheetParam("foo", "'hello'"); will look for the
     * @param key The name of the param.
     * @param expression An expression that will be evaluated.
     */
    public void setStylesheetParam(String key, String expression);
  
    /**
     * Get the current FormatterListener (SAX DocumentHandler), or null if none has been set.
     */
    public DocumentHandler getFormatterListener();
  
    /**
     * Set the FormatterListener (the SAX DocumentHandler).
     */
    public void setFormatterListener(DocumentHandler flistener);
  
    /**
     * Get the current SAX DocumentHandler (the same object as the FormatterListener), or null if none has been set.
     */
    public DocumentHandler getDocumentHandler();
  
    /**
     * Set the current SAX DocumentHandler (the same
     * object as the FormatterListener).
     */
    public void setDocumentHandler(DocumentHandler listener);
  
    /**
     * Add a trace listener for the purposes of debugging and diagnosis.
     * @param tl Trace listener to be added.
     */
    public void addTraceListener(TraceListener tl)
      throws TooManyListenersException;
  
    /**
     * If set to true, template calls are traced.
     */
    public void setTraceTemplates(boolean b);
  
    /**
     * If set to true, selection events are traced.
     */
    public void setTraceSelect(boolean b);
  
    /**
     * If set to true (the default is false), as template children are being constructed, debug diagnostics
     * are written to the m_diagnosticsPrintWriter
     * stream.
     */
    public void setTraceTemplateChildren(boolean b);
  
    /**
     * If set to true (the default), pattern conflict warnings are not printed to the diagnostics stream.
     * @param b true if conflict warnings should be suppressed.
     */
    public void setQuietConflictWarnings(boolean b);
  
    /**
     * Remove a trace listener.
     * @param tl Trace listener to be removed.
     */
    public void removeTraceListener(TraceListener tl);
  
    /**
     * If set, diagnostics will be
     * written to the m_diagnosticsPrintWriter stream. If
     * null, diagnostics are turned off. This convenience method calls
     * {@link #setDiagnosticsOutput(java.io.PrintWriter)}.
     */
    public void setDiagnosticsOutput(java.io.OutputStream out);
  
    /**
     * If set, diagnostics will be
     * written to the m_diagnosticsPrintWriter stream. If
     * null, diagnostics are turned off.
     */
    public void setDiagnosticsOutput(java.io.PrintWriter pw);
  
    /**
     * Set the problem listener property.
     * The XSL class can have a single listener to be informed
     * of errors and warnings. The problem listener normally controls whether an exception
     * is thrown or not (or the problem listeners can throw its own RuntimeException).
     * @param l A ProblemListener interface.
     */
    public void setProblemListener(ProblemListener l);
  
    /**
     * Get the problem listener property.
     * The XSL class can have a single listener to be informed
     * of errors and warnings. The problem listener normally controls whether an exception
     * is thrown or not (or the problem listener can throw its own RuntimeException).
     * @return A ProblemListener interface.
     */
    public ProblemListener getProblemListener();
  
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xslt/XSLTProcessorFactory.java
  
  Index: XSLTProcessorFactory.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xslt;
  
  import org.apache.xalan.xpath.xml.XMLParserLiaison;
  import org.apache.xpath.XPathFactory;
  import trax.Processor;
  import trax.ProcessorFactoryException;
  import trax.Templates;
  import org.apache.xalan.utils.TreeWalker;
  
  /**
   * <meta name="usage" content="general"/>
   * Manufactures the processor for performing transformations. Use one of the static getProcessor methods
   * to create an XSLTProcessor object.
   */
  public class XSLTProcessorFactory
  {
    /**
     * Get a new XSLTProcessor with the default high-performance DTM (Document Table Model) liaison and XML parser.
     * <p><b>Note</b> If you want to process DOM Node input, use {@link #getProcessorUsingLiaisonName
     * getProcessorUsingLiaisonName("org.apache.xalan.xpath.xdom.XercesLiaison")}.</p>
     * @return An implentation of the XSLTProcessor interface with which you can perform transformations.
     * @see org.apache.xalan.xpath.dtm.DTMLiaison
     */
    public static XSLTProcessor getProcessor()
      throws org.xml.sax.SAXException
    {
      Processor processor = Processor.newInstance("xslt"); 
      return new XSLTEngineImpl(processor);
    }
  
    /**
     * Get a new XSLTProcessor that will use a given XMLParserLiaison class to interact with
     * a given XML parser. You can use this method, for example, if you are processing DOM Node input with
     * org.apache.xalan.xpath.xdom.XercesLiaison and the Xerces XML parser.
     * <p>If your input is in the form of
     * a file, character stream, byte stream, or SAX DocumentHandler, you may want to use the high-performance
     * DTM liaison and parser, in which case you can use the no-argument constructor.</p>
     * @param parserLiaisonClassName The name of the ParserLiaison class.
     * @return An implentation of the XSLTProcessor interface with which you can perform transformations.
     *
     * @see #getProcessor()
     * @see org.apache.xalan.xpath.xml.XMLParserLiaison
     * @see org.apache.xalan.xpath.dtm.DTMLiaison
     */
    public static XSLTProcessor getProcessorUsingLiaisonName(String parserLiaisonClassName)
      throws org.xml.sax.SAXException
    {
      //return new XSLTEngineImpl(parserLiaisonClassName);
      Processor processor = Processor.newInstance("xslt"); 
      return new XSLTEngineImpl(processor);
    }
  
    /**
     * Get a new XSLTProcessor that will use the specified XMLParserLiaison to interact
     * with a given XML parser. If your input is in the form of
     * a file, character stream, byte stream, or SAX DocumentHandler, you may want to use the high-performance
     * DTM liaison and parser, in which case you can use the no-argument getProcessor() method.
     *
     * @param parserLiaison the XMLParserLiaison set up to interact with a given XML parser.
     * @return An implentation of the XSLTProcessor interface with which you can perform transformations.
     *
     * @see #getProcessor()
     * @see org.apache.xalan.xpath.xml.XMLParserLiaison
     * @see org.apache.xalan.xpath.dtm.DTMLiaison
     */
    public static XSLTProcessor getProcessor(XMLParserLiaison parserLiaison)
    {
      //return new XSLTEngineImpl(parserLiaison);
      try{
        Processor processor = Processor.newInstance("xslt"); 
        return new XSLTEngineImpl(processor);
      }
      catch (ProcessorFactoryException pe)
      {
        return null;
      }
      catch (org.xml.sax.SAXException e)
      {
        return null;
      }
      
    }
  
    /**
     * Get a new XSLTProcessor that will use the specified XMLParserLiaison and XPathFactory to interact
     * with a given XML parser.  If your input is in the form of
     * a file, character stream, byte stream, or SAX DocumentHandler, you may want to use the high-performance
     * DTM liaison and parser, in which case you can use the no-argument getProcessor() method.
     *
     * @param parserLiaison the XMLParserLiaison set up to interact with a given XML parser.
     * @param xpathFactory A custom XPathFactory.
     * @return An implentation of the XSLTProcessor interface with which you
     * can perform transformations.
     *
     * @see #getProcessor()
     * @see org.apache.xalan.xpath.xml.XMLParserLiaison
     * @see org.apache.xalan.xpath.dtm.DTMLiaison
     */
    public static XSLTProcessor getProcessor(XMLParserLiaison parserLiaison,
                                                    XPathFactory xpathFactory)
    {
      //return new XSLTEngineImpl(parserLiaison, xpathFactory);
      try{
        Processor processor = Processor.newInstance("xslt"); 
        return new XSLTEngineImpl(processor);
      }
      catch (ProcessorFactoryException pe)
      {
        return null;
      }
      catch (org.xml.sax.SAXException e)
      {
        return null;
      }
    }
  
  }
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xslt/XSLTResultTarget.java
  
  Index: XSLTResultTarget.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1  
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xalan.xslt;
  
  import org.w3c.dom.Node;
  import java.io.OutputStream;
  import java.io.Writer;
  import org.xml.sax.DocumentHandler;
  import trax.Result;
  
  /**
   * <meta name="usage" content="general"/>
   * Contains the result of a transformation that you perform with the
   * XSLTProcessor process() method or one of the StylesheetRoot process() methods.
   * Create an instance of this class to provide the process() method a container
   * for the transformation result tree.
   * You can use a file name or URL, character stream, byte stream, DOM Node, or SAX DocumentHandler
   * to instantiate an XSLTResultTarget object.
   *
   * @see XSLTProcessor#process(XSLTInputSource, XSLTInputSource, XSLTResultTarget)
   * @see StylesheetRoot
   */
  public class XSLTResultTarget extends Result
  {
    /**
      * Zero-argument default constructor  -- Before you can use the new XSLTResultTarget object in a transformation,
      * you must define the output container by setting its FileName, CharacterStrea, ByteStream, or Node property.
      *
      * @see #setFileName(String)
      * @see #setCharacterStream(Writer)
      * @see #setByteStream(OutputStream)
      * @see #setNode(Node)
      * @see #setDocumentHandler(DocumentHandler)
      * @see #setEncoding(String)
      */
    public XSLTResultTarget ()
    {
      super();
    }
  
    /**
     * Create a new output target with a file name -- the equivalent of creating an output target
     * with the zero-argument constructor and setting the new object's FileName property.
     *
     * @param fileName Identifies the file that will contain the transformation result (must be a valid system file name).
     *
     * @see #setFileName(String)
     * @see #setCharacterStream(Writer)
     * @see #setByteStream(OutputStream)
     * @see #setNode(Node)
     * @see #setDocumentHandler(DocumentHandler)
     * @see #setEncoding(String)
     */
    public XSLTResultTarget (String fileName) // File?
    {
      super();
      setFileName(fileName);    
    }
  
  
    /**
     * Create a new output target with a byte stream -- the equivalent of creating an output target
     * with the zero-argument constructor and setting the new object's ByteStream property.
     *
     * @param byteStream The raw byte stream that will contain the transformation result.
     *
     * @see #setByteStream(OutputStream)
     * @see #setFileName(String)
     * @see #setCharacterStream(Writer)
     * @see #setNode(Node)
     * @see #setDocumentHandler(DocumentHandler)
     * @see #setEncoding(String)
     */
  
    public XSLTResultTarget (OutputStream byteStream)
    {
      super(byteStream);
      //setByteStream(byteStream);    
    }
  
  
    /**
     * Create a new output target with a character stream -- the equivalent of creating an output target
     * with the zero-argument constructor and setting the new object's CharacterStream property.
     *
     * @param characterStream The character stream where the transformation result is written.
     *
     * @see #setCharacterStream(Writer)
     * @see #setByteStream(OutputStream)
     * @see #setFileName(String)
     * @see #setNode(Node)
     * @see #setDocumentHandler(DocumentHandler)
     * @see #setEncoding(String)
     */
    public XSLTResultTarget (Writer characterStream)
    {
      super(characterStream);
      //setCharacterStream(characterStream);
    }
  
    /**
     * Create a new output target with a DOM Node -- the equivalent of creating an output target
     * with the zero-argument constructor and setting the new object's Node property.
     *
     * @param node The DOM Node that will contain the transformation result.
     *
     * @see #setNode(Node)
     * @see #setCharacterStream(Writer)
     * @see #setByteStream(OutputStream)
     * @see #setFileName(String)
     * @see #setDocumentHandler(DocumentHandler)
     * @see #setEncoding(String)
     */
    public XSLTResultTarget (Node n)
    {
      super(n);    
    }
  
    /**
     * Create a new output target with a SAX Document handler, which
     * will handle result events -- the equivalent of creating an output target with the
     * zero-argument constructor and setting the new object's DocyumentHandler property.
     *
     * @param handler The SAX Document handler to which the result is written.
     *
     * @see #setDocumentHandler(DocumentHandler)
     * @see #setNode(Node)
     * @see #setCharacterStream(Writer)
     * @see #setByteStream(OutputStream)
     * @see #setFileName(String)
     * @see #setEncoding(String)
     */
    public XSLTResultTarget(DocumentHandler handler)
    {
      super();
      formatterListener = handler;
    }
  
    /**
     * Set the file name or URL where the transformation result will be written.
     *
     * @param fileName The system identifier as a string.
     *
     * @see #XSLTResultTarget(String)
     * @see #getFileName
     */
    public void setFileName (String fileName) // File?
    {
      this.fileName = fileName;
    }
  
  
    /**
     * Get the file name where the results are or will be written, or null if none was supplied.
     *
     * @return The file name or URL.
     *
     * @see #XSLTResultTarget(String)
     * @see #setFileName(String)
     */
    public String getFileName ()
    {
      return fileName;
    } 
  
  
  
    /**
     * Set the character encoding, if known.
     *
     * @param encoding The character encoding.
     */
    public void setEncoding (String encoding)
    {
      this.encoding = encoding;
    }
  
  
    /**
     * Get the character encoding that was used.
     *
     * @return The encoding, or null if none was supplied.
     */
    public String getEncoding ()
    {
      return encoding;
    }
  
  
    /**
     * Set a SAX DocumentHandler to process the result tree events.
     * You can process events as they occur
     * rather than waiting for the transformation to be completed.
     *
     * @param handler The SAX DocumentHandler to process result tree events.
     *
     * @see #XSLTResultTarget(DocumentHandler)
     * @see #getDocumentHandler()
     */
    public void setDocumentHandler (DocumentHandler handler)
    {
      this.formatterListener = handler;
    }
  
    /**
     * Get the SAX DocumentHandler that processes the result tree events.
     * You can use the DocumentHandler to process events as they occur
     * rather than waiting for the transformation to be completed.
     *
     * @return The SAX DocumentHandler that processes result tree events.
     *
     * @see #XSLTResultTarget(DocumentHandler)
     * @see #setDocumentHandler(DocumentHandler)
     */
    public DocumentHandler getDocumentHandler ()
    {
      return formatterListener;
    }
  
    //////////////////////////////////////////////////////////////////////
    // Internal state.
    //////////////////////////////////////////////////////////////////////
  
    private String fileName;
    private OutputStream byteStream;
    private String encoding;
    private Writer characterStream;
    private Node node;
    private DocumentHandler formatterListener;
  }