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/08/28 03:19:44 UTC

cvs commit: xml-xalan/c/src/XSLT NamespacesHandler.cpp NamespacesHandler.hpp ElemElement.cpp ElemElement.hpp ElemLiteralResult.cpp ElemLiteralResult.hpp ElemTemplate.cpp ElemTemplateElement.cpp ElemTemplateElement.hpp Stylesheet.cpp Stylesheet.hpp StylesheetExecutionContext.hpp StylesheetExecutionContextDefault.cpp StylesheetExecutionContextDefault.hpp StylesheetHandler.cpp StylesheetHandler.hpp XSLTEngineImpl.cpp XSLTEngineImpl.hpp

dbertoni    00/08/27 18:19:44

  Modified:    c/src/XSLT ElemElement.cpp ElemElement.hpp
                        ElemLiteralResult.cpp ElemLiteralResult.hpp
                        ElemTemplate.cpp ElemTemplateElement.cpp
                        ElemTemplateElement.hpp Stylesheet.cpp
                        Stylesheet.hpp StylesheetExecutionContext.hpp
                        StylesheetExecutionContextDefault.cpp
                        StylesheetExecutionContextDefault.hpp
                        StylesheetHandler.cpp StylesheetHandler.hpp
                        XSLTEngineImpl.cpp XSLTEngineImpl.hpp
  Added:       c/src/XSLT NamespacesHandler.cpp NamespacesHandler.hpp
  Log:
  New result tree namespaces implementation.
  
  Revision  Changes    Path
  1.8       +26 -2     xml-xalan/c/src/XSLT/ElemElement.cpp
  
  Index: ElemElement.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemElement.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ElemElement.cpp	2000/08/22 20:21:17	1.7
  +++ ElemElement.cpp	2000/08/28 01:19:40	1.8
  @@ -68,6 +68,7 @@
   
   #include "AVT.hpp"
   #include "Constants.hpp"
  +#include "Stylesheet.hpp"
   #include "StylesheetConstructionContext.hpp"
   #include "StylesheetExecutionContext.hpp"
   
  @@ -87,7 +88,10 @@
   			columnNumber,
   			Constants::ELEMNAME_ELEMENT),
   	m_nameAVT(0),
  -	m_namespaceAVT(0)	
  +	m_namespaceAVT(0),
  +	m_namespacesHandler(stylesheetTree.getNamespacesHandler(),
  +						stylesheetTree.getNamespaces(),
  +						stylesheetTree.getXSLTNamespaceURI())	
   {
   	const unsigned int	nAttrs = atts.getLength();
   
  @@ -137,6 +141,24 @@
   
   
   void
  +ElemElement::postConstruction(const NamespacesHandler&	theParentHandler)
  +{
  +	m_namespacesHandler.postConstruction(getElementName(), &theParentHandler);
  +
  +	ElemUse::postConstruction(m_namespacesHandler);
  +}
  +
  +
  +
  +const NamespacesHandler&
  +ElemElement::getNamespacesHandler() const
  +{
  +	return m_namespacesHandler;
  +}
  +
  +
  +
  +void
   ElemElement::execute(
   			StylesheetExecutionContext&		executionContext,
   			XalanNode*						sourceTree,
  @@ -198,7 +220,7 @@
   
   			if(!isEmpty(elemNameSpace))
   			{
  -				XalanDOMString	prefix = executionContext.getResultPrefixForNamespace(elemNameSpace);
  +				XalanDOMString		prefix = executionContext.getResultPrefixForNamespace(elemNameSpace);
   
   				if(isEmpty(prefix))
   				{
  @@ -223,6 +245,8 @@
   	}
   
   	ElemUse::execute(executionContext, sourceTree, sourceNode, mode);
  +
  +	m_namespacesHandler.outputResultNamespaces(executionContext);
   
   	executeChildren(executionContext, sourceTree, sourceNode, mode);
   
  
  
  
  1.5       +17 -3     xml-xalan/c/src/XSLT/ElemElement.hpp
  
  Index: ElemElement.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemElement.hpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ElemElement.hpp	2000/04/11 15:09:23	1.4
  +++ ElemElement.hpp	2000/08/28 01:19:40	1.5
  @@ -58,7 +58,7 @@
   #define XALAN_ELEMELEMENT_HEADER_GUARD 
   
   /**
  - * $Id: ElemElement.hpp,v 1.4 2000/04/11 15:09:23 dbertoni Exp $
  + * $Id: ElemElement.hpp,v 1.5 2000/08/28 01:19:40 dbertoni Exp $
    * 
    * 
    * $State: Exp $
  @@ -76,6 +76,10 @@
   
   
   
  +#include <XSLT/NamespacesHandler.hpp>
  +
  +
  +
   class AVT;
   
   
  @@ -107,6 +111,12 @@
   
   	// These methods are inherited from ElemUse ...
   
  +	virtual const NamespacesHandler&
  +	getNamespacesHandler() const;
  +
  +	virtual void
  +	postConstruction(const NamespacesHandler&	theParentHandler);
  +
   	virtual void 
   	execute(
   			StylesheetExecutionContext&		executionContext,
  @@ -122,8 +132,12 @@
   	ElemElement&
   	operator=(const ElemElement &);
   
  -	const AVT*	m_nameAVT;
  -	const AVT*	m_namespaceAVT;
  +	const AVT*				m_nameAVT;
  +	const AVT*				m_namespaceAVT;
  +	/*
  +	 * This object handles all result tree namespace processing.
  +	 */
  +	NamespacesHandler		m_namespacesHandler;
   };
   
   
  
  
  
  1.19      +85 -126   xml-xalan/c/src/XSLT/ElemLiteralResult.cpp
  
  Index: ElemLiteralResult.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemLiteralResult.cpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- ElemLiteralResult.cpp	2000/08/22 20:21:18	1.18
  +++ ElemLiteralResult.cpp	2000/08/28 01:19:40	1.19
  @@ -98,7 +98,11 @@
   			name,
   			lineNumber,
   			columnNumber,
  -			xslToken)
  +			xslToken),
  +	m_avts(),
  +	m_namespacesHandler(stylesheetTree.getNamespacesHandler(),
  +						stylesheetTree.getNamespaces(),
  +						stylesheetTree.getXSLTNamespaceURI())
   {
   	const unsigned int	nAttrs = atts.getLength();
   
  @@ -125,9 +129,7 @@
   				{
   					const XalanDOMString localName = substring(aname,indexOfNSSep + 1);
   
  -					processPrefixControl(localName, atts.getValue(i));
  -
  -					if(0 != m_excludeResultPrefixes.size())
  +					if(processPrefixControl(constructionContext, stylesheetTree, localName, atts.getValue(i)) == true)
   					{
   						needToProcess = false;
   					}
  @@ -159,8 +161,6 @@
   							*this, constructionContext));
   			}
   		}
  -
  -		removeExcludedPrefixes(m_excludeResultPrefixes);
   	}
   
   	// Shrink the vector of AVTS, if necessary...
  @@ -187,15 +187,42 @@
   }
   
   
  +
  +const NamespacesHandler&
  +ElemLiteralResult::getNamespacesHandler() const
  +{
  +	return m_namespacesHandler;
  +}
  +
  +
  +
  +void
  +ElemLiteralResult::postConstruction(const NamespacesHandler&	theParentHandler)
  +{
  +	const XalanDOMString&	theElementName = getElementName();
  +	assert(length(theElementName) > 0);
   
  -void ElemLiteralResult::execute(
  +	const unsigned int		indexOfNSSep = indexOf(theElementName, ':');
  +
  +	const XalanDOMString	thePrefix = indexOfNSSep < length(theElementName) ?
  +					substring(theElementName, 0, indexOfNSSep) : XalanDOMString();
  +
  +	m_namespacesHandler.postConstruction(thePrefix, &theParentHandler);
  +
  +	ElemUse::postConstruction(m_namespacesHandler);
  +}
  +
  +
  +
  +void
  +ElemLiteralResult::execute(
   			StylesheetExecutionContext&		executionContext,
   			XalanNode*						sourceTree,
   			XalanNode*						sourceNode,
   			const QName&					mode) const
   {
   	executionContext.startElement(toCharArray(getElementName()));
  -	
  +
   	ElemUse::execute(executionContext, sourceTree, sourceNode, mode);
   
   	if(0 != m_avts.size())
  @@ -206,109 +233,36 @@
   		{
   			const AVT* const	avt = m_avts[i];
   
  -			XalanDOMString	stringedValue;
  +			XalanDOMString	theStringedValue;
   
  -			avt->evaluate(stringedValue, sourceNode, *this, executionContext);
  +			avt->evaluate(theStringedValue, sourceNode, *this, executionContext);
   
  -			if(!isEmpty(stringedValue))
  +			if(isEmpty(theStringedValue) == false)
   			{
  -				executionContext.replacePendingAttribute(
  -					c_wstr(avt->getName()), 
  -					c_wstr(avt->getType()),
  -					c_wstr(stringedValue));
  -			}
  -		}
  -	}
  -
  -	// @@@ JMD:
  -	// This logic has been eliminated in the java version and replaced by a
  -	// method 'processResultNS' in the base class ElemTemplateElement
  -	// This also requires implementation of namespace alias logic
  -	const ElemTemplateElement*	elem = this;
  -
  -	const NamespaceVectorType*	nsVector = &elem->getNameSpace();
  +				XalanDOMString		thePrefix;
   
  -	bool more = true;
  -
  -	while(more == true)
  -	{
  -		for (NamespaceVectorType::size_type i = 0; i < nsVector->size(); i++)
  -		{
  -			const NameSpace&	ns = (*nsVector)[i];
  -
  -			if(ns.getResultCandidate() == true)
  -			{
  -				const XalanDOMString&	srcURI = ns.getURI();
  +				const XalanDOMString&	theName = avt->getName();
   
  -				if (!isEmpty(srcURI))
  +				if (startsWith(theName, DOMServices::s_XMLNamespaceWithSeparator) == true)
   				{
  -					const bool		hasPrefix = !isEmpty(ns.getPrefix());
  -
  -					const XalanDOMString	prefix = hasPrefix ? ns.getPrefix() : XalanDOMString();
  -
  -					XalanDOMString	attrName;
  -
  -					if (hasPrefix == true)
  -					{
  -						reserve(attrName, DOMServices::s_XMLNamespaceWithSeparatorLength + length(prefix) + 1);
  -
  -						attrName += DOMServices::s_XMLNamespaceWithSeparator;
  -						attrName += prefix;
  -					}
  -					else
  -					{
  -						attrName = DOMServices::s_XMLNamespace;
  -					}
  -
  -					const XalanDOMString	alias = getStylesheet().getAliasNamespaceURI(srcURI);
  -
  -					const XalanDOMString&	resultURI = length(alias) != 0 ? alias : srcURI;
  -
  -					const bool	isXSLNS =
  -						equals(resultURI, executionContext.getXSLNameSpaceURL()) ||
  -							   0 != getStylesheet().lookupExtensionNSHandler(srcURI) ||
  -							   equals(resultURI, executionContext.getXalanXSLNameSpaceURL());
  -
  -					const XalanDOMString	desturi = executionContext.getResultNamespaceForPrefix(prefix);
  -
  -					if(!isXSLNS && !equals(resultURI, desturi)) // TODO: Check for extension namespaces
  -					{
  -						executionContext.addResultAttribute(attrName, resultURI);
  -					}
  +					thePrefix = substring(theName, DOMServices::s_XMLNamespaceWithSeparatorLength);
   				}
  -			}
  -		}
  -
  -		// We didn't find a namespace, start looking at the parents
  -		if (0 != elem)
  -		{
  -			elem = elem->getParentNodeElem();
   
  -			while(0 != elem)
  -			{
  -				nsVector = &elem->getNameSpace();
  -
  -				if(0 == nsVector->size())
  -					elem = elem->getParentNodeElem();
  -				else
  -					break;
  +				if (isEmpty(thePrefix) == true ||
  +				    shouldExcludeResultNamespaceNode(
  +						thePrefix,
  +						theStringedValue) == false)
  +				{
  +					executionContext.replacePendingAttribute(
  +						c_wstr(avt->getName()), 
  +						c_wstr(avt->getType()),
  +						c_wstr(theStringedValue));
  +				}
   			}
  -
  -			// Last chance, try the stylesheet namespace
  -			if (0 == nsVector || 0 == nsVector->size())
  -				nsVector = &getStylesheet().getNamespaceDecls();
  -			if (0 == nsVector || 0 == nsVector->size())
  -				more = false;
   		}
  -		else
  -			more = false;
   	}
  -/*
  -	java:
  -    // Handle namespaces(including those on the ancestor chain 
  -    // and stylesheet root declarations).
  -    processResultNS(processor);           
  -*/
  +
  +	m_namespacesHandler.outputResultNamespaces(executionContext);
   
   	executeChildren(executionContext, sourceTree, sourceNode, mode);
   
  @@ -349,9 +303,9 @@
   
   			const XalanDOMString	ns = getStylesheet().getNamespaceForPrefixFromStack(prefix);
   
  -			if (equals(ns, constructionContext.getXSLTNamespaceURI()) == true)
  +			if (equals(ns, constructionContext.getXSLTNamespaceURI()) == false)
   			{
  -				isAttrOK = false;
  +				isAttrOK = true;
   			}
   		}
   		else
  @@ -367,35 +321,40 @@
   
   
   
  -void
  +bool
   ElemLiteralResult::processPrefixControl(
  -			const XalanDOMString& localName, 
  -			const XalanDOMString& attrValue) 
  -{                                                                                                                   
  -	if(equals(localName, Constants::ATTRNAME_EXTENSIONELEMENTPREFIXES) ||
  -			equals(localName, Constants::ATTRNAME_EXCLUDE_RESULT_PREFIXES))
  +			StylesheetConstructionContext&	constructionContext,
  +			const Stylesheet&				stylesheetTree,
  +			const XalanDOMString&			localName,
  +			const XalanDOMString&			attrValue)
  +{
  +	if(equals(localName, Constants::ATTRNAME_EXTENSIONELEMENTPREFIXES))
   	{
  -		const XalanDOMString qnames = attrValue;
  -
  -		StringTokenizer tokenizer(qnames, " \t\n\r", false);
  +		m_namespacesHandler.processExtensionElementPrefixes(c_wstr(attrValue), stylesheetTree.getNamespaces(), constructionContext);
   
  -		while(tokenizer.hasMoreTokens() == true)
  -		{
  -			XalanDOMString	prefix = tokenizer.nextToken();
  +		return true;
  +	}
  +	else if (equals(localName, Constants::ATTRNAME_EXCLUDE_RESULT_PREFIXES))
  +	{
  +		m_namespacesHandler.processExcludeResultPrefixes(c_wstr(attrValue), stylesheetTree.getNamespaces(), constructionContext);
   
  -			if(equalsIgnoreCase(prefix, XALAN_STATIC_UCODE_STRING("#default")) == true)
  -			{
  -				clear(prefix);
  -			}
  +		return true;
  +	}
  +	else
  +	{
  +		return false;
  +	}
  +}
   
  -			const XalanDOMString	ns = getStylesheet().getNamespaceForPrefixFromStack(prefix);
   
  -			if(isEmpty(ns) == true)
  -			{
  -				throw SAXException("Invalid prefix in exclude-result-prefixes");
  -			}
   
  -			m_excludeResultPrefixes.insert(String2StringMapType::value_type(prefix, ns));
  -		}
  -	}
  +bool
  +ElemLiteralResult::shouldExcludeResultNamespaceNode(
  +			const XalanDOMString&	thePrefix,
  +			const XalanDOMString&	theURI) const
  +{
  +	return m_namespacesHandler.shouldExcludeResultNamespaceNode(
  +				getStylesheet().getXSLTNamespaceURI(),
  +				thePrefix,
  +				theURI);
   }
  
  
  
  1.11      +44 -22    xml-xalan/c/src/XSLT/ElemLiteralResult.hpp
  
  Index: ElemLiteralResult.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemLiteralResult.hpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- ElemLiteralResult.hpp	2000/08/22 20:21:18	1.10
  +++ ElemLiteralResult.hpp	2000/08/28 01:19:40	1.11
  @@ -65,10 +65,14 @@
   
   
   // Base class header file.
  -#include "ElemUse.hpp"
  +#include <XSLT/ElemUse.hpp>
   
   
   
  +#include <XSLT/NamespacesHandler.hpp>
  +
  +
  +
   class AVT;
   
   
  @@ -101,6 +105,12 @@
   
   	// These methods are inherited from ElemUse ...
   	
  +	virtual const NamespacesHandler&
  +	getNamespacesHandler() const;
  +
  +	virtual void
  +	postConstruction(const NamespacesHandler&	theParentHandler);
  +
   	virtual bool
   	isAttrOK(
   			int						tok,
  @@ -130,37 +140,49 @@
   	ElemLiteralResult&
   	operator=(const ElemLiteralResult&);
   
  +	/**
  +	 * Process the exclude-result-prefixes or the extension-element-prefixes
  +	 * attributes, for the purpose of prefix exclusion.
  +	 *
  +	 * @param constructionContext  context when object consructed
  +	 * @param stylesheetTree The current Stylesheet object.
  +	 * @param localName The local name of the attribute.
  +	 * @param attrValue The value of the attribute.
  +	 */
  +	bool
  +	processPrefixControl(
  +			StylesheetConstructionContext&	constructionContext,
  +			const Stylesheet&				stylesheetTree,
  +			const XalanDOMString&			localName, 
  +			const XalanDOMString&			attrValue);
  +
  +	/**
  +	 * Determine if the namespace node should be excluded.
  +	 *
  +	 * @param executionContext The current execution context
  +	 * @param thePrefix The namespace prefix.
  +	 * @param theURI The namespace URI.
  +	 */
  +	bool
  +	shouldExcludeResultNamespaceNode(
  +			const XalanDOMString&	thePrefix,
  +			const XalanDOMString&	theURI) const;
  +
   #if defined(XALAN_NO_NAMESPACES)
   	typedef vector<const AVT*>				AVTVectorType;
  -	typedef vector<XalanDOMString>			ExtensionElementPrefixesVectorType;
   #else
   	typedef std::vector<const AVT*>			AVTVectorType;
  -	typedef std::vector<XalanDOMString>		ExtensionElementPrefixesVectorType;
   #endif
   
   	/**
  -	 * A stack to keep track of the attribute elements.
  +	 * A vector to keep track of the attribute elements.
   	 */
  -	AVTVectorType							m_avts;
  +	AVTVectorType		m_avts;
   
  -
  -	ExtensionElementPrefixesVectorType		m_extensionElementPrefixes;
  -	
  -	/**
  -	 * This is in support of the exclude-result-prefixes attribute.  It is
  -	 * really needed only at construction time, and so should probably go
  -	 * somewhere else.
  -	 */
  -	String2StringMapType					m_excludeResultPrefixes;
  -
  -	/**
  -	 * Process the exclude-result-prefixes or the extension-element-prefixes
  -	 * attributes, for the purpose of prefix exclusion.
  +	/*
  +	 * This object handles all result tree namespace processing.
   	 */
  -	void
  -	ElemLiteralResult::processPrefixControl(
  -			const XalanDOMString&	localName, 
  -			const XalanDOMString&	attrValue);
  +	NamespacesHandler		m_namespacesHandler;
   };
   
   
  
  
  
  1.7       +1 -1      xml-xalan/c/src/XSLT/ElemTemplate.cpp
  
  Index: ElemTemplate.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplate.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- ElemTemplate.cpp	2000/07/13 22:22:41	1.6
  +++ ElemTemplate.cpp	2000/08/28 01:19:40	1.7
  @@ -157,7 +157,7 @@
   			XalanNode*						sourceTree,
   			XalanNode*						sourceNode,
   			const QName&					mode) const
  -{    
  +{
   	ElemTemplateElement::execute(executionContext, sourceTree, sourceNode, mode);
   
   	executeChildren(executionContext, sourceTree, sourceNode, mode);
  
  
  
  1.31      +112 -206  xml-xalan/c/src/XSLT/ElemTemplateElement.cpp
  
  Index: ElemTemplateElement.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplateElement.cpp,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- ElemTemplateElement.cpp	2000/08/22 20:21:20	1.30
  +++ ElemTemplateElement.cpp	2000/08/28 01:19:40	1.31
  @@ -96,6 +96,7 @@
   #include "ElemForEach.hpp"
   #include "ElemSort.hpp"
   #include "ElemTemplate.hpp"
  +#include "NamespacesHandler.hpp"
   #include "Stylesheet.hpp"
   #include "StylesheetExecutionContext.hpp"
   #include "StylesheetRoot.hpp"
  @@ -127,7 +128,6 @@
   	m_columnNumber(columnNumber),
   	m_defaultSpace(true),
   	m_finishedConstruction(false),
  -	m_namespaces(),
   	m_elemName(name),
   	m_xslToken(xslToken),
   	m_parentNode(0),
  @@ -139,36 +139,6 @@
   	m_baseIndentifier(stylesheetTree.getCurrentIncludeBaseIdentifier())
   {
   	assert(length(m_baseIndentifier) > 0);
  -
  -	/*
  -	 * Copy the stylesheet namespaces to the element namespace vector
  -	 */
  -	const Stylesheet::NamespacesStackType& stylesheetNamespaces =
  -		m_stylesheet.getNamespaces();
  -
  -	const int	n = stylesheetNamespaces.size();
  -
  -	for(int i = (n-1); i >= 0; i--)
  -	{
  -		const Stylesheet::NamespaceVectorType& nsVector = stylesheetNamespaces[i];
  -
  -		for(unsigned int j = 0; j < nsVector.size(); j++)
  -		{
  -			const NameSpace&	ns = nsVector[j];
  -
  -			if(isEmpty(ns.getURI()) == false)
  -			{
  -				if(!shouldExcludeResultNamespaceNode(ns.getPrefix(), ns.getURI()))
  -				{
  -					m_namespaces.push_back(ns);
  -				}
  -				else
  -				{
  -					m_excludedNamespaces.insert(String2StringMapType::value_type(ns.getPrefix(), ns.getURI()));
  -				}
  -			}
  -		}
  -	}
   }
   
   
  @@ -182,6 +152,21 @@
   
   
   
  +const NamespacesHandler&
  +ElemTemplateElement::getNamespacesHandler() const
  +{
  +	if (m_parentNode != 0)
  +	{
  +		return m_parentNode->getNamespacesHandler();
  +	}
  +	else
  +	{
  +		return m_stylesheet.getNamespacesHandler();
  +	}
  +}
  +
  +
  +
   bool
   ElemTemplateElement::isAttrOK(
   			int						tok,
  @@ -332,6 +317,7 @@
   	// a string.
   	DOMStringPrintWriter		thePrintWriter;
   
  +	// Create a FormatterToText.
   	FormatterToText				theFormatter(thePrintWriter);
   
   	// Create an object to set and restore the execution state.
  @@ -913,133 +899,112 @@
   			const QName&				mode,
   			int							xslToken) const
   {
  -	bool				doApplyTemplate = true;
  -	bool				shouldStrip = false;
  -
   	const XalanNode::NodeType	nodeType = child->getNodeType();
   
  -	const Stylesheet*	stylesheetTree = &stylesheet_tree;
  +	if(0 == theTemplate)
  +	{
  +		// Find the XSL template that is the best match for the 
  +		// element, and call buildResultFromTemplate.
  +		const Stylesheet*	foundStylesheet = 0;
   
  -	const bool			isApplyImports = xslToken == Constants::ELEMNAME_APPLY_IMPORTS;
  +		const bool			isApplyImports = xslToken == Constants::ELEMNAME_APPLY_IMPORTS;
   
  -	if(!shouldStrip) // rcw: odd, seems that shouldStripis always false
  -	{
  -		if(0 == theTemplate)
  -		{
  -			// Find the XSL template that is the best match for the 
  -			// element, and call buildResultFromTemplate.
  -			const Stylesheet*	foundStylesheet = 0;
  +		const Stylesheet*	stylesheetTree = isApplyImports ?
  +								&stylesheet_tree :
  +								&getStylesheet().getStylesheetRoot();
   
  -			if(!isApplyImports)
  -			{
  -				
  -				stylesheetTree = &getStylesheet().getStylesheetRoot();
  -			}
  -			
  -			theTemplate = stylesheetTree->findTemplate(executionContext, sourceTree, child, mode,
  -				isApplyImports,	foundStylesheet);
  -			
  -			if(isApplyImports && (0 != theTemplate))
  -			{
  -				stylesheetTree = foundStylesheet;
  -			}
  -			// mode = null; // non-sticky modes
  -		}
  +		theTemplate = stylesheetTree->findTemplate(
  +						executionContext,
  +						sourceTree,
  +						child,
  +						mode,
  +						isApplyImports,
  +						foundStylesheet);
  +	}
   
  -		if(doApplyTemplate)  //rcw: seems to always be true
  +	if(0 == theTemplate)
  +	{
  +		switch(nodeType)
   		{
  -			if(0 == theTemplate)
  -			{
  -				switch(nodeType)
  -				{
  -				case XalanNode::DOCUMENT_FRAGMENT_NODE:
  -				case XalanNode::ELEMENT_NODE:
  -					theTemplate = getStylesheet().getStylesheetRoot().getDefaultRule();
  -					break;
  -
  -				case XalanNode::CDATA_SECTION_NODE:
  -				case XalanNode::TEXT_NODE:
  -				case XalanNode::ATTRIBUTE_NODE:
  -					theTemplate = getStylesheet().getStylesheetRoot().getDefaultTextRule();
  -					break;
  -
  -				case XalanNode::DOCUMENT_NODE:
  -					theTemplate = getStylesheet().getStylesheetRoot().getDefaultRootRule();
  -					break;
  +		case XalanNode::DOCUMENT_FRAGMENT_NODE:
  +		case XalanNode::ELEMENT_NODE:
  +			theTemplate = getStylesheet().getStylesheetRoot().getDefaultRule();
  +			break;
   
  -				default:
  -					break;
  +		case XalanNode::CDATA_SECTION_NODE:
  +		case XalanNode::TEXT_NODE:
  +		case XalanNode::ATTRIBUTE_NODE:
  +			theTemplate = getStylesheet().getStylesheetRoot().getDefaultTextRule();
  +			break;
   
  -				}     
  +		case XalanNode::DOCUMENT_NODE:
  +			theTemplate = getStylesheet().getStylesheetRoot().getDefaultRootRule();
  +			break;
   
  -				if(0 != theTemplate)
  -				{
  -				  // Not sure if this is needed. -sb
  -					stylesheetTree = &getStylesheet().getStylesheetRoot();
  -				}
  -			}
  +		default:
  +			break;
  +		}     
  +	}
   			
  -			if(0 != theTemplate)
  -			{
  -				executionContext.resetCurrentState(sourceTree, child);
  +	if(0 != theTemplate)
  +	{
  +		executionContext.resetCurrentState(sourceTree, child);
   				
  -				if(theTemplate == getStylesheet().getStylesheetRoot().getDefaultTextRule())
  -				{
  -					switch(nodeType)
  -					{
  -					case XalanNode::CDATA_SECTION_NODE:
  -					case XalanNode::TEXT_NODE:
  -						executionContext.cloneToResultTree(
  +		if(theTemplate == getStylesheet().getStylesheetRoot().getDefaultTextRule())
  +		{
  +			switch(nodeType)
  +			{
  +			case XalanNode::CDATA_SECTION_NODE:
  +			case XalanNode::TEXT_NODE:
  +				executionContext.cloneToResultTree(
   							*child, false, false, false);
  -						break;
  +				break;
   
  -					case XalanNode::ATTRIBUTE_NODE:
  -						{
  -							const XalanAttr* const	attr =
  +			case XalanNode::ATTRIBUTE_NODE:
  +				{
  +					const XalanAttr* const	attr =
   #if defined(XALAN_OLD_STYLE_CASTS)
  -								(const XalanAttr*)child;
  +						(const XalanAttr*)child;
   #else
  -								static_cast<const XalanAttr*>(child);
  +						static_cast<const XalanAttr*>(child);
   #endif
   
  -							const XalanDOMString	val = attr->getValue();
  +					const XalanDOMString	val = attr->getValue();
   
  -							executionContext.characters(toCharArray(val), 
  -														0,
  -														length(val));
  -						}
  -						break;
  -
  -					default:
  -						assert(false);
  -						break;
  -					}
  +					executionContext.characters(toCharArray(val), 
  +												0,
  +												length(val));
   				}
  -				else
  -				{
  -					if(0 != executionContext.getTraceListeners())
  -					{
  -						TracerEvent te(executionContext,
  -									   sourceTree,
  -									   child, 
  -										mode,
  -										*theTemplate);
  -
  -						executionContext.fireTraceEvent(te);
  -					}
  -
  -					theTemplate->executeChildren(executionContext, 
  -												 sourceTree,
  -												 child,
  -												 mode);
  -				}
  +				break;
  +
  +			default:
  +				assert(false);
  +				break;
  +			}
  +		}
  +		else
  +		{
  +			if(0 != executionContext.getTraceListeners())
  +			{
  +				TracerEvent te(executionContext,
  +							   sourceTree,
  +							   child, 
  +								mode,
  +								*theTemplate);
   
  -				executionContext.resetCurrentState(sourceTree, selectContext);
  +				executionContext.fireTraceEvent(te);
   			}
  +
  +			theTemplate->executeChildren(executionContext, 
  +										 sourceTree,
  +										 child,
  +										 mode);
   		}
  +
  +		executionContext.resetCurrentState(sourceTree, selectContext);
   	}
   
  -	return doApplyTemplate;
  +	return true;
   }
   
   
  @@ -1370,69 +1335,14 @@
   }
   
   
  -void
  -ElemTemplateElement::removeExcludedPrefixes(const String2StringMapType&		excludeResultPrefixes)
  -{
  -	if(0 !=excludeResultPrefixes.size() && 0 != m_namespaces.size())
  -	{
  -		const NamespaceVectorType::iterator		theEnd =
  -			m_namespaces.end();
  -
  -		for(NamespaceVectorType::iterator it = m_namespaces.begin();
  -				it != theEnd; )
  -		{
  -			const NameSpace&	ns = *it;
   
  -			const XalanDOMString&	prefix = ns.getPrefix();
  -
  -			const String2StringMapType::const_iterator	it2 =
  -				excludeResultPrefixes.find(prefix);
  -
  -			if(it2 != excludeResultPrefixes.end())
  -			{
  -				m_excludedNamespaces.insert(String2StringMapType::value_type(prefix, ns.getURI()));
  -
  -				it = m_namespaces.erase(it);
  -			}
  -			else
  -			{
  -				++it;
  -			}
  -		}
  -	}
  -}
  - 
  -
  - 
  -bool
  -ElemTemplateElement::shouldExcludeResultNamespaceNode(
  -		const XalanDOMString&	prefix,
  -		const XalanDOMString&	uri)
  +void
  +ElemTemplateElement::postConstruction(const NamespacesHandler&	theParentHandler)
   {
  -/*
  -	@@ JMD: Need to implement this ---
  -
  -	if(uri.equals(m_stylesheet.m_XSLNameSpaceURL)
  -			|| (null != m_stylesheet.lookupExtensionNSHandler(uri))
  -			|| uri.equals("http://xml.apache.org/xslt")
  -			|| uri.equals("http://xsl.lotus.com/")
  -			|| uri.equals("http://xsl.lotus.com"))
  -		return true; 
  -	ElemTemplateElement elem = this;
  -	while(0 != elem)
  -	{
  -		elem = elem.m_parentNode;
  -		if(0 == elem)
  -		{
  -			if(0 != m_stylesheet.m_excludeResultPrefixes)
  -			{
  -				if(m_stylesheet.m_excludeResultPrefixes.contains(prefix))
  -					return true;
  -			}
  -		}
  +    for (ElemTemplateElement* node = m_firstChild; node != 0; node = node->m_nextSibling) 
  +    {
  +		node->postConstruction(theParentHandler);
   	}
  -*/
  -	return false;
   }
   
   
  @@ -1575,20 +1485,16 @@
   			 }
   			 else
   			 {
  -				 const ElemTemplateElement*  elem = this;
  -
  -				 while(isEmpty(nameSpace) && elem != 0)
  -				 {
  -					 const NamespaceVectorType&		nsVector = elem->getNameSpace();
  +				 nameSpace = getNamespacesHandler().getNamespace(prefix);
   
  -					 nameSpace = QName::getNamespaceForPrefix(nsVector, prefix);
  -
  -					 if (!isEmpty(nameSpace))
  -						 break;
  -
  -					 elem = elem->getParentNodeElem();
  -				 }
  -			 }
  +				if(isEmpty(nameSpace) == true)
  +				{
  +					 if (m_parentNode != 0)
  +					 {
  +						nameSpace = m_parentNode->getNamespaceForPrefixInternal(prefix, false);
  +					 }
  +				}
  +			}
   		}
   		else
   		{
  
  
  
  1.17      +27 -66    xml-xalan/c/src/XSLT/ElemTemplateElement.hpp
  
  Index: ElemTemplateElement.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplateElement.hpp,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- ElemTemplateElement.hpp	2000/08/22 20:21:20	1.16
  +++ ElemTemplateElement.hpp	2000/08/28 01:19:40	1.17
  @@ -81,7 +81,6 @@
   
   
   #include <XPath/PrefixResolver.hpp>
  -#include <XPath/NameSpace.hpp>
   
   
   
  @@ -90,6 +89,7 @@
   
   
   class AttributeList;
  +class NamespacesHandler;
   class NodeRefListBase;
   class QName;
   class Stylesheet;
  @@ -205,7 +205,7 @@
   	 * Execute the element's primary function.  Subclasses of this function may
   	 * recursively execute down the element tree.
   	 * 
  -	 * @param processor  XSLT Processor
  +	 * @param executionContext  The current execution context
   	 * @param sourceTree input source tree
   	 * @param sourceNode current context node
   	 * @param mode       current mode
  @@ -236,19 +236,7 @@
   	 * Take the contents of a template element, process it, and
   	 * convert it to a string.
   	 * 
  -	 * @exception XSLProcessorException thrown from one of the child execute  
  -	 *                                  methods
  -	 * @exception java.net.MalformedURLException might be thrown from the       
  -	 *                                  document() function, or from xsl:include or xsl:import
  -	 * @exception java.io.FileNotFoundException might be thrown from the        
  -	 *                                  document() function, or from
  -	 *                                  xsl:include or xsl:import
  -	 * @exception java.io.IOException might be thrown from the  document()      
  -	 *                                function, or from xsl:include or
  -	 *                                xsl:import
  -	 * @exception SAXException might be thrown from the  document() function, or
  -	 *                         from xsl:include or xsl:import
  -	 * @param processor  XSLT processor instance
  +	 * @param executionContext  The current execution context
   	 * @param sourceTree primary source tree
   	 * @param sourceNode current source node context
   	 * @param mode       current mode
  @@ -322,24 +310,21 @@
   	}
   
   #if defined(XALAN_NO_NAMESPACES)
  -	typedef	vector<NameSpace>		NamespaceVectorType;
  -	typedef map<XalanDOMString, XalanDOMString, less<XalanDOMString> >	String2StringMapType;
  +	typedef map<XalanDOMString,
  +				XalanDOMString,
  +				less<XalanDOMString> >	StringToStringMapType;
   #else
  -	typedef	std::vector<NameSpace>		NamespaceVectorType;
  -	typedef std::map<XalanDOMString, XalanDOMString>	String2StringMapType;
  -
  +	typedef std::map<XalanDOMString,
  +					 XalanDOMString>	StringToStringMapType;
   #endif
   
   	/** 
  -	 * Get the list of namespaces for this element.
  +	 * Get the namespaces handler for this element.
   	 * 
  -	 * @return vector of namespaces
  +	 * @return The element's NamespacesHandler instance.
   	 */
  -	const NamespaceVectorType&
  -	getNameSpace() const
  -	{
  -		return m_namespaces;
  -	}
  +	virtual const NamespacesHandler&
  +	getNamespacesHandler() const;
   
   	/**
   	 * Retrieve the stylesheet from which this element comes
  @@ -354,22 +339,18 @@
   
   	/** 
   	 * Set a flag indicating construction of the element is completed.
  -	 * 
  -	 * @param bFinished true if construction completed
   	 */
   	void
  -	setFinishedConstruction(bool bFinished)
  +	finishedConstruction()
   	{
  -		m_finishedConstruction = bFinished;
  +		m_finishedConstruction = true;
   	}
   
  -  /**
  -   * Remove any excluded prefixes from the current namespaces.
  -	* 
  -	* @param map of prefixes and associated namespaces to be excluded
  -   */
  -  void removeExcludedPrefixes(const String2StringMapType& excludeResultPrefixes);
  -
  +	/**
  +	 * Called after construction is completed.
  +	 */
  +	virtual void
  +	postConstruction(const NamespacesHandler&	theParentHandler);
   
   	// Type-safe getters/setters...
   
  @@ -671,6 +652,7 @@
   	/**
   	 * Perform a query if needed, and call transformChild for each child.
   	 * 
  +	 * @param executionContext  The current execution context
   	 * @param stylesheetTree The owning stylesheet tree.
   	 * @param xslInstruction The stylesheet element context (deprecated -- I do 
   	 *      not think we need this).
  @@ -700,6 +682,7 @@
   	/**
   	 * Perform a query if needed, and call transformChild for each child.
   	 * 
  +	 * @param executionContext The current execution context
   	 * @param stylesheetTree The owning stylesheet tree.
   	 * @param xslInstruction The stylesheet element context (deprecated -- I do 
   	 *      not think we need this).
  @@ -731,6 +714,7 @@
   	/**
   	 * Perform a query if needed, and call transformChild for each child.
   	 * 
  +	 * @param executionContext The current execution context
   	 * @param stylesheetTree The owning stylesheet tree.
   	 * @param xslInstruction The stylesheet element context (deprecated -- I do 
   	 *      not think we need this).
  @@ -772,26 +756,11 @@
   			const NodeRefListBase&				sourceNodes,
   			unsigned int						sourceNodesCount) const;
   
  -  /**
  -   * Tell if the result namespace decl should be excluded.  Should be called before 
  -   * namespace aliasing (I think).
  -   * TODO: I believe this contains a bug, in that included elements will check with with 
  -   * their including stylesheet, since in this implementation right now the included 
  -   * templates are merged with the including stylesheet.  The XSLT Recommendation says: "The 
  -   * designation of a namespace as an excluded namespace is effective within 
  -   * the subtree of the stylesheet rooted at the element bearing the 
  -   * <code>exclude-result-prefixes</code> or <code>xsl:exclude-result-prefixes</code> 
  -   * attribute; a subtree rooted at an <code>xsl:stylesheet</code> element
  -   * does not include any stylesheets imported or included by children
  -   * of that <code>xsl:stylesheet</code> element."
  -   */
  -  bool shouldExcludeResultNamespaceNode(
  -		  const XalanDOMString& prefix, const XalanDOMString& uri);
  -
   	/**
   	 * Given an element and mode, find the corresponding
   	 * template and process the contents.
   	 * 
  +	 * @param executionContext The current execution context
   	 * @param stylesheetTree The current Stylesheet object.
   	 * @param xslInstruction The calling element (deprecated -- I dont think we 
   	 *      need this).
  @@ -831,6 +800,10 @@
   	virtual bool
   	childTypeAllowed(int	xslToken) const;
   
  +protected:
  +
  +	bool					m_finishedConstruction;
  +
   private:
   
   	Stylesheet&				m_stylesheet;
  @@ -838,19 +811,7 @@
   	const int				m_lineNumber;
   	const int				m_columnNumber;
   
  -	NamespaceVectorType 	m_namespaces;
  -
  -	/** 
  -	 * The table of namespaces that are excluded from being 
  -	 * used in the result tree but which need to be used 
  -	 * in to resolve prefixes.
  -	 * @serial
  -	 */
  -	String2StringMapType	m_excludedNamespaces;
  -
   	bool					m_defaultSpace;
  -	bool					m_finishedConstruction;
  -
   	const XalanDOMString	m_elemName;
   
   	const int				m_xslToken;
  
  
  
  1.34      +57 -4     xml-xalan/c/src/XSLT/Stylesheet.cpp
  
  Index: Stylesheet.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/Stylesheet.cpp,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- Stylesheet.cpp	2000/08/22 20:21:26	1.33
  +++ Stylesheet.cpp	2000/08/28 01:19:41	1.34
  @@ -144,11 +144,13 @@
   	m_surrogateChildren(*this),
   	m_fakeAttributes(),
   	m_elemDecimalFormats(),
  -	m_prefixAliases()
  +	m_prefixAliases(),
  +	m_namespacesHandler()
   {
   	if (length(m_baseIdent) != 0)
   	{
   		const XalanDOMString urlString = constructionContext.getURLStringFromString(m_baseIdent);
  +
   		if (length(urlString) != 0)
   		{
   			m_includeStack.push_back(urlString);
  @@ -321,6 +323,41 @@
   
   
   
  +void
  +Stylesheet::postConstruction()
  +{
  +	// Get any aliases from the imported stylesheets, in reverse order, to
  +	// preserve import precedence.
  +	const StylesheetVectorType::reverse_iterator	theEnd = m_imports.rend();
  +	StylesheetVectorType::reverse_iterator	i = m_imports.rbegin();
  +
  +	while(i != theEnd)
  +	{
  +		m_namespacesHandler.copyNamespaceAliases((*i)->getNamespacesHandler());
  +
  +		++i;
  +	}
  +
  +	// Call postConstruction() on our own handler...
  +	m_namespacesHandler.postConstruction();
  +
  +	ElemTemplateElement* node = m_firstTemplate;
  +
  +    for (; node != 0; node = node->getNextSiblingElem()) 
  +    {
  +		node->postConstruction(m_namespacesHandler);
  +	}
  +
  +	node = m_wrapperlessTemplate;
  +
  +    for (; node != 0; node = node->getNextSiblingElem())
  +    {
  +		node->postConstruction(m_namespacesHandler);
  +	}
  +}
  +
  +
  +
   bool
   Stylesheet::isAttrOK(
   			const XalanDOMChar* 			attrName,
  @@ -1068,11 +1105,14 @@
   			ExtensionNSHandler*		nsh)
   {
   	m_extensionNamespaces.insert(ExtensionNamespacesMapType::value_type(uri, nsh));
  +
  +	m_namespacesHandler.addExtensionNamespaceURI(uri);
   }
   
   
   
  -void Stylesheet::pushTopLevelVariables(
  +void
  +Stylesheet::pushTopLevelVariables(
   			StylesheetExecutionContext& 	executionContext,
   			const ParamVectorType&			topLevelParams) const
   {
  @@ -1228,6 +1268,8 @@
   #if 1
   		// $$$ ToDo: Enable other code.  Perhaps an error?
   		m_prefixAliases[stylesheetNamespace] = resultNamespace;
  +
  +		m_namespacesHandler.setNamespaceAlias(stylesheetNamespace, resultNamespace);
   #else
   		const PrefixAliasesMapType::iterator	i =
   			m_prefixAliases.find(stylesheetNamespace);
  @@ -1256,7 +1298,7 @@
   {
   	XalanDOMString	result;
   
  -	const PrefixAliasesMapType::const_iterator	i =
  +	const StringToStringMapType::const_iterator	i =
   		m_prefixAliases.find(uri);
   
   	if (i != m_prefixAliases.end())
  @@ -1286,6 +1328,16 @@
   
   
   
  +void
  +Stylesheet::processExcludeResultPrefixes(
  +		const XalanDOMChar*				theValue,
  +		StylesheetConstructionContext&	theConstructionContext)
  +{
  +	m_namespacesHandler.processExcludeResultPrefixes(theValue, m_namespaces, theConstructionContext);
  +}
  +
  +
  +
   const Stylesheet*
   Stylesheet::getPreviousImport(const Stylesheet*		stylesheet) const
   {
  @@ -1395,7 +1447,8 @@
    * contain the same attribute unless there is a definition of the attribute 
    * set with higher import precedence that also contains the attribute."
    */
  -void Stylesheet::applyAttrSets(
  +void
  +Stylesheet::applyAttrSets(
   			const QNameVectorType&			attributeSetsNames, 
   			StylesheetExecutionContext& 	executionContext, 
   			XalanNode*						sourceTree, 
  
  
  
  1.25      +49 -10    xml-xalan/c/src/XSLT/Stylesheet.hpp
  
  Index: Stylesheet.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/Stylesheet.hpp,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- Stylesheet.hpp	2000/08/22 20:21:26	1.24
  +++ Stylesheet.hpp	2000/08/28 01:19:41	1.25
  @@ -85,6 +85,7 @@
   
   
   
  +#include "NamespacesHandler.hpp"
   #include "KeyDeclaration.hpp"
   #include "StylesheetExecutionContext.hpp"
   
  @@ -120,10 +121,14 @@
   
   public:
   
  +	typedef StylesheetExecutionContext::ParamVectorType		ParamVectorType;
  +	typedef NamespacesHandler::NamespaceVectorType			NamespaceVectorType;
  +	typedef NamespacesHandler::NamespacesStackType			NamespacesStackType;
  +
   #if defined(XALAN_NO_NAMESPACES)
   	typedef map<XalanDOMString,
   				XalanDOMString,
  -				less<XalanDOMString> >				PrefixAliasesMapType;
  +				less<XalanDOMString> >				StringToStringMapType;
   	typedef map<XalanDOMString,
   				ExtensionNSHandler*,
   				less<XalanDOMString> >				ExtensionNamespacesMapType;
  @@ -137,15 +142,13 @@
   	typedef map<const XalanNode*,
   				KeyTable*,
   				less<const XalanNode*> >			KeyTablesTableType;
  -	typedef vector<NameSpace> 						NamespaceVectorType;
  -	typedef vector<NamespaceVectorType>				NamespacesStackType;
   	typedef vector<QName> 							QNameVectorType;
   	typedef vector<const Stylesheet*>				StylesheetVectorType;
   	typedef vector<XalanDOMString>					URLStackType;
   	typedef vector<const XPath*>					XPathVectorType;
   	typedef vector<ElemDecimalFormat*>				ElemDecimalFormatVectorType;
   #else
  -	typedef std::map<XalanDOMString, XalanDOMString>		PrefixAliasesMapType;
  +	typedef std::map<XalanDOMString, XalanDOMString>		StringToStringMapType;
   	typedef std::map<XalanDOMString, ExtensionNSHandler*>	ExtensionNamespacesMapType;
   	typedef std::map<QName, ElemTemplate*>					ElemTemplateMapType;
   	typedef std::vector<ElemAttributeSet*> 					AttributeSetMapType;
  @@ -153,8 +156,6 @@
   	typedef std::vector<KeyDeclaration>						KeyDeclarationVectorType;
   	typedef std::vector<KeyTable*> 							KeyTableVectorType;
   	typedef std::map<const XalanNode*, KeyTable*>			KeyTablesTableType;
  -	typedef std::vector<NameSpace> 							NamespaceVectorType;
  -	typedef std::vector<NamespaceVectorType>				NamespacesStackType;
   	typedef std::vector<QName> 								QNameVectorType;
   	typedef std::vector<const Stylesheet*>					StylesheetVectorType;
   	typedef std::vector<XalanDOMString>						URLStackType;
  @@ -162,9 +163,6 @@
   	typedef std::vector<ElemDecimalFormat*>					ElemDecimalFormatVectorType;
   #endif
   
  -
  -	typedef StylesheetExecutionContext::ParamVectorType	ParamVectorType;
  -
   	/**
   	 * Constructor for a Stylesheet needs a Document.
   	 * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide 
  @@ -267,6 +265,18 @@
   		return m_namespaces;
   	}
   
  +	const NamespacesHandler&
  +	getNamespacesHandler() const
  +	{
  +		return m_namespacesHandler;
  +	}
  +
  +	NamespacesHandler&
  +	getNamespacesHandler()
  +	{
  +		return m_namespacesHandler;
  +	}
  +
   	/**
   	 * Retrieve the list of namespace declarations currently in effect
   	 * 
  @@ -322,6 +332,12 @@
   	void
   	popNamespaces();
   
  +	/**
  +	 * Called after construction is completed.
  +	 */
  +	virtual void
  +	postConstruction();
  +
   	/** 
   	 * See if this is a xmlns attribute, and, if so, process it.
   	 * 
  @@ -367,6 +383,18 @@
   	getAliasNamespaceURI(const XalanDOMString&	uri) const;
   
   	/**
  +	 * See if a namespace should be excluded.
  +	 * 
  +	 * @param theValue the prefix of the namespace.
  +	 * @param theConstructionContext the current construction context.
  +	 * @return
  +	 */
  +	void
  +	processExcludeResultPrefixes(
  +		const XalanDOMChar*				theValue,
  +		StylesheetConstructionContext&	theConstructionContext);
  +
  +	/**
   	 * This recursive function is called starting from the
   	 * stylesheet root, and tries to find a match for the
   	 * passed stylesheet, and then will return the previous
  @@ -1139,6 +1167,15 @@
   
   private:	
   
  +	// Not defined...
  +	Stylesheet(const Stylesheet&);
  +
  +	Stylesheet&
  +	operator=(const Stylesheet&);
  +
  +	bool
  +	operator==(const Stylesheet&) const;
  +
   	/**
   	 * The full XSLT Namespace URI.  To be replaced by the one actually
   	 * found.
  @@ -1281,8 +1318,10 @@
   	XalanEmptyNamedNodeMap	m_fakeAttributes;
   
   	ElemDecimalFormatVectorType		m_elemDecimalFormats;
  +
  +	StringToStringMapType			m_prefixAliases;
   
  -	PrefixAliasesMapType	m_prefixAliases;
  +	NamespacesHandler		m_namespacesHandler;
   };
   
   
  
  
  
  1.30      +2 -2      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.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- StylesheetExecutionContext.hpp	2000/08/22 20:21:27	1.29
  +++ StylesheetExecutionContext.hpp	2000/08/28 01:19:41	1.30
  @@ -569,7 +569,7 @@
   	 * 
   	 * @param theNamespace namespace for prefix
   	 */
  -	virtual XalanDOMString
  +	virtual const XalanDOMString&
   	getResultPrefixForNamespace(const XalanDOMString&	theNamespace) const = 0;
   
   	/**
  @@ -577,7 +577,7 @@
   	 * 
   	 * @param thePrefix prefix for namespace
   	 */
  -	virtual XalanDOMString
  +	virtual const XalanDOMString&
   	getResultNamespaceForPrefix(const XalanDOMString&	thePrefix) const = 0;
   
   	/**
  
  
  
  1.32      +2 -2      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.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- StylesheetExecutionContextDefault.cpp	2000/08/22 20:21:27	1.31
  +++ StylesheetExecutionContextDefault.cpp	2000/08/28 01:19:41	1.32
  @@ -324,7 +324,7 @@
   
   
   
  -XalanDOMString
  +const XalanDOMString&
   StylesheetExecutionContextDefault::getResultPrefixForNamespace(
   			const XalanDOMString&	theNamespace) const
   {
  @@ -333,7 +333,7 @@
   
   
   
  -XalanDOMString
  +const XalanDOMString&
   StylesheetExecutionContextDefault::getResultNamespaceForPrefix(const XalanDOMString&	thePrefix) const
   {
   	return m_xsltProcessor.getResultNamespaceForPrefix(thePrefix);
  
  
  
  1.31      +2 -2      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.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- StylesheetExecutionContextDefault.hpp	2000/08/22 20:21:28	1.30
  +++ StylesheetExecutionContextDefault.hpp	2000/08/28 01:19:41	1.31
  @@ -174,10 +174,10 @@
   			const XalanNode&	src,
   			bool				srcIsStylesheetTree);
   
  -	virtual XalanDOMString
  +	virtual const XalanDOMString&
   	getResultPrefixForNamespace(const XalanDOMString&	theNamespace) const;
   
  -	virtual XalanDOMString
  +	virtual const XalanDOMString&
   	getResultNamespaceForPrefix(const XalanDOMString&	thePrefix) const;
   
   	virtual XalanDOMString
  
  
  
  1.40      +8 -14     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.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- StylesheetHandler.cpp	2000/08/22 23:27:58	1.39
  +++ StylesheetHandler.cpp	2000/08/28 01:19:41	1.40
  @@ -548,18 +548,7 @@
   						}
   						else if(equals(aname, Constants::ATTRNAME_EXCLUDE_RESULT_PREFIXES))
   						{
  -							m_constructionContext.warn(Constants::ATTRNAME_EXCLUDE_RESULT_PREFIXES
  -									+ " not supported yet!");
  -
  -						/*
  -							@@ TODO: implement this ---
  -							StringToStringTable excluded =
  -								m_stylesheet.getExcludeResultPrefixes();
  -							excluded =
  -								m_stylesheet.processExcludeResultPrefixes(atts.getValue(i),
  -										excluded);
  -							m_stylesheet.setExcludeResultPrefixes(excluded);
  -						*/
  +							m_stylesheet.processExcludeResultPrefixes(atts.getValue(i), m_constructionContext);
   						}
   						else if(equals(aname, Constants::ATTRNAME_EXTENSIONELEMENTPREFIXES))
   						{
  @@ -1202,6 +1191,8 @@
   
   			m_constructionContext.parseXML(hrefUrl, &tp, importedStylesheet.get());
   
  +			importedStylesheet->postConstruction();
  +
   			// Add it to the front of the imports, releasing the XalanAutoPtr...
   			m_stylesheet.addImport(importedStylesheet.release(), true);
   
  @@ -1290,7 +1281,7 @@
   	m_lastPopped = m_elemStack.back();
   	m_elemStack.pop_back();
   	m_elemStackParentedElements.erase(m_lastPopped);
  -	m_lastPopped->setFinishedConstruction(true);
  +	m_lastPopped->finishedConstruction();
   
   	const int tok = m_lastPopped->getXSLToken();
   
  @@ -1628,7 +1619,8 @@
   	m_XSLNameSpaceURL(theHandler.m_stylesheet.getXSLTNamespaceURI()),
   	m_foundNotImport(theHandler.m_foundNotImport),
   	m_namespaceDecls(),
  -	m_namespaces()
  +	m_namespaces(),
  +	m_namespacesHandler()
   {
   	m_handler.m_elemStack.clear();
   	m_handler.m_pTemplate = 0;
  @@ -1641,6 +1633,7 @@
   	// underlying data.  This clears out the stack as well...
   	m_namespaceDecls.swap(theHandler.m_stylesheet.getNamespaceDecls());
   	m_namespaces.swap(theHandler.m_stylesheet.getNamespaces());
  +	m_namespacesHandler.swap(theHandler.m_stylesheet.getNamespacesHandler());
   }
   
   
  @@ -1670,4 +1663,5 @@
   	// underlying data.
   	m_handler.m_stylesheet.getNamespaceDecls().swap(m_namespaceDecls);
   	m_handler.m_stylesheet.getNamespaces().swap(m_namespaces);
  +	m_handler.m_stylesheet.getNamespacesHandler().swap(m_namespacesHandler);
   }
  
  
  
  1.18      +3 -0      xml-xalan/c/src/XSLT/StylesheetHandler.hpp
  
  Index: StylesheetHandler.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.hpp,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- StylesheetHandler.hpp	2000/08/23 20:16:45	1.17
  +++ StylesheetHandler.hpp	2000/08/28 01:19:41	1.18
  @@ -79,6 +79,7 @@
   
   
   
  +#include <XSLT/NamespacesHandler.hpp>
   #include <XSLT/Stylesheet.hpp>
   
   
  @@ -520,6 +521,8 @@
   		Stylesheet::NamespaceVectorType		m_namespaceDecls;
   
   		Stylesheet::NamespacesStackType		m_namespaces;
  +
  +		NamespacesHandler					m_namespacesHandler;
   	};
   
   	friend class PushPopIncludeState;
  
  
  
  1.59      +8 -2      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.58
  retrieving revision 1.59
  diff -u -r1.58 -r1.59
  --- XSLTEngineImpl.cpp	2000/08/22 20:21:31	1.58
  +++ XSLTEngineImpl.cpp	2000/08/28 01:19:41	1.59
  @@ -582,6 +582,8 @@
   				if(0 != m_diagnosticsPrintWriter)
   					displayDuration(XALAN_STATIC_UCODE_STRING("Parse of ") + xslIdentifier, &xslIdentifier);
   			}
  +
  +			theStylesheet->postConstruction();
   		}
   		catch(const XSLException&)
   		{
  @@ -881,6 +883,8 @@
   			displayDuration(XalanDOMString(XALAN_STATIC_UCODE_STRING("Setup of ")) +
   								localXSLURLString,
   								&frag);
  +
  +			stylesheet->postConstruction();
   		}
   		else
   		{
  @@ -925,6 +929,8 @@
   
   		m_parserLiaison.parseXMLStream(inputSource, stylesheetProcessor);
   
  +		stylesheet->postConstruction();
  +
   		displayDuration("Parsing and init of " + localXSLURLString, &localXSLURLString);
   	}
   
  @@ -2330,7 +2336,7 @@
   
   
   
  -XalanDOMString
  +const XalanDOMString&
   XSLTEngineImpl::getResultNamespaceForPrefix(const XalanDOMString&	prefix) const
   {
   	// Search vector from first element back
  @@ -2339,7 +2345,7 @@
     
   
   
  -XalanDOMString
  +const XalanDOMString&
   XSLTEngineImpl::getResultPrefixForNamespace(const XalanDOMString&	theNamespace) const
   {
   	// Search vector from first element back
  
  
  
  1.45      +2 -2      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.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- XSLTEngineImpl.hpp	2000/08/22 20:21:31	1.44
  +++ XSLTEngineImpl.hpp	2000/08/28 01:19:41	1.45
  @@ -812,7 +812,7 @@
   	 * @param prefix prefix for namespace
   	 * @return string for namespace URI
   	 */
  -	XalanDOMString
  +	const XalanDOMString&
   	getResultNamespaceForPrefix(const XalanDOMString&	prefix) const;
     
   	/**
  @@ -821,7 +821,7 @@
   	 * @param theNamespace namespace for prefix
   	 * @return string for namespace prefix
   	 */
  -	XalanDOMString
  +	const XalanDOMString&
   	getResultPrefixForNamespace(const XalanDOMString&	theNamespace) const;
   
   	/**
  
  
  
  1.1                  xml-xalan/c/src/XSLT/NamespacesHandler.cpp
  
  Index: NamespacesHandler.cpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2000 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, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * $ Id: $
   *
   */
  
  
  // Class header file...
  #include "NamespacesHandler.hpp"
  
  
  
  #include <PlatformSupport/StringTokenizer.hpp>
  
  
  
  #include <DOMSupport/DOMServices.hpp>
  
  
  
  #include <XPath/QName.hpp>
  
  
  
  #include "Constants.hpp"
  #include "StylesheetConstructionContext.hpp"
  #include "StylesheetExecutionContext.hpp"
  
  
  
  const XalanDOMString	NamespacesHandler::s_dummyEmptyString;
  
  
  
  NamespacesHandler::NamespacesHandler() :
  	m_excludedResultPrefixes(),
  	m_namespaceDeclarations(),
  	m_extensionNamespaceURIs(),
  	m_namespaceAliases()
  {
  }
  
  
  
  NamespacesHandler::NamespacesHandler(
  			const NamespacesHandler&	stylesheetNamespacesHandler,
  			const NamespacesStackType&	theCurrentNamespaces,
  			const XalanDOMString&		theXSLTNamespaceURI) :
  	m_excludedResultPrefixes(),
  	m_namespaceDeclarations(),
  	m_extensionNamespaceURIs(),
  	m_namespaceAliases()
  {
  	// Go through the namespaces stack in reverse order...
  	const NamespacesStackType::const_reverse_iterator	theEnd =
  		theCurrentNamespaces.rend();
  
  	NamespacesStackType::const_reverse_iterator		i =
  		theCurrentNamespaces.rbegin();
  
  	for(; i != theEnd; ++i)
  	{
  		// Process each namespace in the current vector...
  		const NamespaceVectorType::const_iterator	theVectorEnd =
  			(*i).end();
  
  		NamespaceVectorType::const_iterator			j =
  			(*i).begin();
  
  		for(; j != theVectorEnd; ++j)
  		{
  			const NameSpace&		theNamespace = *j;
  
  			const XalanDOMString&	theURI = theNamespace.getURI();
  			assert(length(theURI) > 0);
  
  			const XalanDOMString&	thePrefix = theNamespace.getPrefix();
  
  			if(shouldExcludeResultNamespaceNode(
  					theXSLTNamespaceURI,
  					stylesheetNamespacesHandler,
  					theNamespace) == false)
  			{
  				if (m_namespaceDeclarations.count(thePrefix) == 0)
  				{
  					m_namespaceDeclarations.insert(NamespacesMapType::value_type(thePrefix, theNamespace));
  				}
  			}
  			else
  			{
  				m_excludedResultPrefixes.insert(
  						ExcludedResultPrefixesMapType::value_type(thePrefix, theURI));
  			}
  		}
  	}
  }
  
  
  
  NamespacesHandler::NamespacesHandler(const NamespacesHandler&	theSource) :
  	m_excludedResultPrefixes(theSource.m_excludedResultPrefixes),
  	m_namespaceDeclarations(theSource.m_namespaceDeclarations),
  	m_extensionNamespaceURIs(theSource.m_extensionNamespaceURIs),
  	m_namespaceAliases(theSource.m_namespaceAliases)
  {
  }
  
  
  
  NamespacesHandler::~NamespacesHandler()
  {
  }
  
  
  
  const XalanDOMString&
  NamespacesHandler::getNamespace(const XalanDOMString&	thePrefix) const
  {
  	// Check the excluded result prefixes first...
  	const ExcludedResultPrefixesMapType::const_iterator		i =
  			m_excludedResultPrefixes.find(thePrefix);
  
  	if (i != m_excludedResultPrefixes.end())
  	{
  		return (*i).second;
  	}
  	else
  	{
  		// Not found, so check the namespace declarations...
  		const NamespacesMapType::const_iterator		i =
  				m_namespaceDeclarations.find(thePrefix);
  
  		if (i != m_namespaceDeclarations.end())
  		{
  			return (*i).second.getURI();
  		}
  		else
  		{
  			return s_dummyEmptyString;
  		}
  	}
  }
  
  
  
  void
  NamespacesHandler::copyNamespaceAliases(const NamespacesHandler&	parentNamespacesHandler)
  {
  	copyNamespaceAliases(parentNamespacesHandler.m_namespaceAliases);
  }
  
  
  
  const XalanDOMString&
  NamespacesHandler::getNamespaceAlias(const XalanDOMString&		theStylesheetNamespace) const
  {
  	if (m_namespaceAliases.size() == 0)
  	{
  		return s_dummyEmptyString;
  	}
  	else
  	{
  		const NamespaceAliasesMapType::const_iterator	i =
  						m_namespaceAliases.find(theStylesheetNamespace);
  
  		if (i != m_namespaceAliases.end())
  		{
  			return (*i).second;
  		}
  		else
  		{
  			return s_dummyEmptyString;
  		}
  	}
  }
  
  
  
  void
  NamespacesHandler::processExcludeResultPrefixes(
  		const XalanDOMChar*				theValue,
  		const NamespacesStackType&		theCurrentNamespaces,
  		StylesheetConstructionContext&	theConstructionContext)
  {
  	StringTokenizer		tokenizer(
  					theValue,
  					XALAN_STATIC_UCODE_STRING(" \t\n\r"),
  					false);
  
      while(tokenizer.hasMoreTokens() == true)
      {
  		XalanDOMString	thePrefix = tokenizer.nextToken();
  
  		if(equalsIgnoreCase(thePrefix, Constants::ATTRVAL_DEFAULT_PREFIX) == true)
  		{
  			::clear(thePrefix);
  		}
  
  		const XalanDOMString&	theNamespace =
  			QName::getNamespaceForPrefix(theCurrentNamespaces, thePrefix);
  
  		if(length(theNamespace) == 0)
  		{
  			XalanDOMString	theMessage("Invalid prefix in exclude-result-prefixes: ");
  
  			theMessage += thePrefix;
  
  			theConstructionContext.error(theMessage);
  		}
  
  		m_excludedResultPrefixes[thePrefix] = theNamespace;
      }
  }
  
  
  
  void
  NamespacesHandler::processExtensionElementPrefixes(
  			const XalanDOMChar*				theValue,
  			const NamespacesStackType&		theCurrentNamespaces,
  			StylesheetConstructionContext&	theConstructionContext)
  {
  	StringTokenizer		tokenizer(
  					theValue,
  					XALAN_STATIC_UCODE_STRING(" \t\n\r"),
  					false);
  
      while(tokenizer.hasMoreTokens() == true)
      {
  		XalanDOMString	thePrefix = tokenizer.nextToken();
  
  		if(equalsIgnoreCase(thePrefix, Constants::ATTRVAL_DEFAULT_PREFIX) == true)
  		{
  			::clear(thePrefix);
  		}
  
  		const XalanDOMString&	theNamespace =
  			QName::getNamespaceForPrefix(theCurrentNamespaces, thePrefix);
  
  		if(length(theNamespace) == 0)
  		{
  			XalanDOMString	theMessage("Invalid prefix in extension-element-prefixes: ");
  
  			theMessage += thePrefix;
  
  			theConstructionContext.error(theMessage);
  		}
  
  		m_extensionNamespaceURIs.insert(theNamespace);
      }
  }
  
  
  
  void
  NamespacesHandler::postConstruction(
  			const XalanDOMString&		theElementName,
  			const NamespacesHandler*	parentNamespacesHandler)
  {
  	// Copy everything from the parent handler, if there is one...
  	if (parentNamespacesHandler != 0)
  	{
  		copyNamespaceAliases(parentNamespacesHandler->m_namespaceAliases);
  
  		copyExtensionNamespaceURIs(parentNamespacesHandler->m_extensionNamespaceURIs);
  
  		copyExcludeResultPrefixes(parentNamespacesHandler->m_excludedResultPrefixes);
  	}
  
  	// Figure out the prefix of the owning element, to make sure we
  	// don't exclude it's prefix.
  	const unsigned int		indexOfNSSep = indexOf(theElementName, ':');
  
  	const XalanDOMString	thePrefix = indexOfNSSep < length(theElementName) ?
  					substring(theElementName, 0, indexOfNSSep) : XalanDOMString();
  
  	processExcludeResultPrefixes(thePrefix);
  
  	// $$ ToDo: Does this happen before or after exclude-result-prefixes?
  	processNamespaceAliases();
  
  	createResultAttributeNames();
  }
  
  
  
  NamespacesHandler&
  NamespacesHandler::operator=(const NamespacesHandler&	theRHS)
  {
  	if (&theRHS != this)
  	{
  		m_excludedResultPrefixes = theRHS.m_excludedResultPrefixes;
  
  		m_namespaceDeclarations = theRHS.m_namespaceDeclarations;
  
  		m_extensionNamespaceURIs = theRHS.m_extensionNamespaceURIs;
  
  		m_namespaceAliases = theRHS.m_namespaceAliases;
  	}
  
  	return *this;
  }
  
  
  
  bool
  NamespacesHandler::shouldExcludeResultNamespaceNode(
  			const XalanDOMString&	theXSLTNamespaceURI,
  			const XalanDOMString&	thePrefix,
  			const XalanDOMString&	theURI) const
  {
  	// These are commone namespaces that are always excluded...
  	if(equals(theURI, theXSLTNamespaceURI)
  			|| m_extensionNamespaceURIs.find(theURI) != m_extensionNamespaceURIs.end()
  			|| equals(theURI, XALAN_STATIC_UCODE_STRING("http://xml.apache.org/xslt"))
  			|| equals(theURI, XALAN_STATIC_UCODE_STRING("http://xsl.lotus.com/"))
  			|| equals(theURI, XALAN_STATIC_UCODE_STRING("http://xsl.lotus.com")))
  	{
  		return true;
  	}
  	else if (m_excludedResultPrefixes.count(thePrefix) != 0)
  	{
  		// It was found in the excluded result prefixes...
  		return true;
  	}
  	else
  	{
  		return false;
  	}
  }
  
  
  
  void
  NamespacesHandler::outputResultNamespaces(StylesheetExecutionContext&	theExecutionContext) const
  {
  	// Write out the namespace declarations...
  	if (m_namespaceDeclarations.size() > 0)
  	{
  		const NamespacesMapType::const_iterator	theEnd =
  				m_namespaceDeclarations.end();
  
  		NamespacesMapType::const_iterator	i =
  				m_namespaceDeclarations.begin();
  
  		for(; i != theEnd; ++i)
  		{
  			const NameSpaceExtended&	theNamespace = (*i).second;
  
  			const XalanDOMString&		theResultURI = theNamespace.getURI();
  			assert(length(theResultURI) > 0);
  			assert(length(theNamespace.getResultAttributeName()) > 0);
  
  			const XalanDOMString&		thePrefix = theNamespace.getPrefix();
  
  			// Get the any namespace declaration currently active for the
  			// prefix.
  			const XalanDOMString&		desturi =
  				theExecutionContext.getResultNamespaceForPrefix(thePrefix);
  
  			// Is there already an active namespace declaration?
  			if(!equals(theResultURI, desturi))
  			{
  				// No, so add one...
  				theExecutionContext.addResultAttribute(theNamespace.getResultAttributeName(), theResultURI);
  			}
  		}
  	}
  }
  
  
  
  bool
  NamespacesHandler::shouldExcludeResultNamespaceNode(
  			const XalanDOMString&		theXSLTNamespaceURI,
  			const NamespacesHandler&	stylesheetNamespacesHandler,
  			const NameSpace&			theNamespace) const
  {
  	const XalanDOMString&	thePrefix = theNamespace.getPrefix();
  	const XalanDOMString&	theURI = theNamespace.getURI();
  
  	
  	if(shouldExcludeResultNamespaceNode(theXSLTNamespaceURI, thePrefix, theURI) == true)
  	{
  		return true;
  	}
  	else
  	{
  		// $$$ ToDo: Ask Scott what this code does...
  #if 0
  		const ElemTemplateElement*	elem = this;
  
  		while(0 != elem)
  		{
  			elem = elem->getParentNodeElem();
  
  			if(0 == elem)
  			{
  				return getStylesheet().shouldExcludeResultNamespace(prefix);
  			}
  		}
  	}
  
  	return false;
  #else
  
  		return stylesheetNamespacesHandler.hasExcludedPrefix(theNamespace.getPrefix());
  	}
  #endif
  }
  
  
  
  void
  NamespacesHandler::clear()
  {
  	m_excludedResultPrefixes.clear();
  
  	m_namespaceDeclarations.clear();
  
  	m_extensionNamespaceURIs.clear();
  
  	m_namespaceAliases.clear();
  }
  
  
  
  void
  NamespacesHandler::swap(NamespacesHandler&	theOther)
  {
  	m_excludedResultPrefixes.swap(theOther.m_excludedResultPrefixes);
  
  	m_namespaceDeclarations.swap(theOther.m_namespaceDeclarations);
  
  	m_extensionNamespaceURIs.swap(theOther.m_extensionNamespaceURIs);
  
  	m_namespaceAliases.swap(theOther.m_namespaceAliases);
  }
  
  
  
  void
  NamespacesHandler::createResultAttributeNames()
  {
  	// Go through all of the result namespaces and create the attribute
  	// name that will be used when they're written to the result tree.
  	// This is more efficient if the stylesheet is used multiple times.
  	if (m_namespaceDeclarations.size() > 0)
  	{
  		const NamespacesMapType::iterator	theEnd =
  				m_namespaceDeclarations.end();
  
  		NamespacesMapType::iterator		i =
  				m_namespaceDeclarations.begin();
  
  		for(; i != theEnd; ++i)
  		{
  			NameSpaceExtended&		theNamespace = (*i).second;
  
  			const XalanDOMString&	thePrefix = theNamespace.getPrefix();
  
  			if (isEmpty(thePrefix) == false)
  			{
  				// Create a name of the form xmlns:prefix, where "prefix" is the
  				// text of the prefix.
  				XalanDOMString	theName;
  
  				// Reserve the appropriate amount of space in the string.
  				reserve(theName, DOMServices::s_XMLNamespaceWithSeparatorLength + length(thePrefix) + 1);
  
  				theName += DOMServices::s_XMLNamespaceWithSeparator;
  				theName += thePrefix;
  
  				theNamespace.setResultAttributeName(theName);
  			}
  			else
  			{
  				// It's the default namespace...
  				theNamespace.setResultAttributeName(DOMServices::s_XMLNamespace);
  			}
  		}
  	}
  }
  
  
  
  void
  NamespacesHandler::processExcludeResultPrefixes(const XalanDOMString&	theElementPrefix)
  {
  	if (m_excludedResultPrefixes.size() > 0)
  	{
  		const NamespacesMapType::iterator	theEnd =
  				m_namespaceDeclarations.end();
  
  		NamespacesMapType::iterator		i =
  				m_namespaceDeclarations.begin();
  
  		// Check for any result prefixes we should exclude...
  		while(i != theEnd)
  		{
  			const NameSpace&		theNamespace = (*i).second;
  
  			const XalanDOMString&	thePrefix = theNamespace.getPrefix();
  			const XalanDOMString&	theURI = theNamespace.getURI();
  
  			// We can never exclude the prefix of our owner element, so
  			// check that first...
  			if ((isEmpty(thePrefix) ||
  				 equals(thePrefix, theElementPrefix) == false) &&
  				(m_excludedResultPrefixes.find(thePrefix) != m_excludedResultPrefixes.end() ||
  				 m_extensionNamespaceURIs.find(theURI) != m_extensionNamespaceURIs.end()))
  			{
  				// It's excluded, so remove it...
  				i = m_namespaceDeclarations.erase(i);
  			}
  			else
  			{
  				++i;
  			}
  		}
  	}
  }
  
  
  
  void
  NamespacesHandler::processNamespaceAliases()
  {
  	if (m_namespaceDeclarations.size() > 0)
  	{
  		const NamespacesMapType::iterator	theEnd =
  				m_namespaceDeclarations.end();
  
  		NamespacesMapType::iterator		i =
  				m_namespaceDeclarations.begin();
  
  		// Look at everyone of my namespaces for an alias, and substitute the
  		// alias as appropriate...
  		for(; i != theEnd; ++i)
  		{
  			NameSpace&	theNamespace = (*i).second;
  
  			const XalanDOMString&	theURI = theNamespace.getURI();
  
  			const XalanDOMString&	theAlias = getNamespaceAlias(theURI);
  
  			// Is there a local alias?
  			if (length(theAlias) != 0)
  			{
  				// Yup, so use it...
  				theNamespace.setURI(theAlias);
  			}
  		}
  	}
  }
  
  
  
  void
  NamespacesHandler::copyNamespaceAliases(const NamespaceAliasesMapType&	theNamespaceAliases)
  {
  	if (theNamespaceAliases.size() > 0)
  	{
  		if (m_namespaceAliases.size() == 0)
  		{
  			m_namespaceAliases = theNamespaceAliases;
  		}
  		else
  		{
  			const NamespaceAliasesMapType::const_iterator	theEnd =
  					theNamespaceAliases.end();
  
  			NamespaceAliasesMapType::const_iterator		i =
  					theNamespaceAliases.begin();
  
  			// Add them in...
  			while(i != theEnd)
  			{
  				m_namespaceAliases.insert(*i);
  
  				++i;
  			}
  		}
  	}
  }
  
  
  
  void
  NamespacesHandler::copyExtensionNamespaceURIs(const ExtensionNamespaceURISetType&	theExtensionNamespaceURIs)
  {
  	if (theExtensionNamespaceURIs.size() > 0)
  	{
  		if (m_extensionNamespaceURIs.size() == 0)
  		{
  			m_extensionNamespaceURIs = theExtensionNamespaceURIs;
  		}
  		else
  		{
  			const ExtensionNamespaceURISetType::const_iterator	theEnd =
  					theExtensionNamespaceURIs.end();
  
  			ExtensionNamespaceURISetType::const_iterator	i =
  					theExtensionNamespaceURIs.begin();
  
  			// Add them in...
  			while(i != theEnd)
  			{
  				m_extensionNamespaceURIs.insert(*i);
  
  				++i;
  			}
  		}
  	}
  }
  
  
  
  void
  NamespacesHandler::copyExcludeResultPrefixes(const ExcludedResultPrefixesMapType&	theExcludeResultPrefixes)
  {
  	if (theExcludeResultPrefixes.size() > 0)
  	{
  		if (m_excludedResultPrefixes.size() == 0)
  		{
  			m_excludedResultPrefixes = theExcludeResultPrefixes;
  		}
  		else
  		{
  			const ExcludedResultPrefixesMapType::const_iterator	theEnd =
  					theExcludeResultPrefixes.end();
  
  			ExcludedResultPrefixesMapType::const_iterator	i =
  					theExcludeResultPrefixes.begin();
  
  			// Add them in...
  			while(i != theEnd)
  			{
  				m_excludedResultPrefixes.insert(*i);
  
  				++i;
  			}
  		}
  	}
  }
  
  
  
  1.1                  xml-xalan/c/src/XSLT/NamespacesHandler.hpp
  
  Index: NamespacesHandler.hpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2000 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, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * $ Id: $
   *
   */
  
  #if !defined(XALAN_NAMESPACESHANDLER_HEADER_GUARD)
  #define XALAN_NAMESPACESHANDLER_HEADER_GUARD
  
  
  
  // Base include file.  Must be first.
  #include <XSLT/XSLTDefinitions.hpp>
  
  
  
  #include <map>
  #include <set>
  #include <vector>
  
  
  
  #include <XalanDOM/XalanDOMString.hpp>
  
  
  
  #include <XPath/NameSpace.hpp>
  
  
  
  class StylesheetConstructionContext;
  class StylesheetExecutionContext;
  
  
  
  class XALAN_XSLT_EXPORT NamespacesHandler
  {
  public:
  
  	class NameSpaceExtended : public NameSpace
  	{
  	public:
  
  		NameSpaceExtended(
  					const XalanDOMString&	prefix = XalanDOMString(),
  					const XalanDOMString&	uri = XalanDOMString()) :
  			NameSpace(prefix, uri),
  			m_resultAttributeName()
  		{
  		}
  
  		NameSpaceExtended(const NameSpace&	theNamespace) :
  			NameSpace(theNamespace),
  			m_resultAttributeName()
  		{
  		}
  
  		/**
  		 * Retrieve the name of the result attribute.
  		 * 
  		 * @return name string
  		 */
  		const XalanDOMString&
  		getResultAttributeName() const
  		{
  			return m_resultAttributeName;
  		}
  
  		/**
  		 * Set the name of the result attribute.
  		 * 
  		 * @param name The new name value
  		 */
  		void
  		setResultAttributeName(const XalanDOMString&	name)
  		{
  			m_resultAttributeName = name;
  		}
  
  	private:
  
  		XalanDOMString	m_resultAttributeName;
  	};
  
  #if defined(XALAN_NO_NAMESPACES)
  	typedef map<XalanDOMString,
  				XalanDOMString,
  				less<XalanDOMString> >					ExcludedResultPrefixesMapType;
  
  	typedef map<XalanDOMString,
  				NameSpaceExtended,
  				less<XalanDOMString> >					NamespacesMapType;
  
  	typedef map<XalanDOMString,
  				XalanDOMString,
  				less<XalanDOMString> >					NamespaceAliasesMapType;
  
  	typedef vector<NameSpace> 							NamespaceVectorType;
  	typedef vector<NamespaceVectorType>					NamespacesStackType;
  
  	typedef set<XalanDOMString
  				less<XalanDOMString> >					ExtensionNamespaceURISetType;
  #else
  	typedef std::map<XalanDOMString, XalanDOMString>	ExcludedResultPrefixesMapType;
  
  	typedef std::map<XalanDOMString,
  					 NameSpaceExtended>					NamespacesMapType;
  
  	typedef std::map<XalanDOMString, XalanDOMString>	NamespaceAliasesMapType;
  
  	typedef std::vector<NameSpace> 						NamespaceVectorType;
  	typedef std::vector<NamespaceVectorType>			NamespacesStackType;
  
  	typedef std::set<XalanDOMString>					ExtensionNamespaceURISetType;
  #endif
  
  	/**
  	 * Create a default, empty instance.
  	 */
  	explicit
  	NamespacesHandler();
  
  	/**
  	 * Create an instance namespace handler using the
  	 * current namespaces in effect.
  	 *
  	 * @param stylesheetNamespacesHandler The stylesheet's handler.
  	 * @param theCurrentNamespaces The stack of active namespace declarations.
  	 * @param theXSLTNamespaceURI The namespace URI for XSLT.
  	 */
  	NamespacesHandler(
  			const NamespacesHandler&	stylesheetNamespacesHandler,
  			const NamespacesStackType&	theCurrentNamespaces,
  			const XalanDOMString&		theXSLTNamespaceURI);
  
  	NamespacesHandler(const NamespacesHandler&	theSource);
  
  	~NamespacesHandler();
  
  	/**
  	 * Process an exclude-result-prefixes attribute.
  	 *
  	 * @param theValue The attribute's value.
  	 * @param theCurrentNamespaces The stack of active namespace declarations.
  	 * @param theConstructionContext The current construction context.
  	 */
  	void
  	processExcludeResultPrefixes(
  			const XalanDOMChar*				theValue,
  			const NamespacesStackType&		theCurrentNamespaces,
  			StylesheetConstructionContext&	theConstructionContext);
  
  	/**
  	 * Process an extension-element-prefixes attribute.
  	 *
  	 * @param theValue The attribute's value.
  	 * @param theCurrentNamespaces The stack of active namespace declarations.
  	 * @param theConstructionContext The current construction context.
  	 */
  	void
  	processExtensionElementPrefixes(
  			const XalanDOMChar*				theValue,
  			const NamespacesStackType&		theCurrentNamespaces,
  			StylesheetConstructionContext&	theConstructionContext);
  
  	/**
  	 * Notify the instance that the stylesheet is fully constructed.
  	 *
  	 * @param theElementName The name of the owning element.
  	 * @param parentNamespacesHandler The parent handler, if any.
  	 */
  	void
  	postConstruction(
  			const XalanDOMString&		theElementName = XalanDOMString(),
  			const NamespacesHandler*	parentNamespacesHandler = 0);
  
  	NamespacesHandler&
  	operator=(const NamespacesHandler&	theRHS);
  
  	/**
  	 * Determine of a given namespace should be excluded.
  	 *
  	 * @param theXSLTNamespaceURI The namespace URI for XSLT.
  	 * @param thePrefix The namespace prefix.
  	 * @param theURI The namespace URI.
  	 * @return true of the namespace should be excluded, false if not.
  	 */
  	bool
  	shouldExcludeResultNamespaceNode(
  			const XalanDOMString&	theXSLTNamespaceURI,
  			const XalanDOMString&	thePrefix,
  			const XalanDOMString&	theURI) const;
  
  	/**
  	 * Determine if a given prefix is in the list of excluded
  	 * prefixes.
  	 *
  	 * @param thePrefix The namespace prefix.
  	 * @return true of the prefix should be excluded, false if not.
  	 */
  	bool
  	hasExcludedPrefix(const XalanDOMString&		thePrefix) const
  	{
  		return m_excludedResultPrefixes.count(thePrefix) != 0 ? true : false;
  	}
  
  	/**
  	 * Add a URI as an extension namespace prefixes.
  	 *
  	 * @param theURI The namespace URI.
  	 */
  	void
  	addExtensionNamespaceURI(const XalanDOMString&	theURI)
  	{
  		m_extensionNamespaceURIs.insert(theURI);
  	}
  
  	/**
  	 * Get the namespace URI for the given prefix.
  	 *
  	 * @param thePrefix The namespace prefix.
  	 * @return The namespace URI
  	 */
  	const XalanDOMString&
  	getNamespace(const XalanDOMString&	thePrefix) const;
  
  	/**
  	 * Get the namespace alias URI for the given namespace.
  	 *
  	 * @param theStylesheetNamespace The namespace as declared in the stylesheet.
  	 * @return The namespace alias URI
  	 */
  	const XalanDOMString&
  	getNamespaceAlias(const XalanDOMString&		theStylesheetNamespace) const;
  
  	/**
  	 * Set the namespace alias URI for the given namespace.
  	 *
  	 * @param theStylesheetNamespace The namespace as declared in the stylesheet.
  	 * @param theResultNamespace The namespace as it should appear in the result tree.
  	 */
  	void
  	setNamespaceAlias(
  			const XalanDOMString&	theStylesheetNamespace,
  			const XalanDOMString&	theResultNamespace)
  	{
  		m_namespaceAliases[theStylesheetNamespace] = theResultNamespace;
  	}
  
  	/**
  	 * Copy the aliases from the given NamespacesHandler.
  	 *
  	 * @param parentNamespacesHandler The parent handler.
  	 */
  	void
  	copyNamespaceAliases(const NamespacesHandler&	parentNamespacesHandler);
  
  	/**
  	 * Output the result tree namespace declarations.
  	 *
  	 * @param theExecutionContext The current execution context.
  	 */
  	void
  	outputResultNamespaces(StylesheetExecutionContext&	theExecutionContext) const;
  
  	/**
  	 * Clear out the handler.
  	 */
  	void
  	clear();
  
  	/**
  	 * Swap the contents of this instance with another.
  	 *
  	 * @param theOther The other instance.
  	 */
  	void
  	swap(NamespacesHandler&		theOther);
  
  private:
  
  	/**
  	 * Create all of the result attribute names.
  	 */
  	void
  	createResultAttributeNames();
  
  	/**
  	 * Process the exclude result prefix data.
  	 *
  	 * @param theElementPrefix The prefix of the owning element.
  	 */
  	void
  	processExcludeResultPrefixes(const XalanDOMString&	theElementPrefix);
  
  	/**
  	 * Process the namespace aliases data.
  	 */
  	void
  	processNamespaceAliases();
  
  	/**
  	 * Copy the contents of the supplied map
  	 *
  	 * @param theNamespaceAliases The map to copy.
  	 */
  	void
  	copyNamespaceAliases(const NamespaceAliasesMapType&		theNamespaceAliases);
  
  	/**
  	 * Copy the contents of the supplied set
  	 *
  	 * @param theExtensionNamespaceURIs The set to copy.
  	 */
  	void
  	copyExtensionNamespaceURIs(const ExtensionNamespaceURISetType&	theExtensionNamespaceURIs);
  
  	/**
  	 * Copy the contents of the supplied map
  	 *
  	 * @param theExcludeResultPrefixes The map to copy.
  	 */
  	void
  	copyExcludeResultPrefixes(const ExcludedResultPrefixesMapType&	theExcludeResultPrefixes);
  
  	/**
  	 * Determine of a given namespace should be excluded.  For use during
  	 * stylesheet construction only.
  	 *
  	 * @param theXSLTNamespaceURI The namespace URI for XSLT.
  	 * @param parentNamespacesHandler The parent handler instance.
  	 * @param theNamespace The namespace.
  	 * @return true of the namespace should be excluded, false if not.
  	 */
  	bool
  	shouldExcludeResultNamespaceNode(
  			const XalanDOMString&		theXSLTNamespaceURI,
  			const NamespacesHandler&	parentNamespacesHandler,
  			const NameSpace&			theNamespace) const;
  
  	// Not implemented...
  	bool
  	operator==(const NamespacesHandler&) const;
  
  	// Data members...
  	ExcludedResultPrefixesMapType	m_excludedResultPrefixes;
  
  	NamespacesMapType				m_namespaceDeclarations;
  
  	ExtensionNamespaceURISetType	m_extensionNamespaceURIs;
  
  	NamespaceAliasesMapType			m_namespaceAliases;
  
  	const static XalanDOMString		s_dummyEmptyString;
  };
  
  
  
  #endif	// XALAN_NAMESPACESHANDLER_HEADER_GUARD