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 2001/06/25 17:20:22 UTC

cvs commit: xml-xalan/c/src/XSLT ElemAttributeSet.cpp ElemAttributeSet.hpp ElemUse.cpp ElemUse.hpp Stylesheet.cpp StylesheetExecutionContext.hpp StylesheetExecutionContextDefault.cpp StylesheetExecutionContextDefault.hpp VariablesStack.hpp

dbertoni    01/06/25 08:20:22

  Modified:    c/src/XSLT ElemAttributeSet.cpp ElemAttributeSet.hpp
                        ElemUse.cpp ElemUse.hpp Stylesheet.cpp
                        StylesheetExecutionContext.hpp
                        StylesheetExecutionContextDefault.cpp
                        StylesheetExecutionContextDefault.hpp
                        VariablesStack.hpp
  Log:
  Fix for attribset42, which tests XSLT 1.0 erratum 66 regarding xsl:attribute-set instance with the same name.  Also fixed bug regarding scoping of variables within xsl:attribute-set.
  
  Revision  Changes    Path
  1.11      +34 -1     xml-xalan/c/src/XSLT/ElemAttributeSet.cpp
  
  Index: ElemAttributeSet.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemAttributeSet.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- ElemAttributeSet.cpp	2001/03/09 16:20:08	1.10
  +++ ElemAttributeSet.cpp	2001/06/25 15:19:59	1.11
  @@ -125,10 +125,43 @@
   
   
   void
  +ElemAttributeSet::adopt(ElemAttributeSet&	theSource)
  +{
  +	ElemTemplateElement* node = theSource.getFirstChildElem();
  +
  +	while(node != 0) 
  +	{
  +		assert(node->getXSLToken() == Constants::ELEMNAME_ATTRIBUTE);
  +
  +		theSource.removeChild(node);
  +
  +		XalanAutoPtr<ElemTemplateElement>	theGuard(node);
  +
  +		appendChild(node);
  +
  +		theGuard.release();
  +
  +		node = theSource.getFirstChildElem();
  +	}
  +
  +	copyQNames(theSource);
  +}
  +
  +
  +
  +void
   ElemAttributeSet::execute(StylesheetExecutionContext&		executionContext) const
   {
  +	typedef StylesheetExecutionContext::SetAndRestoreCurrentStackFrameIndex		SetAndRestoreCurrentStackFrameIndex;
  +	typedef StylesheetExecutionContext::ElementRecursionStackPusher				ElementRecursionStackPusher;
  +
   	// This will push and pop the stack automatically...
  -	StylesheetExecutionContext::ElementRecursionStackPusher		thePusher(executionContext, this);
  +	ElementRecursionStackPusher		thePusher(executionContext, this);
  +
  +	// Make sure only global variables are visible during execution...
  +	SetAndRestoreCurrentStackFrameIndex		theSetAndRestore(
  +					executionContext, 
  +					executionContext.getGlobalStackFrameIndex());
   
   	ElemUse::execute(executionContext);
   
  
  
  
  1.11      +31 -1     xml-xalan/c/src/XSLT/ElemAttributeSet.hpp
  
  Index: ElemAttributeSet.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemAttributeSet.hpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- ElemAttributeSet.hpp	2001/03/09 16:20:07	1.10
  +++ ElemAttributeSet.hpp	2001/06/25 15:20:01	1.11
  @@ -107,8 +107,18 @@
   		return m_QName;
   	}
   
  +	/**
  +	 * Adopt the information of the supplied instance.
  +	 * The children are removed from the supplied instance,
  +	 * and any QNames for use-attribute-sets are copied.
  +	 *
  +	 * @param theSource The source ElemAttributeSet instance.
  +	 */
  +	void
  +	adopt(ElemAttributeSet&		theSource);
  +
   	// These methods are inherited from ElemUse ...
  -	
  +
   	virtual const XalanDOMString&
   	getElementName() const;
   
  @@ -124,6 +134,26 @@
   
   	QNameByValue	m_QName;
   };
  +
  +
  +
  +inline bool
  +operator==(
  +			const ElemAttributeSet&		theLHS,
  +			const ElemAttributeSet&		theRHS)
  +{
  +	return theLHS.getQName() == theRHS.getQName();
  +}
  +
  +
  +
  +inline bool
  +operator<(
  +			const ElemAttributeSet&		theLHS,
  +			const ElemAttributeSet&		theRHS)
  +{
  +	return theLHS.getQName() < theRHS.getQName();
  +}
   
   
   
  
  
  
  1.12      +7 -2      xml-xalan/c/src/XSLT/ElemUse.cpp
  
  Index: ElemUse.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemUse.cpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ElemUse.cpp	2001/03/09 16:19:57	1.11
  +++ ElemUse.cpp	2001/06/25 15:20:02	1.12
  @@ -157,12 +157,17 @@
   
   		m_attributeSetsNames.reserve(numTokens);
   
  +		XalanDOMString	qname;
  +
   		while(tokenizer.hasMoreTokens())
   		{
  -			const XalanDOMString		qname = tokenizer.nextToken();
  +			tokenizer.nextToken(qname);
   			assert(length(qname) != 0);
   
  -			m_attributeSetsNames.push_back(QNameVectorType::value_type(qname, getStylesheet().getNamespaces()));
  +			m_attributeSetsNames.push_back(
  +				QNameVectorType::value_type(
  +					qname,
  +					getStylesheet().getNamespaces()));
   		}
   	}
   
  
  
  
  1.12      +16 -0     xml-xalan/c/src/XSLT/ElemUse.hpp
  
  Index: ElemUse.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemUse.hpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ElemUse.hpp	2001/03/09 16:19:57	1.11
  +++ ElemUse.hpp	2001/06/25 15:20:03	1.12
  @@ -118,6 +118,20 @@
   			const AttributeList&			atts,
   			int								which);
   
  +	/**
  +	 * Copy the QNames from the source
  +	 *
  +	 * @param theSource The source ElemUse instance.
  +	 */
  +	void
  +	copyQNames(const ElemUse&	theSource)
  +	{
  +		m_attributeSetsNames.insert(
  +			m_attributeSetsNames.end(),
  +			theSource.m_attributeSetsNames.begin(),
  +			theSource.m_attributeSetsNames.end());
  +	}
  +
   	// These methods are inherited from ElemTemplateElement ...
   	
   	virtual const XalanDOMString&
  @@ -125,6 +139,8 @@
   
   	virtual void
   	execute(StylesheetExecutionContext&		executionContext) const;
  +
  +private:
   
   #if defined(XALAN_NO_NAMESPACES)
   	typedef vector<QNameByValue>		QNameVectorType;
  
  
  
  1.56      +62 -5     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.55
  retrieving revision 1.56
  diff -u -r1.55 -r1.56
  --- Stylesheet.cpp	2001/06/06 21:55:29	1.55
  +++ Stylesheet.cpp	2001/06/25 15:20:05	1.56
  @@ -325,6 +325,30 @@
   
   
   
  +class attrSetCompare
  +{
  +public:
  +
  +	attrSetCompare(const ElemAttributeSet&	theAttrSet) :
  +		m_attrSet(theAttrSet)
  +	{
  +	}
  +
  +	bool
  +	operator()(const ElemAttributeSet*	theRHS) const
  +	{
  +		assert(theRHS != 0);
  +
  +		return m_attrSet == *theRHS;
  +	}
  +
  +private:
  +
  +	const ElemAttributeSet&		m_attrSet;
  +};
  +
  +
  +
   void
   Stylesheet::postConstruction(StylesheetConstructionContext&		constructionContext)
   {
  @@ -390,11 +414,40 @@
   	}
   
   	{
  +#if !defined(XALAN_NO_NAMESPACES)
  +		using std::find_if;
  +#endif
   		for (AttributeSetVectorType::size_type i = 0; i < m_attributeSets.size(); ++i)
   		{
  -			assert(m_attributeSets[i] != 0);
  +			ElemAttributeSet* const		theCurrent = m_attributeSets[i];
   
  -			m_attributeSets[i]->postConstruction(constructionContext, m_namespacesHandler);
  +			assert(theCurrent != 0);
  +
  +			for(;;)
  +			{
  +				// Look for duplicate sets...
  +				const AttributeSetVectorType::iterator 	theResult =
  +					find_if(
  +							m_attributeSets.begin() + (i + 1),
  +							m_attributeSets.end(),
  +							attrSetCompare(*theCurrent));
  +
  +				// Did we find it?
  +				if(theResult == m_attributeSets.end())
  +				{
  +					break;
  +				}
  +				else
  +				{
  +					theCurrent->adopt(**theResult);
  +
  +					delete *theResult;
  +
  +					m_attributeSets.erase(theResult);
  +				}
  +			}
  +
  +			theCurrent->postConstruction(constructionContext, m_namespacesHandler);
   		}
   	}
   
  @@ -1454,6 +1507,8 @@
   		const QName&		/* qname */, 
   		ElemAttributeSet*	attrSet)
   {
  +	assert(attrSet != 0);
  +
   	m_attributeSets.push_back(attrSet);
   }		
   
  @@ -1484,8 +1539,10 @@
   		{
   			const Stylesheet* const 	stylesheet = m_imports[i];
   
  -			stylesheet->applyAttrSets(attributeSetsNames, 
  -									 executionContext, sourceNode);
  +			stylesheet->applyAttrSets(
  +				attributeSetsNames, 
  +				executionContext,
  +				sourceNode);
   		}
   
   		for(QNameVectorType::size_type j = 0; j < nNames; j++)
  @@ -1505,7 +1562,7 @@
   			}
   		}
   	}
  -}	
  +}
   
   
   
  
  
  
  1.57      +8 -0      xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp
  
  Index: StylesheetExecutionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp,v
  retrieving revision 1.56
  retrieving revision 1.57
  diff -u -r1.56 -r1.57
  --- StylesheetExecutionContext.hpp	2001/06/14 19:28:23	1.56
  +++ StylesheetExecutionContext.hpp	2001/06/25 15:20:07	1.57
  @@ -727,6 +727,14 @@
   	};
   
   	/**
  +	 * Get the top of the global stack frame.
  +	 *
  +	 * @return current value of index
  +	 */
  +	virtual int
  +	getGlobalStackFrameIndex() const = 0;
  +
  +	/**
   	 * Get the top of the stack frame from where a search 
   	 * for a variable or param should take place.
   	 *
  
  
  
  1.67      +11 -3     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.66
  retrieving revision 1.67
  diff -u -r1.66 -r1.67
  --- StylesheetExecutionContextDefault.cpp	2001/06/14 19:28:24	1.66
  +++ StylesheetExecutionContextDefault.cpp	2001/06/25 15:20:07	1.67
  @@ -767,6 +767,14 @@
   
   
   int
  +StylesheetExecutionContextDefault::getGlobalStackFrameIndex() const
  +{
  +	return m_variablesStack.getGlobalStackFrameIndex();
  +}
  +
  +
  +
  +int
   StylesheetExecutionContextDefault::getCurrentStackFrameIndex() const
   {
   	return m_variablesStack.getCurrentStackFrameIndex();
  @@ -1661,9 +1669,9 @@
   	}
   	else
   	{
  -		warn(
  -			TranscodeFromLocalCodePage("Variable reference given for variable out of context or without definition!  Name = ") +
  -			name.getLocalPart());
  +		error(
  +			TranscodeFromLocalCodePage("Variable reference given for variable out of context or without definition!  Name = '") +
  +			name.getLocalPart() + "'");
   
   		return getXObjectFactory().createUnknown(name.getLocalPart());
   	}
  
  
  
  1.61      +3 -0      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.60
  retrieving revision 1.61
  diff -u -r1.60 -r1.61
  --- StylesheetExecutionContextDefault.hpp	2001/06/14 19:28:25	1.60
  +++ StylesheetExecutionContextDefault.hpp	2001/06/25 15:20:08	1.61
  @@ -428,6 +428,9 @@
   	popElementFrame(const ElemTemplateElement*	elem);
   
   	virtual int
  +	getGlobalStackFrameIndex() const;
  +
  +	virtual int
   	getCurrentStackFrameIndex() const;
   
   	virtual void
  
  
  
  1.12      +11 -0     xml-xalan/c/src/XSLT/VariablesStack.hpp
  
  Index: VariablesStack.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/VariablesStack.hpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- VariablesStack.hpp	2001/05/10 18:05:33	1.11
  +++ VariablesStack.hpp	2001/06/25 15:20:09	1.12
  @@ -307,6 +307,17 @@
   		return m_currentStackFrameIndex;
   	}
   
  +	/**
  +	 * Get the top of the global stack frame.
  +	 *
  +	 * @return current value of index
  +	 */
  +	int
  +	getGlobalStackFrameIndex() const
  +	{
  +		return m_globalStackFrameIndex;
  +	}
  +
   	class InvalidStackContextException : public XSLTProcessorException
   	{
   	public:
  
  
  

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