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 2002/04/06 21:35:58 UTC

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

dbertoni    02/04/06 11:35:58

  Modified:    c/src/XSLT XSLTEngineImpl.cpp XSLTEngineImpl.hpp
  Log:
  More efficient xsl:strip-space and xsl:preserve-space processing.
  
  Revision  Changes    Path
  1.138     +90 -82    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.137
  retrieving revision 1.138
  diff -u -r1.137 -r1.138
  --- XSLTEngineImpl.cpp	2 Apr 2002 06:13:16 -0000	1.137
  +++ XSLTEngineImpl.cpp	6 Apr 2002 19:35:58 -0000	1.138
  @@ -193,7 +193,8 @@
   	m_outputContextStack(),
   	m_resultNamespacesStack(),
   	m_dummyAttributesList(),
  -	m_scratchString()
  +	m_scratchString(),
  +	m_hasStripOrPreserveSpace(false)
   {
   	m_outputContextStack.pushContext();
   }
  @@ -226,6 +227,8 @@
   	m_domSupport.reset();
   
   	m_resultNamespacesStack.clear();
  +
  +	m_hasStripOrPreserveSpace = false;
   }
   
   
  @@ -305,7 +308,7 @@
   		{
   			if(XalanNode::PROCESSING_INSTRUCTION_NODE == child->getNodeType())
   			{
  -				const XalanDOMString	nodeName(child->getNodeName());
  +				const XalanDOMString&	nodeName = child->getNodeName();
   
   				if(equals(nodeName, stylesheetNodeName))
   				{
  @@ -402,12 +405,15 @@
   			theFormatter->setPrefixResolver(this);
   		}
   
  +		m_hasStripOrPreserveSpace = m_stylesheetRoot->getWhitespacePreservingElements().size() > 0 ||
  +			m_stylesheetRoot->getWhitespaceStrippingElements().size() > 0;
  +
   		m_stylesheetRoot->process(sourceTree, outputTarget, executionContext);
  +	}
   
  -		if(0 != m_diagnosticsPrintWriter)
  -		{
  -			displayDuration(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("Total time")), &totalTimeID);
  -		}
  +	if(0 != m_diagnosticsPrintWriter)
  +	{
  +		displayDuration(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("Total time")), &totalTimeID);
   	}
   }
   
  @@ -438,11 +444,14 @@
   		FormatterListener* const	theFormatter =
   				outputTarget.getDocumentHandler();
   
  -		if (theFormatter != 0)
  +		if (theFormatter != 0 && theFormatter->getPrefixResolver() == 0)
   		{
   			theFormatter->setPrefixResolver(this);
   		}
   
  +		m_hasStripOrPreserveSpace = m_stylesheetRoot->getWhitespacePreservingElements().size() > 0 ||
  +			m_stylesheetRoot->getWhitespaceStrippingElements().size() > 0;
  +
   		m_stylesheetRoot->process(sourceTree, outputTarget, executionContext);
   	}
   
  @@ -2939,7 +2948,7 @@
   			XPathExecutionContext&	executionContext,
   			const XalanNode&		textNode) const
   {
  -	if (m_stylesheetRoot == 0)
  +	if (m_hasStripOrPreserveSpace == false || m_stylesheetRoot == 0)
   	{
   		return false;
   	}
  @@ -2947,118 +2956,117 @@
   	{
   		bool	strip = false; // return value
   
  -		if((m_stylesheetRoot->getWhitespacePreservingElements().size() > 0 ||
  -			m_stylesheetRoot->getWhitespaceStrippingElements().size() > 0))
  -		{
  -			const XalanNode::NodeType	type = textNode.getNodeType();
  +		assert(m_stylesheetRoot->getWhitespacePreservingElements().size() > 0 ||
  +			   m_stylesheetRoot->getWhitespaceStrippingElements().size() > 0);
   
  -			if(XalanNode::TEXT_NODE == type || XalanNode::CDATA_SECTION_NODE == type)
  -			{
  -				const XalanText& 	theTextNode =
  +		const XalanNode::NodeType	type = textNode.getNodeType();
  +
  +		if(XalanNode::TEXT_NODE == type || XalanNode::CDATA_SECTION_NODE == type)
  +		{
  +			const XalanText& 	theTextNode =
   #if defined(XALAN_OLD_STYLE_CASTS)
  -						(const XalanText&)textNode;
  +					(const XalanText&)textNode;
   #else
  -						static_cast<const XalanText&>(textNode);
  +					static_cast<const XalanText&>(textNode);
   #endif
   
  -				if(!theTextNode.isIgnorableWhitespace())
  -				{
  -					const XalanDOMString&	data = theTextNode.getData();
  +			if(!theTextNode.isIgnorableWhitespace())
  +			{
  +				const XalanDOMString&	data = theTextNode.getData();
   
  -					if(0 == length(data))
  -					{
  -						return true;
  -					}
  -					else if(!isXMLWhitespace(data))
  -					{
  -						return false;
  -					}
  +				if(0 == length(data))
  +				{
  +					return true;
  +				}
  +				else if(!isXMLWhitespace(data))
  +				{
  +					return false;
   				}
  +			}
   
  -				XalanNode*	parent = DOMServices::getParentOfNode(textNode);
  +			XalanNode*	parent = DOMServices::getParentOfNode(textNode);
   
  -				while(0 != parent)
  +			while(0 != parent)
  +			{
  +				if(parent->getNodeType() == XalanNode::ELEMENT_NODE)
   				{
  -					if(parent->getNodeType() == XalanNode::ELEMENT_NODE)
  -					{
  -						const XalanElement*	const	parentElem =
  +					const XalanElement*	const	parentElem =
   #if defined(XALAN_OLD_STYLE_CASTS)
  -							(const XalanElement*)parent;
  +						(const XalanElement*)parent;
   #else
  -							static_cast<const XalanElement*>(parent);
  +						static_cast<const XalanElement*>(parent);
   #endif
   
  -						XPath::eMatchScore	highPreserveScore = XPath::eMatchScoreNone;
  -						XPath::eMatchScore	highStripScore = XPath::eMatchScoreNone;
  +					XPath::eMatchScore	highPreserveScore = XPath::eMatchScoreNone;
  +					XPath::eMatchScore	highStripScore = XPath::eMatchScoreNone;
   
  -						ElementPrefixResolverProxy	theProxy(parentElem, m_xpathEnvSupport, m_domSupport);
  +					ElementPrefixResolverProxy	theProxy(parentElem, m_xpathEnvSupport, m_domSupport);
   
  -						{
  -							// $$$ ToDo:  All of this should be moved into a member of
  -							// Stylesheet, so as not to expose these two data members...
  -							typedef Stylesheet::XPathVectorType		XPathVectorType;
  +					{
  +						// $$$ ToDo:  All of this should be moved into a member of
  +						// Stylesheet, so as not to expose these two data members...
  +						typedef Stylesheet::XPathVectorType		XPathVectorType;
   
  -							const XPathVectorType&	theElements =
  +						const XPathVectorType&	theElements =
   								m_stylesheetRoot->getWhitespacePreservingElements();
   
  -							const XPathVectorType::size_type	nTests =
  +						const XPathVectorType::size_type	nTests =
   								theElements.size();
   
  -							for(XPathVectorType::size_type i = 0; i < nTests; i++)
  -							{
  -								const XPath* const	matchPat = theElements[i];
  -								assert(matchPat != 0);
  +						for(XPathVectorType::size_type i = 0; i < nTests; i++)
  +						{
  +							const XPath* const	matchPat = theElements[i];
  +							assert(matchPat != 0);
   
  -								const XPath::eMatchScore	score = matchPat->getMatchScore(parent, theProxy, executionContext);
  +							const XPath::eMatchScore	score = matchPat->getMatchScore(parent, theProxy, executionContext);
   
  -								if(score > highPreserveScore)
  -									highPreserveScore = score;
  -							}
  +							if(score > highPreserveScore)
  +								highPreserveScore = score;
   						}
  +					}
   
  -						{
  -							typedef Stylesheet::XPathVectorType		XPathVectorType;
  +					{
  +						typedef Stylesheet::XPathVectorType		XPathVectorType;
   
  -							const XPathVectorType&	theElements =
  +						const XPathVectorType&	theElements =
   								m_stylesheetRoot->getWhitespaceStrippingElements();
   
  -							const XPathVectorType::size_type	nTests =
  -								theElements.size();
  +						const XPathVectorType::size_type	nTests =
  +							theElements.size();
   
  -							for(XPathVectorType::size_type i = 0; i < nTests; i++)
  -							{
  -								const XPath* const	matchPat =
  +						for(XPathVectorType::size_type i = 0; i < nTests; i++)
  +						{
  +							const XPath* const	matchPat =
   									theElements[i];
  -								assert(matchPat != 0);
  +							assert(matchPat != 0);
   
  -								const XPath::eMatchScore	score = matchPat->getMatchScore(parent, theProxy, executionContext);
  +							const XPath::eMatchScore	score = matchPat->getMatchScore(parent, theProxy, executionContext);
   
  -								if(score > highStripScore)
  -									highStripScore = score;
  -							}
  +							if(score > highStripScore)
  +								highStripScore = score;
   						}
  +					}
   
  -						if(highPreserveScore > XPath::eMatchScoreNone ||
  -						   highStripScore > XPath::eMatchScoreNone)
  +					if(highPreserveScore > XPath::eMatchScoreNone ||
  +					   highStripScore > XPath::eMatchScoreNone)
  +					{
  +						if(highPreserveScore > highStripScore)
   						{
  -							if(highPreserveScore > highStripScore)
  -							{
  -								strip = false;
  -							}
  -							else if(highStripScore > highPreserveScore)
  -							{
  -								strip = true;
  -							}
  -							else
  -							{
  -								warn("Match conflict between xsl:strip-space and xsl:preserve-space");
  -							}
  -							break;
  +							strip = false;
   						}
  +						else if(highStripScore > highPreserveScore)
  +						{
  +							strip = true;
  +						}
  +						else
  +						{
  +							warn("Match conflict between xsl:strip-space and xsl:preserve-space");
  +						}
  +						break;
   					}
  -
  -					parent = parent->getParentNode();
   				}
  +
  +				parent = parent->getParentNode();
   			}
   		}
   
  
  
  
  1.82      +2 -0      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.81
  retrieving revision 1.82
  diff -u -r1.81 -r1.82
  --- XSLTEngineImpl.hpp	28 Mar 2002 07:07:56 -0000	1.81
  +++ XSLTEngineImpl.hpp	6 Apr 2002 19:35:58 -0000	1.82
  @@ -1642,6 +1642,8 @@
   
   	XalanDOMString					m_scratchString;
   
  +	bool							m_hasStripOrPreserveSpace;
  +
   	static void
   	installFunctions();
   
  
  
  

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