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

cvs commit: xml-xalan/c/src/XSLT ElemNumber.cpp StylesheetExecutionContext.hpp StylesheetExecutionContextDefault.cpp StylesheetExecutionContextDefault.hpp StylesheetHandler.cpp StylesheetRoot.cpp StylesheetRoot.hpp XSLTEngineImpl.cpp XSLTEngineImpl.hpp XSLTProcessor.hpp

dbertoni    00/05/18 11:38:46

  Modified:    c/src/XSLT ElemNumber.cpp StylesheetExecutionContext.hpp
                        StylesheetExecutionContextDefault.cpp
                        StylesheetExecutionContextDefault.hpp
                        StylesheetHandler.cpp StylesheetRoot.cpp
                        StylesheetRoot.hpp XSLTEngineImpl.cpp
                        XSLTEngineImpl.hpp XSLTProcessor.hpp
  Log:
  Made some changes to support switching formatters "on-the-fly", and for re-worked FormatterListeners.
  
  Revision  Changes    Path
  1.17      +11 -9     xml-xalan/c/src/XSLT/ElemNumber.cpp
  
  Index: ElemNumber.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.cpp,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- ElemNumber.cpp	2000/05/08 17:29:34	1.16
  +++ ElemNumber.cpp	2000/05/18 18:38:38	1.17
  @@ -88,7 +88,15 @@
   
   const XalanDOMString	ElemNumber::s_alphaCountTable(XALAN_STATIC_UCODE_STRING("ZABCDEFGHIJKLMNOPQRSTUVWXY"));
   
  -XalanDOMString	s_elalphaCountTable;
  +const XalanDOMChar	elalphaCountTable[] =
  +{
  +	0x03c9, 0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9,0x03ba,
  +	0x03bb,0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,
  +	0x03c5,0x03c6,0x03c7,0x03c8,0
  +};
  +
  +
  +const XalanDOMString	s_elalphaCountTable = elalphaCountTable;
   
   
   
  @@ -750,18 +758,12 @@
   		case 0x0430:
   			executionContext.error(LongToDOMString(numberType) + " format not supported yet!");
   			break;
  +
   		// Handle the special case of Greek letters for now
   		case 0x03B1:
  -			if (isEmpty(s_elalphaCountTable))
  -			{
  -				// Start at lower case Greek letters in entity reference table in
  -				// FormatterToHTML
  -				s_elalphaCountTable += 962;
  -				for (unsigned short i = 1, j=938; i < 25; i++, j++)
  -					s_elalphaCountTable += j;
  -			}
   			formattedNumber += int2alphaCount(listElement, s_elalphaCountTable);
   			break;
  +
   		default: // "1"
   			{
   				const XalanDOMString		numString =
  
  
  
  1.14      +108 -0    xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp
  
  Index: StylesheetExecutionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- StylesheetExecutionContext.hpp	2000/05/15 15:57:45	1.13
  +++ StylesheetExecutionContext.hpp	2000/05/18 18:38:38	1.14
  @@ -96,6 +96,10 @@
   
   class ElemTemplateElement;
   class FormatterListener;
  +class FormatterToDOM;
  +class FormatterToHTML;
  +class FormatterToText;
  +class FormatterToXML;
   class PrefixResolver;
   class NodeRefListBase;
   class PrintWriter;
  @@ -103,7 +107,9 @@
   class Stylesheet;
   class StylesheetRoot;
   class TextOutputStream;
  +class Writer;
   class XalanDocument;
  +class XalanDocumentFragment;
   class XalanElement;
   class XalanNode;
   class XalanNumberFormat;
  @@ -944,6 +950,108 @@
   
   		StylesheetExecutionContext&			m_executionContext;
   	};
  +
  +
  +	/**
  +	 * Create a new FormatterToXML instance.  The execution context
  +	 * owns the instance and will delete it when reset.
  +	 *
  +	 * @param writer            character output stream to use
  +	 * @param version           version of the output method
  +	 * @param doIndent          true if output is to be indented
  +	 * @param indent            number of spaces to indent at each nesting level
  +	 * @param encoding          character encoding in use by <VAR>writer</VAR>
  +	 * @param mediaType         media type (MIME content type) of the data
  +	 * @param doctypeSystem     system identifier to be used in the document
  +	 *                          type declaration
  +	 * @param doctypePublic     public identifier to be used in the document
  +	 *                          type declaration
  +	 * @param xmlDecl           true if the XSLT processor should output an XML
  +	 *                          declaration
  +	 * @param standalone        true if the XSLT processor should output a
  +	 *                          standalone document declaration
  +	 * @return a pointer to the new instance.
  +	 */
  +	virtual FormatterToXML*
  +	createFormatterToXML(
  +			Writer&					writer,
  +			const XalanDOMString&	version = XalanDOMString(),
  +			bool					doIndent = false,
  +			int						indent = 0,
  +			const XalanDOMString&	encoding = XalanDOMString(),
  +			const XalanDOMString&	mediaType = XalanDOMString(),
  +			const XalanDOMString&	doctypeSystem = XalanDOMString(),
  +			const XalanDOMString&	doctypePublic = XalanDOMString(),
  +			bool					xmlDecl = true,
  +			const XalanDOMString&	standalone = XalanDOMString()) = 0;
  +
  +	/**
  +	 * Create a new FormatterToHTML instance.  The execution context
  +	 * owns the instance and will delete it when reset.
  +	 *
  +	 * @param writer            character output stream to use
  +	 * @param encoding          character encoding in use by <VAR>writer</VAR>
  +	 * @param mediaType         media type (MIME content type) of the data
  +	 * @param doctypeSystem     system identifier to be used in the document
  +	 *                          type declaration
  +	 * @param doctypePublic     public identifier to be used in the document
  +	 *                          type declaration
  +	 * @param doIndent          true if output is to be indented
  +	 * @param indent            number of spaces to indent at each nesting level
  +	 * @param version           version of the output method
  +	 * @param standalone        true if the XSLT processor should output a
  +	 *                          standalone document declaration
  +	 * @param xmlDecl           true if the XSLT processor should output an XML
  +	 *                          declaration
  +	 * @return a pointer to the new instance.
  +	 */
  +	virtual FormatterToHTML*
  +	createFormatterToHTML(
  +			Writer&					writer,
  +			const XalanDOMString&	encoding = XalanDOMString(),
  +			const XalanDOMString&	mediaType = XalanDOMString(),
  +			const XalanDOMString&	doctypeSystem = XalanDOMString(),
  +			const XalanDOMString&	doctypePublic = XalanDOMString(),
  +			bool					doIndent = true,
  +			int						indent = 4,
  +			const XalanDOMString&	version = XalanDOMString(),
  +			const XalanDOMString&	standalone = XalanDOMString(),
  +			bool					xmlDecl = false) = 0;
  +
  +	/**
  +	 * Construct a FormatterToDOM instance.  it will add the DOM nodes 
  +	 * to the document fragment.
  +	 *
  +	 * @param doc            document for nodes
  +	 * @param docFrag        document fragment for nodes, default none
  +	 * @param currentElement current element for nodes, default none
  +	 */
  +	virtual FormatterToDOM*
  +	createFormatterToDOM(
  +			XalanDocument*			doc,
  +			XalanDocumentFragment*	docFrag = 0,
  +			XalanElement*			currentElement = 0) = 0;
  +
  +	/**
  +	 * Construct a FormatterToDOM instance.  it will add the DOM nodes 
  +	 * to the document fragment.
  +	 *
  +	 * @param doc            document for nodes
  +	 * @param docFrag        document fragment for nodes, default none
  +	 * @param currentElement current element for nodes, default none
  +	 */
  +	virtual FormatterToDOM*
  +	createFormatterToDOM(
  +			XalanDocument*	doc,
  +			XalanElement*	elem) = 0;
  +
  +	/**
  +	 * FormatterToText instance constructor.
  +	 *
  +	 * @param pw print writer for output
  +	 */
  +	virtual FormatterToText*
  +	createFormatterToText(Writer&	writer) = 0;
   
   
   #if defined(XALAN_NO_NAMESPACES)
  
  
  
  1.11      +138 -1    xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp
  
  Index: StylesheetExecutionContextDefault.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- StylesheetExecutionContextDefault.cpp	2000/05/15 15:56:00	1.10
  +++ StylesheetExecutionContextDefault.cpp	2000/05/18 18:38:40	1.11
  @@ -79,6 +79,10 @@
   
   
   
  +#include <XMLSupport/FormatterToDOM.hpp>
  +#include <XMLSupport/FormatterToXML.hpp>
  +#include <XMLSupport/FormatterToHTML.hpp>
  +#include <XMLSupport/FormatterToText.hpp>
   #include <XMLSupport/XMLParserLiaison.hpp>
   
   
  @@ -121,6 +125,7 @@
   	m_elementRecursionStack(),
   	m_prefixResolver(0),
   	m_stylesheetRoot(0),
  +	m_formatterListeners(),
   	m_printWriters(),
   	m_textOutputStreams()
   {
  @@ -142,6 +147,12 @@
   	using std::for_each;
   #endif
   
  +	for_each(m_formatterListeners.begin(),
  +			 m_formatterListeners.end(),
  +			 DeleteFunctor<FormatterListener>());
  +
  +	m_formatterListeners.clear();
  +
   	for_each(m_printWriters.begin(),
   			 m_printWriters.end(),
   			 DeleteFunctor<PrintWriter>());
  @@ -203,6 +214,17 @@
   	assert(theStylesheet->isRoot() == true);
   
   	m_stylesheetRoot = theStylesheet;
  +
  +	m_xsltProcessor.setStylesheetRoot(theStylesheet);
  +
  +	if (theStylesheet == 0)
  +	{
  +		m_xsltProcessor.setExecutionContext(0);
  +	}
  +	else
  +	{
  +		m_xsltProcessor.setExecutionContext(this);
  +	}
   }
   
   
  @@ -365,7 +387,7 @@
   int
   StylesheetExecutionContextDefault::getIndent() const
   {
  -		return m_xsltProcessor.getXMLParserLiaison().getIndent();
  +	return m_xsltProcessor.getXMLParserLiaison().getIndent();
   }
   
   
  @@ -720,6 +742,121 @@
   	m_elementRecursionStack.pop_back();
   
   	return theTemp;
  +}
  +
  +
  +
  +FormatterToXML*
  +StylesheetExecutionContextDefault::createFormatterToXML(
  +			Writer&					writer,
  +			const XalanDOMString&	version,
  +			bool					doIndent,
  +			int						indent,
  +			const XalanDOMString&	encoding,
  +			const XalanDOMString&	mediaType,
  +			const XalanDOMString&	doctypeSystem,
  +			const XalanDOMString&	doctypePublic,
  +			bool					xmlDecl,
  +			const XalanDOMString&	standalone)
  +{
  +	FormatterToXML* const	theFormatter =
  +		new FormatterToXML(
  +			writer,
  +			version,
  +			doIndent,
  +			indent,
  +			encoding,
  +			mediaType,
  +			doctypeSystem,
  +			doctypePublic,
  +			xmlDecl,
  +			standalone);
  +
  +	m_formatterListeners.insert(theFormatter);
  +
  +	return theFormatter;
  +}
  +
  +
  +
  +FormatterToHTML*
  +StylesheetExecutionContextDefault::createFormatterToHTML(
  +			Writer&					writer,
  +			const XalanDOMString&	encoding,
  +			const XalanDOMString&	mediaType,
  +			const XalanDOMString&	doctypeSystem,
  +			const XalanDOMString&	doctypePublic,
  +			bool					doIndent,
  +			int						indent,
  +			const XalanDOMString&	version,
  +			const XalanDOMString&	standalone,
  +			bool					xmlDecl)
  +{
  +	FormatterToHTML* const	theFormatter =
  +		new FormatterToHTML(
  +			writer,
  +			encoding,
  +			mediaType,
  +			doctypeSystem,
  +			doctypePublic,
  +			doIndent,
  +			indent,
  +			version,
  +			standalone,
  +			xmlDecl);
  +
  +	m_formatterListeners.insert(theFormatter);
  +
  +	return theFormatter;
  +}
  +
  +
  +
  +FormatterToDOM*
  +StylesheetExecutionContextDefault::createFormatterToDOM(
  +			XalanDocument*			doc,
  +			XalanDocumentFragment*	docFrag,
  +			XalanElement*			currentElement)
  +{
  +	FormatterToDOM* const	theFormatter =
  +		new FormatterToDOM(
  +			doc,
  +			docFrag,
  +			currentElement);
  +
  +	m_formatterListeners.insert(theFormatter);
  +
  +	return theFormatter;
  +}
  +
  +
  +
  +FormatterToDOM*
  +StylesheetExecutionContextDefault::createFormatterToDOM(
  +			XalanDocument*	doc,
  +			XalanElement*	elem)
  +{
  +	FormatterToDOM* const	theFormatter =
  +		new FormatterToDOM(
  +			doc,
  +			elem);
  +
  +	m_formatterListeners.insert(theFormatter);
  +
  +	return theFormatter;
  +}
  +
  +
  +
  +FormatterToText*
  +StylesheetExecutionContextDefault::createFormatterToText(Writer&	writer)
  +{
  +	FormatterToText* const	theFormatter =
  +		new FormatterToText(writer);
  +
  +	m_formatterListeners.insert(theFormatter);
  +
  +	return theFormatter;
   }
   
   
  
  
  
  1.12      +45 -1     xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp
  
  Index: StylesheetExecutionContextDefault.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- StylesheetExecutionContextDefault.hpp	2000/05/15 15:56:00	1.11
  +++ StylesheetExecutionContextDefault.hpp	2000/05/18 18:38:40	1.12
  @@ -332,10 +332,50 @@
   	virtual const ElemTemplateElement*
   	popElementRecursionStack();
   
  +	virtual FormatterToXML*
  +	createFormatterToXML(
  +			Writer&					writer,
  +			const XalanDOMString&	version = XalanDOMString(),
  +			bool					doIndent = false,
  +			int						indent = 0,
  +			const XalanDOMString&	encoding = XalanDOMString(),
  +			const XalanDOMString&	mediaType = XalanDOMString(),
  +			const XalanDOMString&	doctypeSystem = XalanDOMString(),
  +			const XalanDOMString&	doctypePublic = XalanDOMString(),
  +			bool					xmlDecl = true,
  +			const XalanDOMString&	standalone = XalanDOMString());
  +
  +	virtual FormatterToHTML*
  +	createFormatterToHTML(
  +			Writer&					writer,
  +			const XalanDOMString&	encoding = XalanDOMString(),
  +			const XalanDOMString&	mediaType = XalanDOMString(),
  +			const XalanDOMString&	doctypeSystem = XalanDOMString(),
  +			const XalanDOMString&	doctypePublic = XalanDOMString(),
  +			bool					doIndent = true,
  +			int						indent = 4,
  +			const XalanDOMString&	version = XalanDOMString(),
  +			const XalanDOMString&	standalone = XalanDOMString(),
  +			bool					xmlDecl = false);
  +
  +	virtual FormatterToDOM*
  +	createFormatterToDOM(
  +			XalanDocument*			doc,
  +			XalanDocumentFragment*	docFrag = 0,
  +			XalanElement*			currentElement = 0);
  +
  +	virtual FormatterToDOM*
  +	createFormatterToDOM(
  +			XalanDocument*	doc,
  +			XalanElement*	elem);
  +
  +	virtual FormatterToText*
  +	createFormatterToText(Writer&	writer);
  +
  +
   	virtual XalanNumberFormatAutoPtr
   	createXalanNumberFormat();
   
  -
   	// A basic class to create XalanNumberFormat instances...
   	class XALAN_XSLT_EXPORT XalanNumberFormatFactory
   	{
  @@ -560,10 +600,12 @@
   
   #if defined(XALAN_NO_NAMESPACES)
   	typedef vector<const ElemTemplateElement*>			ElementRecursionStackType;
  +	typedef set<FormatterListener*>						FormatterListenerSetType;
   	typedef set<PrintWriter*>							PrintWriterSetType;
   	typedef set<TextOutputStream*>						TextOutputStreamSetType;
   #else
   	typedef std::vector<const ElemTemplateElement*>		ElementRecursionStackType;
  +	typedef std::set<FormatterListener*>				FormatterListenerSetType;
   	typedef std::set<PrintWriter*>						PrintWriterSetType;
   	typedef std::set<TextOutputStream*>					TextOutputStreamSetType;
   #endif
  @@ -573,6 +615,8 @@
   	const PrefixResolver*				m_prefixResolver;
   
   	StylesheetRoot*						m_stylesheetRoot;
  +
  +	FormatterListenerSetType			m_formatterListeners;
   
   	PrintWriterSetType					m_printWriters;
   
  
  
  
  1.26      +2 -2      xml-xalan/c/src/XSLT/StylesheetHandler.cpp
  
  Index: StylesheetHandler.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.cpp,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- StylesheetHandler.cpp	2000/05/12 18:21:33	1.25
  +++ StylesheetHandler.cpp	2000/05/18 18:38:40	1.26
  @@ -117,7 +117,7 @@
   			XSLTEngineImpl&					processor,
   			Stylesheet&						stylesheetTree,
   			StylesheetConstructionContext&	constructionContext) :
  -	FormatterListener(),
  +	FormatterListener(OUTPUT_METHOD_OTHER),
   	m_includeBase(stylesheetTree.getBaseIdentifier()),
   	m_pendingException(),
   	m_exceptionPending(false),
  @@ -1059,7 +1059,7 @@
   	if(equals(name, XALAN_STATIC_UCODE_STRING("HTML")))
   	{
   		m_stylesheet.getStylesheetRoot().setIndentResult(true);
  -		m_stylesheet.getStylesheetRoot().setOutputMethod(Formatter::OUTPUT_METH_HTML);
  +		m_stylesheet.getStylesheetRoot().setOutputMethod(OUTPUT_METHOD_HTML);
   	}
   
   	return pElem;
  
  
  
  1.15      +44 -39    xml-xalan/c/src/XSLT/StylesheetRoot.cpp
  
  Index: StylesheetRoot.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetRoot.cpp,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- StylesheetRoot.cpp	2000/05/12 18:21:33	1.14
  +++ StylesheetRoot.cpp	2000/05/18 18:38:41	1.15
  @@ -118,14 +118,14 @@
    *            halt processing.
    */
   StylesheetRoot::StylesheetRoot(
  -        const XalanDOMString&				baseIdentifier,
  +        const XalanDOMString&			baseIdentifier,
   		StylesheetConstructionContext&	constructionContext) :
   	Stylesheet(*this,
   			   baseIdentifier,
   			   constructionContext),
   	m_importStack(),
   	m_resultNameSpaceURL(),
  -	m_outputmethod(Formatter::OUTPUT_METH_XML),
  +	m_outputMethod(FormatterListener::OUTPUT_METHOD_NONE),
   	m_version(),
   	m_indentResult(false),
   	m_encoding(),
  @@ -210,8 +210,6 @@
   		using std::auto_ptr;
   #endif
   
  -		auto_ptr<FormatterListener>		theListenerGuard;
  -
   		Writer* pw = 0;
   
   		flistener = outputTarget.getFormatterListener();
  @@ -278,33 +276,44 @@
   
   			int			indentAmount = executionContext.getIndent();
   			const bool	doIndent = (indentAmount > -1) ? true : m_indentResult;
  -			// Make sure we don't have a negative indent amount if we're
  -			// indenting
  -			if (m_indentResult && indentAmount < 0)
  -				indentAmount = 0;
   			
  -			switch(m_outputmethod)
  +			switch(m_outputMethod)
   			{
  -			case Formatter::OUTPUT_METH_HTML:
  -				flistener = new FormatterToHTML(
  -					*pw, m_version, doIndent, indentAmount, m_encoding, m_mediatype,
  -					m_doctypeSystem, m_doctypePublic, !m_omitxmlDecl, m_standalone);
  +			case FormatterListener::OUTPUT_METHOD_HTML:
  +				{
  +					if (doIndent == true && indentAmount < 0)
  +					{
  +						indentAmount = 4;
  +					}
  +
  +					flistener = executionContext.createFormatterToHTML(
  +						*pw, m_encoding, m_mediatype, m_doctypeSystem, m_doctypePublic,
  +						doIndent, indentAmount, m_version, m_standalone, !m_omitxmlDecl);
  +				}
   				break;
   
  -			case Formatter::OUTPUT_METH_TEXT:
  -				flistener = new FormatterToText(*pw);
  +			case FormatterListener::OUTPUT_METHOD_TEXT:
  +				flistener = executionContext.createFormatterToText(*pw);
   				break;
   
  -			case Formatter::OUTPUT_METH_XML:
  +			case FormatterListener::OUTPUT_METHOD_NONE:
  +			case FormatterListener::OUTPUT_METHOD_XML:
   			default:
  -				flistener = new FormatterToXML(
  -					*pw, m_version, doIndent, indentAmount, m_encoding, m_mediatype,
  -					m_doctypeSystem, m_doctypePublic, !m_omitxmlDecl, m_standalone);
  +				{
  +					// Make sure we don't have a negative indent amount if we're
  +					// indenting
  +					if (doIndent == true && indentAmount < 0)
  +					{
  +						indentAmount = 0;
  +					}
  +
  +					flistener = executionContext.createFormatterToXML(
  +						*pw, m_version, doIndent, indentAmount, m_encoding, m_mediatype,
  +						m_doctypeSystem, m_doctypePublic, !m_omitxmlDecl, m_standalone);
  +				}
   				break;
   			}
   
  -			theListenerGuard = auto_ptr<FormatterListener>(flistener);
  -
   			executionContext.setFormatterListener(flistener);
   		}
   		/*
  @@ -315,27 +324,25 @@
   			switch(outputTarget.getNode()->getNodeType())
   			{
   			case XalanNode::DOCUMENT_NODE:
  -				flistener = new 
  -					FormatterToDOM(static_cast<XalanDocument*>(outputTarget.getNode()));
  +				flistener =
  +					executionContext.createFormatterToDOM(static_cast<XalanDocument*>(outputTarget.getNode()));
   				break;
   
   			case XalanNode::DOCUMENT_FRAGMENT_NODE:
  -				flistener = new 
  -					FormatterToDOM(executionContext.createDocument(),
  +				flistener =
  +					executionContext.createFormatterToDOM(executionContext.createDocument(),
   						static_cast<XalanDocumentFragment*>(outputTarget.getNode()));
   				break;
   
   			case XalanNode::ELEMENT_NODE:
  -				flistener = new 
  -					FormatterToDOM(executionContext.createDocument(),
  +				flistener =
  +					executionContext.createFormatterToDOM(executionContext.createDocument(),
   						static_cast<XalanElement*>(outputTarget.getNode()));
   				break;
   
   			default:
   				executionContext.error("Can only output to an Element, DocumentFragment, Document, or PrintWriter.");
   			}
  -
  -			theListenerGuard = auto_ptr<FormatterListener>(flistener);
   		}
   		/*
   		 * Create an empty document and set the output target node to this
  @@ -343,10 +350,8 @@
   		else
   		{
   			outputTarget.setNode(executionContext.createDocument());
  -			flistener = new
  -				FormatterToDOM(static_cast<XalanDocument*>(outputTarget.getNode()));
  -
  -			theListenerGuard = auto_ptr<FormatterListener>(flistener);
  +			flistener =
  +				executionContext.createFormatterToDOM(static_cast<XalanDocument*>(outputTarget.getNode()));
   		}
   		
   		executionContext.setFormatterListener(flistener);
  @@ -400,10 +405,10 @@
    * The returned value is one of Formatter.OUTPUT_METH_XML,
    * Formatter.OUTPUT_METH_HTML, or Formatter.OUTPUT_METH_TEXT.
    */
  -int 
  +FormatterListener::eFormat
   StylesheetRoot::getOutputMethod() const
   { 
  -	return m_outputmethod; 
  +	return m_outputMethod; 
   }
   
   
  @@ -499,11 +504,11 @@
   			const XalanDOMChar*	const	method = atts.getValue(i);
   
   			if(equals(method, Constants::ATTRVAL_OUTPUT_METHOD_HTML))
  -				m_outputmethod = Formatter::OUTPUT_METH_HTML;
  +				m_outputMethod = FormatterListener::OUTPUT_METHOD_HTML;
   			else if(equals(method, Constants::ATTRVAL_OUTPUT_METHOD_XML))
  -				m_outputmethod = Formatter::OUTPUT_METH_XML;
  +				m_outputMethod = FormatterListener::OUTPUT_METHOD_XML;
   			else if(equals(method, Constants::ATTRVAL_OUTPUT_METHOD_TEXT))
  -				m_outputmethod = Formatter::OUTPUT_METH_TEXT;
  +				m_outputMethod = FormatterListener::OUTPUT_METHOD_TEXT;
   		}
   		else if(equals(aname, Constants::ATTRNAME_OUTPUT_VERSION))
   		{
  @@ -557,7 +562,7 @@
   		}
   	}
   
  -	if((Formatter::OUTPUT_METH_HTML == m_outputmethod) &&
  +	if((FormatterListener::OUTPUT_METHOD_HTML == m_outputMethod) &&
   		 (false == didSpecifyIndent))
   	{
   		m_indentResult = true;
  
  
  
  1.9       +22 -13    xml-xalan/c/src/XSLT/StylesheetRoot.hpp
  
  Index: StylesheetRoot.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetRoot.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- StylesheetRoot.hpp	2000/05/11 19:08:35	1.8
  +++ StylesheetRoot.hpp	2000/05/18 18:38:41	1.9
  @@ -72,6 +72,10 @@
   
   
   
  +#include <XMLSupport/FormatterListener.hpp>
  +
  +
  +
   class SelectionEvent;
   class StylesheetConstructionContext;
   class TraceListener;
  @@ -121,17 +125,22 @@
   			XalanNode*						sourceTree, 
   			XSLTResultTarget&				outputTarget,
   			StylesheetExecutionContext&		executionContext);
  -  
  +
   	/** 
   	 * Return the output method that was specified in the stylesheet. 
  -	 * The returned value is one of Formatter.OUTPUT_METH_XML,
  -	 * Formatter.OUTPUT_METH_HTML, or Formatter.OUTPUT_METH_TEXT.
  +	 * The returned value is one of FormatterLister::eFormat values.
   	 *
  -	 * @return number of output method
  +	 * @return value of output method
   	 */
  -	int 
  +	FormatterListener::eFormat
   	getOutputMethod() const;
   
  +	bool
  +	isOutputMethodSet() const
  +	{
  +		return getOutputMethod() == FormatterListener::OUTPUT_METHOD_NONE ? false : true;
  +	}
  +
   	/**
   	 * Get the output version string that was specified in the
   	 * xsl:output element
  @@ -359,15 +368,15 @@
   	}
   
   	/**
  -	 * Change the value of the output method, one of Formatter.OUTPUT_METH_XML,
  -	 * Formatter.OUTPUT_METH_HTML, or Formatter.OUTPUT_METH_TEXT.
  +	 * Change the value of the output method, one of the
  +	 * FormatterListener::eFormat values.
   	 * 
   	 * @param meth new method number
   	 */
   	void
  -	setOutputMethod(int meth)
  +	setOutputMethod(FormatterListener::eFormat	meth)
   	{
  -		m_outputmethod = meth;
  +		m_outputMethod = meth;
   	}
   
   	/**
  @@ -433,13 +442,13 @@
   	 * The URL that belongs to the result namespace.
   	 * @serial
   	 */
  -	XalanDOMString m_resultNameSpaceURL; // = null;
  +	XalanDOMString	m_resultNameSpaceURL;
     
   	/**
   	 * List of listeners who are interested in tracing what's going on.
   	 */
   	//transient 
  -	ListenersVectorType m_traceListeners; // = null;
  +	ListenersVectorType		m_traceListeners;
     
   	/**
   	 * String buffer for use by AVTs and the like.
  @@ -449,13 +458,13 @@
   	/**
   	 * The output method as specified in xsl:output.
   	 */
  -	int m_outputmethod; // = Formatter.OUTPUT_METH_XML;
  +	FormatterListener::eFormat	m_outputMethod;
   
   	/**
   	 * List of qnames that specifies elements that should be formatted 
   	 * as CDATA.
   	 */
  -	QNameVectorType m_cdataSectionElems; // = null;
  +	QNameVectorType		m_cdataSectionElems;
   
   	/**
   	 * A stack of who's importing who is needed in order to support 
  
  
  
  1.38      +62 -0     xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp
  
  Index: XSLTEngineImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- XSLTEngineImpl.cpp	2000/05/15 15:57:45	1.37
  +++ XSLTEngineImpl.cpp	2000/05/18 18:38:41	1.38
  @@ -99,6 +99,8 @@
   #include <XMLSupport/Formatter.hpp>
   #include <XMLSupport/FormatterToDOM.hpp>
   #include <XMLSupport/FormatterToText.hpp>
  +#include <XMLSupport/FormatterToXML.hpp>
  +#include <XMLSupport/FormatterToHTML.hpp>
   #include <XMLSupport/FormatterTreeWalker.hpp>
   #include <XMLSupport/XMLParserLiaison.hpp>
   #include <XMLSupport/FormatterTreeWalker.hpp>
  @@ -228,6 +230,7 @@
   	m_contextNodeList(&xpathSupport),
   	m_namedTemplates(),
   	m_topLevelVariables(),
  +	m_executionContext(0),
   	m_needToCheckForInfiniteLoops(false),
   	m_stackGuard(*this),
   	m_attrSetStack()
  @@ -466,6 +469,8 @@
   
   		if(0 != sourceTree)
   		{
  +			executionContext.setStylesheetRoot(m_stylesheetRoot);
  +
   			m_stylesheetRoot->process(sourceTree, outputTarget, executionContext);
   
   			if(0 != m_diagnosticsPrintWriter)
  @@ -1087,6 +1092,14 @@
   
   
   
  +void
  +XSLTEngineImpl::setExecutionContext(StylesheetExecutionContext*		theExecutionContext)
  +{
  +	m_executionContext = theExecutionContext;
  +}
  +
  +
  +
   //==========================================================
   // SECTION: Diagnostic functions
   //==========================================================
  @@ -1481,6 +1494,8 @@
   XSLTEngineImpl::endDocument()
   {
   	assert(m_flistener != 0);
  +	assert(m_executionContext != 0);
  +
   	flushPending();
   	m_flistener->endDocument();
   	if(m_traceListeners.size() > 0)
  @@ -1552,12 +1567,59 @@
   
   
   
  +bool
  +XSLTEngineImpl::pendingAttributesHasDefaultNS() const
  +{
  +	const unsigned int	n = m_pendingAttributes.getLength();
  +
  +	for(unsigned int i = 0; i < n; i++)
  +	{
  +		if(equals(m_pendingAttributes.getName(i),
  +				  DOMServices::s_XMLNamespace) == true)
  +		{
  +			return true;
  +		}
  +	}
  +
  +	return false;
  +}
  +
  +
  +
   void
   XSLTEngineImpl::flushPending()
   {
   	if(0 != length(m_pendingElementName))
   	{
   		assert(m_flistener != 0);
  +		assert(m_executionContext != 0);
  +
  +		if (m_stylesheetRoot->isOutputMethodSet() == false)
  +		{
  +			if (equalsIgnoreCase(m_pendingElementName,
  +								 XALAN_STATIC_UCODE_STRING("html")) == true &&
  +				pendingAttributesHasDefaultNS() == false)
  +			{
  +				if (m_flistener->getOutputFormat() == FormatterListener::OUTPUT_METHOD_XML)
  +				{
  +					// Yuck!!! Ugly hack to switch to HTML on-the-fly.  You can
  +					// blame this ridiculous crap on James Clark (jjc@jclark.com)
  +					FormatterToXML* const	theFormatter =
  +						static_cast<FormatterToXML*>(m_flistener);
  +
  +					m_flistener =
  +						m_executionContext->createFormatterToHTML(
  +							theFormatter->getWriter(),
  +							theFormatter->getEncoding(),
  +							theFormatter->getMediaType(),
  +							theFormatter->getDoctypeSystem(),
  +							theFormatter->getDoctypePublic(),
  +							true,	// indent
  +							theFormatter->getIndent() > 0 ? theFormatter->getIndent() : 4);
  +				}
  +			}
  +		}
  +
   		m_cdataStack.push_back(isCDataResultElem(m_pendingElementName)? true : false);
   		m_flistener->startElement(c_wstr(m_pendingElementName), m_pendingAttributes);
   		if(m_traceListeners.size() > 0)
  
  
  
  1.31      +24 -3     xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp
  
  Index: XSLTEngineImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- XSLTEngineImpl.hpp	2000/05/15 15:57:45	1.30
  +++ XSLTEngineImpl.hpp	2000/05/18 18:38:41	1.31
  @@ -417,7 +417,8 @@
   	/**
   	 * Flush the pending element.
   	 */
  -	void flushPending();
  +	void
  +	flushPending();
   
   	/**
   	 * Add a namespace declaration to the namespace stack
  @@ -425,8 +426,10 @@
   	 * @param prefix	   namespace prefix
   	 * @param namespaceVal value of namespace
   	 */
  -	void addResultNamespaceDecl(const XalanDOMString& prefix, 
  -									   const XalanDOMString& namespaceVal);
  +	void
  +	addResultNamespaceDecl(
  +			const XalanDOMString&	prefix, 
  +			const XalanDOMString&	namespaceVal);
   
   	/**
   	 * Add attribute to attribute list, and if it is a namespace, add it to the
  @@ -646,6 +649,14 @@
   	setStylesheetRoot(StylesheetRoot*	theStylesheet);
   
   	/**
  +	 * Set the execution context.
  +	 * 
  +	 * @param theExecutionContext pointer to new execution context.
  +	 */
  +	virtual void
  +	setExecutionContext(StylesheetExecutionContext*		theExecutionContext);
  +
  +	/**
   	 * Table of stylesheet documents. Document objects are keyed by URL string.
   	 */
   	StylesheetMapType	m_stylesheets;
  @@ -1939,6 +1950,14 @@
   
   private:
   
  +
  +	/**
  +	 * Determine if any pending attributes is a default
  +	 * namespace.
  +	 */
  +	bool
  +	pendingAttributesHasDefaultNS() const; 
  +
     /**
      * The top of this stack should contain the currently processed
      * stylesheet SAX locator object.
  @@ -2289,6 +2308,8 @@
   	 * Table for defined constants, keyed on the names.
   	 */
   	TopLevelVariablesMapType	m_topLevelVariables;
  +
  +	StylesheetExecutionContext*		m_executionContext;
   
   	/**
   	 * The StackGuard class guard against infinite loops.
  
  
  
  1.9       +9 -0      xml-xalan/c/src/XSLT/XSLTProcessor.hpp
  
  Index: XSLTProcessor.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTProcessor.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XSLTProcessor.hpp	2000/05/15 15:56:00	1.8
  +++ XSLTProcessor.hpp	2000/05/18 18:38:42	1.9
  @@ -259,6 +259,15 @@
   	setStylesheetRoot(StylesheetRoot*	theStylesheet) = 0;
   
   	/**
  +	 * Set the execution context. Must be set if after calling
  +	 * setStylesheetRoot.
  +	 * 
  +	 * @param theExecutionContext pointer to new execution context.
  +	 */
  +	virtual void
  +	setExecutionContext(StylesheetExecutionContext*		theExecutionContext) = 0;
  +
  +	/**
   	 * Evaluates attribute values for attribute templates (Stuff in curly {}
   	 * braces that hold expressions).
   	 *