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/02/01 19:32:59 UTC

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

dbertoni    01/02/01 10:32:59

  Modified:    c/src/XSLT StylesheetHandler.cpp StylesheetHandler.hpp
  Log:
  Support xml:space appropriately.
  
  Revision  Changes    Path
  1.55      +89 -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.54
  retrieving revision 1.55
  diff -u -r1.54 -r1.55
  --- StylesheetHandler.cpp	2001/01/31 01:41:41	1.54
  +++ StylesheetHandler.cpp	2001/02/01 18:32:57	1.55
  @@ -244,21 +244,26 @@
   StylesheetHandler::processSpaceAttr(
   			const XalanDOMChar*		aname,
   			const AttributeList&	atts,
  -			int						which)
  +			int						which,
  +			bool&					fPreserve)
   {
   	const bool	isSpaceAttr = equals(aname, Constants::ATTRNAME_XMLSPACE);
   
  -	if(isSpaceAttr)
  +	if(isSpaceAttr == false)
   	{
  +		fPreserve = false;
  +	}
  +	else
  +	{
   		const XalanDOMChar*	const	spaceVal = atts.getValue(which);
   
   		if(equals(spaceVal, Constants::ATTRVAL_DEFAULT))
   		{
  -			m_stylesheet.setDefaultSpaceProcessing(true);
  +			fPreserve = false;
   		}
   		else if(equals(spaceVal, Constants::ATTRVAL_PRESERVE))
   		{
  -			m_stylesheet.setDefaultSpaceProcessing(false);
  +			fPreserve = true;
   		}
   		else
   		{
  @@ -271,6 +276,26 @@
   
   
   
  +bool
  +StylesheetHandler::processSpaceAttr(
  +			const AttributeList&	atts,
  +			bool&					fPreserve)
  +{
  +	const unsigned int	len = atts.getLength();
  +
  +	for (unsigned int i = 0; i < len; ++i)
  +	{
  +		if (processSpaceAttr(atts.getName(i), atts, i, fPreserve) == true)
  +		{
  +			return true;
  +		}
  +	}
  +
  +	return false;
  +}
  +
  +
  +
   void
   StylesheetHandler::startElement(
   			const XMLCh* const	name,
  @@ -282,11 +307,25 @@
   
   	m_inExtensionElementStack.push_back(false);
   
  +	if (m_preserveSpaceStack.empty() == true)
  +	{
  +		m_preserveSpaceStack.push_back(false);
  +	}
  +	else
  +	{
  +		m_preserveSpaceStack.push_back(m_preserveSpaceStack.back());
  +	}
  +
   	try
   	{
   #if !defined(XALAN_NO_NAMESPACES)
   		using std::for_each;
   #endif
  +
  +		// By default, space is not preserved...
  +		bool	fPreserveSpace = false;
  +		bool	fSpaceAttrProcessed = false;
  +
   		processAccumulatedText();
   
   		// Clean up the whitespace elements.
  @@ -549,8 +588,6 @@
   
   					bool				fVersionFound = false;
   
  -					// bool didSpecifiyIndent = false;	//doesn't seem to be used
  -
   					for(unsigned int i = 0; i < nAttrs; i++)
   					{
   						const XalanDOMChar* const	aname = atts.getName(i);
  @@ -599,8 +636,12 @@
   							m_stylesheet.setXSLTVerDeclared(DoubleSupport::toDouble(versionStr));
   
   							fVersionFound = true;
  +						}
  +						else if(processSpaceAttr(aname, atts, i, fPreserveSpace) == true)
  +						{
  +							fSpaceAttrProcessed = true;
   						}
  -						else if(!(isAttrOK(aname, atts, i) || processSpaceAttr(aname, atts, i)))
  +						else if(isAttrOK(aname, atts, i) == false)
   						{
   							if(false == m_stylesheet.isWrapperless())
   							{
  @@ -621,6 +662,18 @@
   					{
   						throw SAXException(c_wstr(TranscodeFromLocalCodePage("The stylesheet element did not specify a version attribute!")));
   					}
  +					else
  +					{
  +						if (fPreserveSpace == false)
  +						{
  +							m_stylesheet.setDefaultSpaceProcessing(true);
  +						}
  +						else
  +						{
  +							m_stylesheet.setDefaultSpaceProcessing(false);
  +						}
  +					}
  +
   				}
   				break;
   
  @@ -1050,6 +1103,19 @@
   			m_elemStack.push_back(elem);
   		}
   
  +		// If we haven't processed an xml:space attribute already, look for one...
  +		if (fSpaceAttrProcessed == false)
  +		{
  +			fSpaceAttrProcessed = processSpaceAttr(atts, fPreserveSpace);
  +		}
  +
  +		// Only update the stack if we actually processed an xml:space attribute...
  +		if (fSpaceAttrProcessed == true)
  +		{
  +			// Set the preserve value...
  +			m_preserveSpaceStack.back() = fPreserveSpace;
  +		}
  +
   		// If for some reason something didn't get pushed, push an empty 
   		// object.
   		if(origStackSize == m_elemStack.size())
  @@ -1402,6 +1468,10 @@
   	assert(m_inExtensionElementStack.empty() == false);
   
   	m_inExtensionElementStack.pop_back();
  +
  +	assert(m_preserveSpaceStack.empty() == false);
  +
  +	m_preserveSpaceStack.pop_back();
   }
   
   
  @@ -1525,27 +1595,30 @@
   	if(m_inTemplate)
   	{
   		ElemTemplateElement*	parent = m_elemStack.back();
  +		assert(parent != 0);
  +
  +		assert(m_preserveSpaceStack.empty() == false);
   
  -		bool					preserveSpace = false;
  -		bool					disableOutputEscaping = false;
  +		bool		preserveSpace = m_preserveSpaceStack.back();
  +		bool		disableOutputEscaping = false;
   
  -		if(Constants::ELEMNAME_TEXT == parent->getXSLToken())
  +		if (preserveSpace == false && parent->getXSLToken() == Constants::ELEMNAME_TEXT)
   		{
   #if defined(XALAN_OLD_STYLE_CASTS)
   			disableOutputEscaping = ((ElemText*)parent)->getDisableOutputEscaping();
   #else
   			disableOutputEscaping = static_cast<ElemText*>(parent)->getDisableOutputEscaping();
   #endif
  -			parent = m_elemStack[m_elemStack.size()-2];
   			preserveSpace = true;
  +			parent = m_elemStack[m_elemStack.size()-2];
   		}
   
   		const Locator* const	locator = m_constructionContext.getLocatorFromStack();
   
  -		const int lineNumber = (0 != locator) ? locator->getLineNumber() : 0;
  -		const int columnNumber = (0 != locator) ? locator->getColumnNumber() : 0;
  +		const int	lineNumber = (0 != locator) ? locator->getLineNumber() : 0;
  +		const int	columnNumber = (0 != locator) ? locator->getColumnNumber() : 0;
   
  -		ElemTextLiteral* elem = new ElemTextLiteral(m_constructionContext,
  +		ElemTextLiteral* const	elem = new ElemTextLiteral(m_constructionContext,
   			m_stylesheet,
   			lineNumber, columnNumber,
   			chars, 0, length,
  @@ -1688,6 +1761,7 @@
   	m_namespaces.swap(theHandler.m_stylesheet.getNamespaces());
   	m_namespacesHandler.swap(theHandler.m_stylesheet.getNamespacesHandler());
   	m_inExtensionElementStack.swap(theHandler.m_inExtensionElementStack);
  +	m_preserveSpaceStack.swap(theHandler.m_preserveSpaceStack);
   }
   
   
  @@ -1720,4 +1794,5 @@
   	m_handler.m_stylesheet.getNamespaces().swap(m_namespaces);
   	m_handler.m_stylesheet.getNamespacesHandler().swap(m_namespacesHandler);
   	m_handler.m_inExtensionElementStack.swap(m_inExtensionElementStack);
  +	m_handler.m_preserveSpaceStack.swap(m_preserveSpaceStack);
   }
  
  
  
  1.23      +19 -1     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.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- StylesheetHandler.hpp	2001/01/29 01:11:49	1.22
  +++ StylesheetHandler.hpp	2001/02/01 18:32:58	1.23
  @@ -378,14 +378,28 @@
   	 * @param aname The name of the attribute in question.
   	 * @param atts The attribute list that owns the attribute.
   	 * @param which The index of the attribute into the attribute list.
  +	 * @param fPreserve set to true if the attribute value is "preserve"
   	 * @return True if this is a xml:space attribute.
   	 */
   	bool
   	processSpaceAttr(
   			const XalanDOMChar*		aname,
   			const AttributeList&	atts,
  -			int						which);
  +			int						which,
  +			bool&					fPreserve);
   
  +	/** 
  +	 * Tell whether or not this is a xml:space attribute and, if so, process it.
  +	 * 
  +	 * @param atts The attribute list that owns the attribute.
  +	 * @param fPreserve set to true if an xml:space attribute value is "preserve"
  +	 * @return True if this is a xml:space attribute.
  +	 */
  +	bool
  +	processSpaceAttr(
  +			const AttributeList&	atts,
  +			bool&					fPreserve);
  +
   	/**
   	 * Process xsl:import.
   	 */
  @@ -502,6 +516,8 @@
   
   	BoolStackType	m_inExtensionElementStack;
   
  +	BoolStackType	m_preserveSpaceStack;
  +
   	// BEGIN SANJIVA CODE
   	bool m_inLXSLTScript;
   	XalanDOMString m_LXSLTScriptBody;
  @@ -556,6 +572,8 @@
   		NamespacesHandler					m_namespacesHandler;
   
   		BoolStackType						m_inExtensionElementStack;
  +
  +		BoolStackType						m_preserveSpaceStack;
   	};
   
   	friend class PushPopIncludeState;