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...@apache.org on 2003/07/08 01:53:43 UTC

cvs commit: xml-xalan/c/src/xalanc/XSLT ElemElement.cpp ElemElement.hpp

dbertoni    2003/07/07 16:53:43

  Modified:    c/src/xalanc/XSLT ElemElement.cpp ElemElement.hpp
  Log:
  Fixes for bug 21385.
  
  Revision  Changes    Path
  1.3       +65 -78    xml-xalan/c/src/xalanc/XSLT/ElemElement.cpp
  
  Index: ElemElement.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/ElemElement.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ElemElement.cpp	30 Jun 2003 23:38:30 -0000	1.2
  +++ ElemElement.cpp	7 Jul 2003 23:53:43 -0000	1.3
  @@ -183,8 +183,6 @@
   
   		XalanDOMString::size_type	namespaceLen = length(elemNameSpace);
   
  -		bool	hasUnresolvedPrefix = false;
  -
   		bool	foundResultNamespaceForPrefix = false;
   
   		XalanDOMString::size_type			len = length(elemName);
  @@ -222,8 +220,6 @@
   
   					if (m_namespaceAVT != 0)
   					{
  -						hasUnresolvedPrefix = true;
  -
   						elemName.erase(0, indexOfNSSep + 1);
   					}
   					else
  @@ -252,80 +248,62 @@
   			if(0 == m_namespaceAVT &&
   			   (havePrefix == false || foundResultNamespaceForPrefix == true))
   			{
  -				outputResultNamespaces(executionContext, hasUnresolvedPrefix);
  +				if (havePrefix == false)
  +				{
  +					fixupDefaultNamespace(executionContext);
  +				}
   			}
   			else
   			{
  -				if(namespaceLen == 0 && hasUnresolvedPrefix == true)
  -				{
  -					outputResultNamespaces(
  -						executionContext,
  -						hasUnresolvedPrefix,
  -						length(getParentDefaultNamespace()) == 0 ? true : false);
  -				}
  -				else
  +				if(havePrefix == false)
   				{
  -					if(havePrefix == false)
  +					if (namespaceLen > 0)
   					{
  -						if (namespaceLen > 0)
  -						{
  -							outputResultNamespaces(executionContext, hasUnresolvedPrefix, true);
  -
  -							const XalanDOMString* const		theDefaultNamespace =
  +						const XalanDOMString* const		theDefaultNamespace =
   								executionContext.getResultNamespaceForPrefix(s_emptyString);
   
  -							if (theDefaultNamespace == 0 ||
  -								equals(*theDefaultNamespace, elemNameSpace) == false)
  -							{
  -								executionContext.addResultAttribute(
  +						if (theDefaultNamespace == 0 ||
  +							equals(*theDefaultNamespace, elemNameSpace) == false)
  +						{
  +							executionContext.addResultAttribute(
   									DOMServices::s_XMLNamespace,
   									elemNameSpace);
  -							}
   						}
  -						else
  -						{
  -							// OK, the namespace we're generating is the default namespace,
  -							// so let's make sure that we really need it.  If we don't,
  -							// we end up with another xmlns="" on the element we're
  -							// generating.  Although this isn't really an error, it's
  -							// a bit unsightly, so let's suppress it...
  -							const XalanDOMString&	theParentDefaultNamespace =
  +					}
  +					else
  +					{
  +						// OK, the namespace we're generating is the default namespace,
  +						// so let's make sure that we really need it.  If we don't,
  +						// we end up with another xmlns="" on the element we're
  +						// generating.  Although this isn't really an error, it's
  +						// a bit unsightly, so let's suppress it...
  +						const XalanDOMString&	theParentDefaultNamespace =
   								getParentDefaultNamespace();
   
  -							if (length(theParentDefaultNamespace) == 0)
  -							{
  -								// There's not default namespace in effect, so suppress any
  -								// default namespace in the statically-generated namespaces,
  -								// and don't put out the one we've dynamically generated...
  -								outputResultNamespaces(executionContext, hasUnresolvedPrefix, true);
  -
  -								if (executionContext.getResultNamespaceForPrefix(s_emptyString) != 0)
  -								{
  -									executionContext.addResultAttribute(DOMServices::s_XMLNamespace, elemNameSpace);
  -								}
  -							}
  -							else
  +						if (length(theParentDefaultNamespace) == 0)
  +						{
  +							if (executionContext.getResultNamespaceForPrefix(s_emptyString) != 0)
   							{
  -								outputResultNamespaces(executionContext, hasUnresolvedPrefix, false);
  -
   								executionContext.addResultAttribute(DOMServices::s_XMLNamespace, elemNameSpace);
   							}
   						}
  +						else
  +						{
  +							executionContext.addResultAttribute(DOMServices::s_XMLNamespace, elemNameSpace);
  +						}
   					}
  -					else
  -					{
  -						outputResultNamespaces(executionContext, hasUnresolvedPrefix);
  -
  -						const XalanDOMString* const		theNamespace =
  +				}
  +				else
  +				{
  +					const XalanDOMString* const		theNamespace =
   							executionContext.getResultNamespaceForPrefix(prefix);
   
  -						if (theNamespace == 0 ||
  -							equals(*theNamespace, elemNameSpace) == false)
  -						{
  -							insert(prefix, 0, DOMServices::s_XMLNamespaceWithSeparator);
  +					if (theNamespace == 0 ||
  +						equals(*theNamespace, elemNameSpace) == false)
  +					{
  +						insert(prefix, 0, DOMServices::s_XMLNamespaceWithSeparator);
   
  -							executionContext.addResultAttribute(prefix, elemNameSpace);
  -						}
  +						executionContext.addResultAttribute(prefix, elemNameSpace);
   					}
   				}
   			}
  @@ -393,31 +371,40 @@
   
   
   void
  -ElemElement::outputResultNamespaces(
  -			StylesheetExecutionContext&		executionContext,			
  -			bool							hasUnresolvedPrefix,
  -			bool							supressDefault) const
  +ElemElement::fixupDefaultNamespace(StylesheetExecutionContext&	executionContext) const
   {
  -	getNamespacesHandler().outputResultNamespaces(executionContext, supressDefault);
  +	// OK, now let's check to make sure we don't have to change the default namespace...
  +	const XalanDOMString* const		theCurrentDefaultNamespace =
  +				executionContext.getResultNamespaceForPrefix(s_emptyString);
   
  -	if (supressDefault == false)
  -	{
  -		// OK, now let's check to make sure we don't have to change the default namespace...
  -		const XalanDOMString* const		theCurrentDefaultNamespace =
  -					executionContext.getResultNamespaceForPrefix(s_emptyString);
  +	const XalanDOMString* const		theElementDefaultNamespace =
  +				getNamespacesHandler().getNamespace(s_emptyString);
   
  -		if (theCurrentDefaultNamespace != 0)
  +	if (theCurrentDefaultNamespace != 0)
  +	{
  +		if (theElementDefaultNamespace == 0)
  +		{
  +			// There was no default namespace, so we have to turn the
  +			// current one off.
  +			executionContext.addResultAttribute(DOMServices::s_XMLNamespace, s_emptyString);
  +		}
  +		else if (equals(*theCurrentDefaultNamespace, *theElementDefaultNamespace) == false)
   		{
  -			const XalanDOMString* const		theElementDefaultNamespace =
  -						getNamespacesHandler().getNamespace(s_emptyString);
  +			// There is a default namespace, but it's different from the current one,
  +			// so we have to change it.
  +			executionContext.addResultAttribute(DOMServices::s_XMLNamespace, *theElementDefaultNamespace);
  +		}
  +	}
  +	else
  +	{
  +		// There's no current default namespace in the result tree, but there may be
  +		// on for this xsl:element instance, so we have to add it, if so.
  +		const XalanDOMString&	theParentDefaultNamespace =
  +					getParentDefaultNamespace();
   
  -			if (hasUnresolvedPrefix == true || theElementDefaultNamespace == 0)
  -			{
  -				// There was no default namespace, so we have to turn the
  -				// current one off.
  -				executionContext.addResultAttribute(DOMServices::s_XMLNamespace, s_emptyString);
  -			}
  -			else if (equals(*theCurrentDefaultNamespace, *theElementDefaultNamespace) == false)
  +		if (theElementDefaultNamespace != 0)
  +		{
  +			if (length(theParentDefaultNamespace) == 0 || theParentDefaultNamespace != *theElementDefaultNamespace)
   			{
   				executionContext.addResultAttribute(DOMServices::s_XMLNamespace, *theElementDefaultNamespace);
   			}
  
  
  
  1.2       +3 -8      xml-xalan/c/src/xalanc/XSLT/ElemElement.hpp
  
  Index: ElemElement.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/ElemElement.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ElemElement.hpp	29 Jun 2003 03:58:07 -0000	1.1
  +++ ElemElement.hpp	7 Jul 2003 23:53:43 -0000	1.2
  @@ -137,17 +137,12 @@
   private:
   
   	/** 
  -	 * Output the static namespace definitions.
  +	 * Do any necessary fixup for the default namespace
   	 * 
   	 * @param executionContext The current execution context
  -	 * @param true if the element being generated has an unresolved prefix.
  -	 * @param supressDefault If true, any default namespace declaration will not be output.
   	 */
   	void
  -	outputResultNamespaces(
  -			StylesheetExecutionContext&		executionContext,
  -			bool							hasUnresolvedPrefix,
  -			bool							supressDefault = false) const;
  +	fixupDefaultNamespace(StylesheetExecutionContext&	executionContext) const;
   
   	/** 
   	 * Get the default namespace from the parent of this element.  Returns
  
  
  

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