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/10/01 23:15:36 UTC

cvs commit: xml-xalan/c/src/xalanc/XSLT ElemAttributeSet.cpp ElemAttributeSet.hpp ElemUse.cpp Stylesheet.cpp Stylesheet.hpp StylesheetHandler.cpp StylesheetRoot.cpp StylesheetRoot.hpp

dbertoni    2003/10/01 14:15:36

  Modified:    c/src/xalanc/XSLT ElemAttributeSet.cpp ElemAttributeSet.hpp
                        ElemUse.cpp Stylesheet.cpp Stylesheet.hpp
                        StylesheetHandler.cpp StylesheetRoot.cpp
                        StylesheetRoot.hpp
  Log:
  Fixed issues with xsl:attribute-set and introduced error for unknown attribute set.
  
  Revision  Changes    Path
  1.3       +11 -2     xml-xalan/c/src/xalanc/XSLT/ElemAttributeSet.cpp
  
  Index: ElemAttributeSet.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/ElemAttributeSet.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ElemAttributeSet.cpp	19 Sep 2003 20:33:04 -0000	1.2
  +++ ElemAttributeSet.cpp	1 Oct 2003 21:15:36 -0000	1.3
  @@ -64,6 +64,7 @@
   
   #include "Constants.hpp"
   #include "Stylesheet.hpp"
  +#include "StylesheetRoot.hpp"
   #include "StylesheetConstructionContext.hpp"
   #include "StylesheetExecutionContext.hpp"
   
  @@ -98,8 +99,6 @@
   				atts.getValue(i),
   				stylesheetTree.getNamespaces(),
   				getLocator());
  -
  -			stylesheetTree.addAttributeSet(this);
   		}
   		else if(!(processUseAttributeSets(constructionContext, aname, atts, i) ||
   					isAttrOK(aname, atts, i, constructionContext)))
  @@ -167,6 +166,16 @@
   
   		attr = attr->getNextSiblingElem();
   	}
  +}
  +
  +
  +
  +void
  +ElemAttributeSet::addToStylesheet(
  +			StylesheetConstructionContext&	/* constructionContext */,
  +			Stylesheet&						theStylesheet)
  +{
  +	theStylesheet.getStylesheetRoot().addAttributeSet(*this);
   }
   
   
  
  
  
  1.3       +5 -0      xml-xalan/c/src/xalanc/XSLT/ElemAttributeSet.hpp
  
  Index: ElemAttributeSet.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/ElemAttributeSet.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ElemAttributeSet.hpp	19 Sep 2003 20:33:04 -0000	1.2
  +++ ElemAttributeSet.hpp	1 Oct 2003 21:15:36 -0000	1.3
  @@ -118,6 +118,11 @@
   	virtual	void
   	execute(StylesheetExecutionContext&		executionContext) const;
   
  +	virtual void
  +	addToStylesheet(
  +			StylesheetConstructionContext&	constructionContext,
  +			Stylesheet&						theStylesheet);
  +
   protected:
   
   	virtual bool
  
  
  
  1.3       +8 -5      xml-xalan/c/src/xalanc/XSLT/ElemUse.cpp
  
  Index: ElemUse.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/ElemUse.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ElemUse.cpp	19 Sep 2003 20:33:04 -0000	1.2
  +++ ElemUse.cpp	1 Oct 2003 21:15:36 -0000	1.3
  @@ -71,6 +71,7 @@
   
   
   #include "Constants.hpp"
  +#include "ElemAttributeSet.hpp"
   #include "StylesheetRoot.hpp"
   #include "StylesheetConstructionContext.hpp"
   
  @@ -154,11 +155,13 @@
   	{
   		assert(canGenerateAttributes() == true);
   
  -		getStylesheet().getStylesheetRoot().applyAttrSets(
  -				m_attributeSetsNames, 
  -				m_attributeSetsNamesCount,
  -				executionContext,
  -				executionContext.getCurrentNode());
  +		const StylesheetRoot&		theStylesheetRoot = getStylesheet().getStylesheetRoot();
  +		const LocatorType* const	theLocator = getLocator();
  +
  +		for(size_type i = 0; i < m_attributeSetsNamesCount; ++i)
  +		{
  +			theStylesheetRoot.executeAttributeSet(executionContext, *m_attributeSetsNames[i], theLocator);
  +		}
   	}
   }
   
  
  
  
  1.4       +0 -54     xml-xalan/c/src/xalanc/XSLT/Stylesheet.cpp
  
  Index: Stylesheet.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/Stylesheet.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Stylesheet.cpp	7 Aug 2003 21:51:00 -0000	1.3
  +++ Stylesheet.cpp	1 Oct 2003 21:15:36 -0000	1.4
  @@ -99,7 +99,6 @@
   #include "KeyTable.hpp"
   #include "StylesheetConstructionContext.hpp"
   #include "StylesheetExecutionContext.hpp"
  -#include "StylesheetRoot.hpp"
   
   
   
  @@ -146,8 +145,6 @@
   	m_nodePatternList(),
   	m_matchPattern2Container(),
   	m_patternCount(0),
  -	m_attributeSets(),
  -	m_attributeSetsSize(0),
   	m_elemDecimalFormats(),
   	m_namespacesHandler()
   {
  @@ -499,7 +496,6 @@
   	// Call postConstruction() on our own namespaces handler...
   	m_namespacesHandler.postConstruction(constructionContext);
   
  -
   	{
   		for (ElemTemplateElement* node = m_firstTemplate;
   			 node != 0;
  @@ -518,9 +514,6 @@
   		}
   	}
   
  -	// Cache the size...
  -	m_attributeSetsSize = m_attributeSets.size();
  -
   	addToTable(m_elementPatternTable, m_elementAnyPatternList);
   	addToTable(m_attributePatternTable, m_attributeAnyPatternList);
   
  @@ -1499,53 +1492,6 @@
   	}
   
   	return dfs;
  -}
  -
  -
  -
  -void
  -Stylesheet::applyAttrSets(
  -			const XalanQName**				attributeSetsNames,
  -			size_type						attributeSetsNamesCount,
  -			StylesheetExecutionContext& 	executionContext,			
  -			XalanNode*						sourceNode) const
  -{
  -	if(0 != attributeSetsNamesCount)
  -	{
  -		// Process up the import chain...
  -		const StylesheetVectorType::const_reverse_iterator	theEnd = m_imports.rend();
  -		StylesheetVectorType::const_reverse_iterator		i = m_imports.rbegin();
  -
  -		while(i != theEnd)
  -		{
  -			(*i)->applyAttrSets(
  -				attributeSetsNames,
  -				attributeSetsNamesCount,
  -				executionContext,
  -				sourceNode);
  -
  -			++i;
  -		}
  -
  -		for(size_type j = 0; j < attributeSetsNamesCount; j++)
  -		{
  -			const XalanQName* const		qname = attributeSetsNames[j];
  -			assert(qname != 0);
  -
  -			assert(m_attributeSetsSize == m_attributeSets.size());
  -
  -			for(StylesheetVectorType::size_type k = 0; k < m_attributeSetsSize; k++)
  -			{
  -				const ElemAttributeSet* const	attrSet = m_attributeSets[k];
  -				assert(attrSet != 0);
  -
  -				if(qname->equals(attrSet->getQName()))
  -				{
  -					attrSet->execute(executionContext);
  -				}
  -			}
  -		}
  -	}
   }
   
   
  
  
  
  1.3       +0 -50     xml-xalan/c/src/xalanc/XSLT/Stylesheet.hpp
  
  Index: Stylesheet.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/Stylesheet.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Stylesheet.hpp	15 Jul 2003 01:05:22 -0000	1.2
  +++ Stylesheet.hpp	1 Oct 2003 21:15:36 -0000	1.3
  @@ -99,7 +99,6 @@
   
   class ExtensionNSHandler;
   class XalanDecimalFormatSymbols;
  -class ElemAttributeSet;
   class ElemDecimalFormat;
   class ElemTemplate;
   class ElemTemplateElement;
  @@ -141,7 +140,6 @@
   	typedef map<XalanQNameByReference,
   				const ElemTemplate*,
   				less<XalanQName> >					ElemTemplateMapType;
  -	typedef vector<ElemAttributeSet*> 				AttributeSetVectorType;
   	typedef vector<ElemVariable*> 					ElemVariableVectorType;
   	typedef vector<KeyDeclaration>					KeyDeclarationVectorType;
   	typedef map<const XalanNode*,
  @@ -155,7 +153,6 @@
   	typedef std::map<XalanQNameByReference,
   					 const ElemTemplate*,
   					 std::less<XalanQName> >				ElemTemplateMapType;
  -	typedef std::vector<ElemAttributeSet*> 					AttributeSetVectorType;
   	typedef std::vector<ElemVariable*> 						ElemVariableVectorType;
   	typedef std::vector<KeyDeclaration>						KeyDeclarationVectorType;
   	typedef std::map<const XalanNode*, KeyTable*>			KeyTablesTableType;
  @@ -434,17 +431,6 @@
   	}
   
   	/**
  -	 * Set the base identifier with which this stylesheet is associated.
  -	 * 
  -	 * @param str string for base identifier
  -	 */
  -	void
  -	setBaseIdentifier(const XalanDOMString&		str)
  -	{
  -		m_baseIdent = str;
  -	}
  -
  -	/**
   	 * Retrieve the base identifier for the most recently
   	 * included stylesheet.  This will return the same value
   	 * as getBaseIdentifier(), if no include is being
  @@ -493,35 +479,6 @@
   	getDecimalFormatSymbols(const XalanQName&	theQName) const;
   
   	/**
  -	 * Add an attribute set to the list.
  -	 *
  -	 * @param attrSet pointer to attribute set to add
  -	 */
  -	void
  -	addAttributeSet(ElemAttributeSet*	attrSet)
  -	{
  -		assert(attrSet != 0);
  -
  -		m_attributeSets.push_back(attrSet);
  -	}
  -
  -	/**
  -	 * Apply the set of named attributes to a node in a given context with a
  -	 * given mode
  -	 *
  -	 * @param attributeSetsNames The vector of attribute set names
  -	 * @param attributeSetsNamesCount The size of the vector
  -	 * @param executionContext	 The current execution context
  -	 * @param sourceNode		 The source node
  -	 */
  -	void
  -	applyAttrSets(
  -			const XalanQName**				attributeSetsNames,
  -			size_type						attributeSetsNamesCount,
  -			StylesheetExecutionContext& 	executionContext,
  -			XalanNode*						sourceNode) const;
  -
  -	/**
   	 * Add an imported stylesheet.
   	 *
   	 * @param theStylesheet The stylesheet to add.
  @@ -1056,13 +1013,6 @@
   	 * This caches the number of possible patterns we can match.
   	 */
   	MatchPattern2Container::size_type		m_patternCount;
  -
  -	AttributeSetVectorType 					m_attributeSets;
  -
  -	/**
  -	 * This caches the number of attribute sets.
  -	 */
  -	AttributeSetVectorType::size_type		m_attributeSetsSize;
   
   	ElemDecimalFormatVectorType				m_elemDecimalFormats;
   
  
  
  
  1.5       +6 -2      xml-xalan/c/src/xalanc/XSLT/StylesheetHandler.cpp
  
  Index: StylesheetHandler.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/StylesheetHandler.cpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- StylesheetHandler.cpp	19 Sep 2003 20:33:04 -0000	1.4
  +++ StylesheetHandler.cpp	1 Oct 2003 21:15:36 -0000	1.5
  @@ -754,12 +754,16 @@
   			m_inTemplate = true; // fake it out
   			m_inScopeVariableNamesStack.resize(m_inScopeVariableNamesStack.size() + 1);
   
  -			m_elemStack.push_back(
  +			ElemTemplateElement* const	theAttributeSet =
   				m_constructionContext.createElement(
   					xslToken,
   					m_stylesheet,
   					atts,
  -					locator));
  +					locator);
  +
  +			theAttributeSet->addToStylesheet(m_constructionContext, m_stylesheet);
  +
  +			m_elemStack.push_back(theAttributeSet);
   		}
   		break;
   
  
  
  
  1.8       +63 -1     xml-xalan/c/src/xalanc/XSLT/StylesheetRoot.cpp
  
  Index: StylesheetRoot.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/StylesheetRoot.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- StylesheetRoot.cpp	19 Sep 2003 20:33:04 -0000	1.7
  +++ StylesheetRoot.cpp	1 Oct 2003 21:15:36 -0000	1.8
  @@ -97,6 +97,7 @@
   
   #include "Constants.hpp"
   #include "ElemApplyTemplates.hpp"
  +#include "ElemAttributeSet.hpp"
   #include "ElemTemplate.hpp"
   #include "ElemValueOf.hpp"
   #include "KeyTable.hpp"
  @@ -146,7 +147,8 @@
   	m_omitMETATag(false),
   	m_elemNumberNextID(0),
   	m_whitespacePreservingElements(),
  -	m_whitespaceStrippingElements()
  +	m_whitespaceStrippingElements(),
  +	m_attributeSetsMap()
   {
   	// Our base class has already resolved the URI and pushed it on
   	// the back of the include stack, so get it from there...
  @@ -171,6 +173,26 @@
   
   	initDefaultRule(constructionContext);
   
  +	{
  +		AttributeSetMapType::iterator			theCurrentMap = m_attributeSetsMap.begin();
  +		const AttributeSetMapType::iterator		theEndMap = m_attributeSetsMap.end();
  +
  +		while(theCurrentMap != theEndMap)
  +		{
  +			AttributeSetVectorType::iterator		theCurrentVector = (*theCurrentMap).second.begin();
  +			const AttributeSetVectorType::iterator	theEndVector = (*theCurrentMap).second.end();
  +
  +			while(theCurrentVector != theEndVector)
  +			{
  +				(*theCurrentVector)->postConstruction(constructionContext, getNamespacesHandler());
  +
  +				++theCurrentVector;
  +			}
  +
  +			++theCurrentMap;
  +		}	
  +	}
  +
   	// We may need to build keys, since we may have inherited them from
   	// our imports.
   	if (m_needToBuildKeysTable == false && m_keyDeclarations.empty() == false)
  @@ -900,6 +922,46 @@
   	}
   
   	return strip;
  +}
  +
  +
  +
  +void
  +StylesheetRoot::addAttributeSet(ElemAttributeSet&	theAttributeSet)
  +{
  +	m_attributeSetsMap[&theAttributeSet.getQName()].push_back(&theAttributeSet);
  +}
  +
  +
  +
  +void
  +StylesheetRoot::executeAttributeSet(
  +			StylesheetExecutionContext&		theExecutionContext,
  +			const XalanQName&				theQName,
  +			const LocatorType*				theLocator) const
  +{
  +	const AttributeSetMapType::const_iterator	i =
  +		m_attributeSetsMap.find(&theQName);
  +
  +	if (i == m_attributeSetsMap.end())
  +	{
  +		theExecutionContext.error(
  +			"Unknown xsl:attribute-set",
  +			theExecutionContext.getCurrentNode(),
  +			theLocator);
  +	}
  +	else
  +	{
  +		const AttributeSetVectorType&					theAttributeSets = (*i).second;
  +		const AttributeSetVectorType::const_iterator	theEnd = theAttributeSets.end();
  +
  +		for(AttributeSetVectorType::const_iterator i = theAttributeSets.begin(); i != theEnd; ++i)
  +		{
  +			assert(*i != 0);
  +
  +			(*i)->execute(theExecutionContext);
  +		}
  +	}
   }
   
   
  
  
  
  1.3       +24 -0     xml-xalan/c/src/xalanc/XSLT/StylesheetRoot.hpp
  
  Index: StylesheetRoot.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/StylesheetRoot.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- StylesheetRoot.hpp	19 Sep 2003 20:33:04 -0000	1.2
  +++ StylesheetRoot.hpp	1 Oct 2003 21:15:36 -0000	1.3
  @@ -80,6 +80,7 @@
   
   
   
  +class ElemAttributeSet;
   class StylesheetConstructionContext;
   class XalanText;
   class XSLTResultTarget;
  @@ -98,9 +99,17 @@
   #if defined(XALAN_NO_STD_NAMESPACE)
   	typedef vector<const XalanQName*> 		XalanQNameVectorType;
   	typedef vector<const XPath*>			XPathVectorType;
  +	typedef vector<ElemAttributeSet*> 		AttributeSetVectorType;
  +	typedef map<const XalanQName*,
  +			    AttributeSetVectorType,
  +				pointer_less<const XalanQName> >	AttributeSetMapType;
   #else
   	typedef std::vector<const XalanQName*>	XalanQNameVectorType;
   	typedef std::vector<const XPath*>		XPathVectorType;
  +	typedef std::vector<ElemAttributeSet*> 	AttributeSetVectorType;
  +	typedef std::map<const XalanQName*,
  +					 AttributeSetVectorType,
  +					 pointer_less<const XalanQName> >	AttributeSetMapType;
   #endif
   
   	/**
  @@ -433,6 +442,15 @@
   			StylesheetExecutionContext&		executionContext,
   			const XalanText&				textNode) const;
   
  +	void
  +	addAttributeSet(ElemAttributeSet&	theAttributeSet);
  +
  +	void
  +	executeAttributeSet(
  +			StylesheetExecutionContext&		theExecutionContext,
  +			const XalanQName&				theQName,
  +			const LocatorType*				theLocator) const;
  +
   private:
   
   	/**
  @@ -582,6 +600,12 @@
   	 * A lookup table of all space stripping elements.
   	 */
   	XPathVectorType 			m_whitespaceStrippingElements;
  +
  +	/**
  +	 * A lookup table of all attribute sets.
  +	 */
  +	AttributeSetMapType			m_attributeSetsMap;
  +
   
   	// Not implemented...
       StylesheetRoot(const StylesheetRoot&);
  
  
  

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