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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]