dbertoni 2002/07/09 22:09:49 Modified: c/src/XSLT ElemApplyTemplates.cpp ElemForEach.cpp ElemForEach.hpp ElemTemplateElement.cpp ElemTemplateElement.hpp ElemVariable.hpp ElemWithParam.hpp Log: Moved transformSelectedChildren() into ElemForEach, since that's the only place it's used. Revision Changes Path 1.23 +9 -11 xml-xalan/c/src/XSLT/ElemApplyTemplates.cpp Index: ElemApplyTemplates.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemApplyTemplates.cpp,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- ElemApplyTemplates.cpp 23 Feb 2002 04:23:16 -0000 1.22 +++ ElemApplyTemplates.cpp 10 Jul 2002 05:09:48 -0000 1.23 @@ -156,7 +156,14 @@ XalanNode* const sourceNode = executionContext.getCurrentNode(); - if (0 != sourceNode) + if (sourceNode == 0) + { + executionContext.error( + "There is no current node in ElemApplyTemplates::execute()", + sourceNode, + this); + } + else { // Dragons here. Push the params & stack frame, but then execute the // select statement inside transformSelectedChildren, which must be @@ -168,9 +175,8 @@ sourceNode, this); - assert(executionContext.getCurrentMode() != 0); - const XalanQName* const currentMode = executionContext.getCurrentMode(); + assert(currentMode != 0); if (m_isDefaultTemplate == false && !m_mode.equals(*currentMode)) @@ -194,13 +200,6 @@ thePushPop.getStackFrameIndex()); } } - else - { - executionContext.error( - "There is no current node in ElemApplyTemplates::execute()", - sourceNode, - this); - } } @@ -212,7 +211,6 @@ switch(xslToken) { - // char-instructions case Constants::ELEMNAME_SORT: case Constants::ELEMNAME_WITHPARAM: fResult = true; 1.25 +155 -15 xml-xalan/c/src/XSLT/ElemForEach.cpp Index: ElemForEach.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemForEach.cpp,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- ElemForEach.cpp 29 May 2002 18:21:52 -0000 1.24 +++ ElemForEach.cpp 10 Jul 2002 05:09:48 -0000 1.25 @@ -75,8 +75,13 @@ +#include <XPath/XPath.hpp> + + + #include "ElemSort.hpp" #include "NodeSorter.hpp" +#include "SelectionEvent.hpp" #include "StylesheetConstructionContext.hpp" #include "StylesheetExecutionContext.hpp" @@ -93,7 +98,9 @@ lineNumber, columnNumber, Constants::ELEMNAME_FOREACH), - m_selectPattern(0) + m_selectPattern(0), + m_sortElems(), + m_sortElemsCount(0) { const unsigned int nAttrs = atts.getLength(); @@ -137,7 +144,9 @@ lineNumber, columnNumber, xslToken), - m_selectPattern(0) + m_selectPattern(0), + m_sortElems(), + m_sortElemsCount(0) { } @@ -165,6 +174,18 @@ void +ElemForEach::postConstruction( + StylesheetConstructionContext& constructionContext, + const NamespacesHandler& theParentHandler) +{ + ElemTemplateElement::postConstruction(constructionContext, theParentHandler); + + m_sortElemsCount = m_sortElems.size(); +} + + + +void ElemForEach::execute(StylesheetExecutionContext& executionContext) const { assert(m_selectPattern != 0); @@ -186,7 +207,7 @@ else { executionContext.error( - "There is no current node in ElemForEach::execute()!", + "There is no current node in ElemForEach::execute()", sourceNode, this); } @@ -202,17 +223,15 @@ XalanNode* sourceNodeContext, int selectStackFrameIndex) const { - const SortElemsVectorType& sortElements = getSortElems(); - const SortElemsVectorType::size_type nChildren = sortElements.size(); + assert(m_selectPattern != 0); + assert(m_sortElemsCount == m_sortElems.size()); - if (nChildren == 0) + if (m_sortElemsCount == 0) { - ElemTemplateElement::transformSelectedChildren( + transformSelectedChildren( executionContext, - *this, theTemplate, sourceNodeContext, - *m_selectPattern, 0, selectStackFrameIndex); } @@ -229,7 +248,7 @@ CollectionClearGuard<NodeSortKeyVectorType> guard(keys); // Reserve the space now... - keys.reserve(nChildren); + keys.reserve(m_sortElemsCount); // Get some temporary strings to use for evaluting the AVTs... XPathExecutionContext::GetAndReleaseCachedString theTemp1(executionContext); @@ -242,9 +261,9 @@ // March backwards, performing a sort on each xsl:sort child. // Probably not the most efficient method. - for(SortElemsVectorType::size_type i = 0; i < nChildren; i++) + for(SortElemsVectorType::size_type i = 0; i < m_sortElemsCount; i++) { - const ElemSort* const sort = sortElements[i]; + const ElemSort* const sort = m_sortElems[i]; assert(sort != 0); const AVT* avt = sort->getLangAVT(); @@ -361,13 +380,134 @@ *this)); } - ElemTemplateElement::transformSelectedChildren( + transformSelectedChildren( executionContext, - *this, theTemplate, sourceNodeContext, - *m_selectPattern, sorter.get(), selectStackFrameIndex); + } +} + + + +void +ElemForEach::transformSelectedChildren( + StylesheetExecutionContext& executionContext, + const ElemTemplateElement* theTemplate, + XalanNode* sourceNodeContext, + NodeSorter* sorter, + int selectStackFrameIndex) const +{ + typedef StylesheetExecutionContext::SetAndRestoreCurrentStackFrameIndex SetAndRestoreCurrentStackFrameIndex; + + assert(m_selectPattern != 0); + + XObjectPtr theXObject; + + { + SetAndRestoreCurrentStackFrameIndex theSetAndRestore( + executionContext, + selectStackFrameIndex); + + theXObject = m_selectPattern->execute( + sourceNodeContext, + *this, + executionContext); + } + + if (theXObject.null() == false) + { + const NodeRefListBase& sourceNodes = theXObject->nodeset(); + + if(0 != executionContext.getTraceListeners()) + { + executionContext.fireSelectEvent( + SelectionEvent(executionContext, + sourceNodeContext, + *this, + StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("select")), + *m_selectPattern, + theXObject)); + } + + const NodeRefListBase::size_type nNodes = sourceNodes.getLength(); + + if (nNodes > 0) + { + // If there's not NodeSorter, or we've only selected one node, + // then just do the transform... + if (sorter == 0 || nNodes == 1) + { + transformSelectedChildren( + executionContext, + theTemplate, + sourceNodes, + nNodes); + } + else + { + typedef StylesheetExecutionContext::SetAndRestoreCurrentStackFrameIndex SetAndRestoreCurrentStackFrameIndex; + typedef StylesheetExecutionContext::ContextNodeListSetAndRestore ContextNodeListSetAndRestore; + typedef StylesheetExecutionContext::BorrowReturnMutableNodeRefList BorrowReturnMutableNodeRefList; + + BorrowReturnMutableNodeRefList sortedSourceNodes(executionContext); + + *sortedSourceNodes = sourceNodes; + + { + SetAndRestoreCurrentStackFrameIndex theStackFrameSetAndRestore( + executionContext, + selectStackFrameIndex); + + ContextNodeListSetAndRestore theContextNodeListSetAndRestore( + executionContext, + sourceNodes); + + sorter->sort(executionContext, *sortedSourceNodes); + } + + transformSelectedChildren( + executionContext, + theTemplate, + *sortedSourceNodes, + nNodes); + } + } + } +} + + + +void +ElemForEach::transformSelectedChildren( + StylesheetExecutionContext& executionContext, + const ElemTemplateElement* theTemplate, + const NodeRefListBase& sourceNodes, + NodeRefListBase::size_type sourceNodesCount) const +{ + if(executionContext.getTraceSelects() == true) + { + executionContext.traceSelect( + *this, + sourceNodes, + m_selectPattern); + } + + // Create an object to set and restore the context node list... + StylesheetExecutionContext::ContextNodeListSetAndRestore theSetAndRestore( + executionContext, + sourceNodes); + + for(unsigned int i = 0; i < sourceNodesCount; i++) + { + XalanNode* const childNode = sourceNodes.item(i); + assert(childNode != 0); + + transformChild( + executionContext, + *this, + theTemplate, + childNode); } } 1.14 +56 -1 xml-xalan/c/src/XSLT/ElemForEach.hpp Index: ElemForEach.hpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemForEach.hpp,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- ElemForEach.hpp 26 Sep 2001 21:30:23 -0000 1.13 +++ ElemForEach.hpp 10 Jul 2002 05:09:48 -0000 1.14 @@ -70,11 +70,20 @@ // Base class header file. #include "ElemTemplateElement.hpp" + + + +#include <XPath/NodeRefListBase.hpp> + + + #include "Constants.hpp" class ElemSort; +class ElemTemplate; +class NodeSorter; class XPath; @@ -121,12 +130,23 @@ return m_sortElems; } + const XPath* + getSelectExpression() const + { + return m_selectPattern; + } + // These methods are inherited from ElemTemplateElement ... virtual const XalanDOMString& getElementName() const; virtual void + postConstruction( + StylesheetConstructionContext& constructionContext, + const NamespacesHandler& theParentHandler); + + virtual void execute(StylesheetExecutionContext& executionContext) const; protected: @@ -163,11 +183,46 @@ XalanNode* sourceNodeContext, int selectStackFrameIndex) const; + /** + * Perform a query if needed, and call transformChild for each child. + * + * @param executionContext The current execution context + * @param template The owning template context. + * @param sourceNodeContext The current source node context. + * @param selectStackFrameIndex stack frame context for executing the + * select statement + */ + void + transformSelectedChildren( + StylesheetExecutionContext& executionContext, + const ElemTemplateElement* theTemplate, + XalanNode* sourceNodeContext, + NodeSorter* sorter, + int selectStackFrameIndex) const; + + /** + * Perform a query if needed, and call transformChild for each child. + * + * @param executionContext The current execution context + * @param theTemplate The owning template context. + * @param sourceNodes The source nodes to transform. + * @param sourceNodesCount The count of source nodes to transform. + */ + void + transformSelectedChildren( + StylesheetExecutionContext& executionContext, + const ElemTemplateElement* theTemplate, + const NodeRefListBase& sourceNodes, + NodeRefListBase::size_type sourceNodesCount) const; + const XPath* m_selectPattern; private: - SortElemsVectorType m_sortElems; + SortElemsVectorType m_sortElems; + + SortElemsVectorType::size_type m_sortElemsCount; + }; 1.75 +1 -126 xml-xalan/c/src/XSLT/ElemTemplateElement.cpp Index: ElemTemplateElement.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplateElement.cpp,v retrieving revision 1.74 retrieving revision 1.75 diff -u -r1.74 -r1.75 --- ElemTemplateElement.cpp 10 Jul 2002 00:42:36 -0000 1.74 +++ ElemTemplateElement.cpp 10 Jul 2002 05:09:48 -0000 1.75 @@ -95,6 +95,7 @@ #include "Constants.hpp" #include "ElemCallTemplate.hpp" +#include "ElemForEach.hpp" #include "ElemTemplate.hpp" #include "NamespacesHandler.hpp" #include "NodeSorter.hpp" @@ -670,132 +671,6 @@ oldChild->setNextSiblingElem(0); return oldChild; -} - - - -void -ElemTemplateElement::transformSelectedChildren( - StylesheetExecutionContext& executionContext, - const ElemTemplateElement& xslInstruction, - const ElemTemplateElement* theTemplate, - XalanNode* sourceNodeContext, - const XPath& selectPattern, - NodeSorter* sorter, - int selectStackFrameIndex) const -{ - typedef StylesheetExecutionContext::SetAndRestoreCurrentStackFrameIndex SetAndRestoreCurrentStackFrameIndex; - - XObjectPtr theXObject; - - { - SetAndRestoreCurrentStackFrameIndex theSetAndRestore( - executionContext, - selectStackFrameIndex); - - theXObject = selectPattern.execute( - sourceNodeContext, - xslInstruction, - executionContext); - } - - if (theXObject.null() == false) - { - const NodeRefListBase& sourceNodes = theXObject->nodeset(); - - if(0 != executionContext.getTraceListeners()) - { - executionContext.fireSelectEvent( - SelectionEvent(executionContext, - sourceNodeContext, - *this, - StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("select")), - selectPattern, - theXObject)); - } - - const NodeRefListBase::size_type nNodes = sourceNodes.getLength(); - - if (nNodes > 0) - { - // If there's not NodeSorter, or we've only selected one node, - // then just do the transform... - if (sorter == 0 || nNodes == 1) - { - transformSelectedChildren( - executionContext, - xslInstruction, - theTemplate, - sourceNodes, - nNodes); - } - else - { - typedef StylesheetExecutionContext::SetAndRestoreCurrentStackFrameIndex SetAndRestoreCurrentStackFrameIndex; - typedef StylesheetExecutionContext::ContextNodeListSetAndRestore ContextNodeListSetAndRestore; - typedef StylesheetExecutionContext::BorrowReturnMutableNodeRefList BorrowReturnMutableNodeRefList; - - BorrowReturnMutableNodeRefList sortedSourceNodes(executionContext); - - *sortedSourceNodes = sourceNodes; - - { - SetAndRestoreCurrentStackFrameIndex theStackFrameSetAndRestore( - executionContext, - selectStackFrameIndex); - - ContextNodeListSetAndRestore theContextNodeListSetAndRestore( - executionContext, - sourceNodes); - - sorter->sort(executionContext, *sortedSourceNodes); - } - - transformSelectedChildren( - executionContext, - xslInstruction, - theTemplate, - *sortedSourceNodes, - nNodes); - } - } - } -} - - - -void -ElemTemplateElement::transformSelectedChildren( - StylesheetExecutionContext& executionContext, - const ElemTemplateElement& xslInstruction, - const ElemTemplateElement* theTemplate, - const NodeRefListBase& sourceNodes, - NodeRefListBase::size_type sourceNodesCount) const -{ - if(executionContext.getTraceSelects() == true) - { - executionContext.traceSelect( - xslInstruction, - sourceNodes, - 0); - } - - // Create an object to set and restore the context node list... - StylesheetExecutionContext::ContextNodeListSetAndRestore theSetAndRestore( - executionContext, - sourceNodes); - - for(unsigned int i = 0; i < sourceNodesCount; i++) - { - XalanNode* const childNode = sourceNodes.item(i); - assert(childNode != 0); - - transformChild( - executionContext, - xslInstruction, - theTemplate, - childNode); - } } 1.43 +0 -45 xml-xalan/c/src/XSLT/ElemTemplateElement.hpp Index: ElemTemplateElement.hpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplateElement.hpp,v retrieving revision 1.42 retrieving revision 1.43 diff -u -r1.42 -r1.43 --- ElemTemplateElement.hpp 10 Jul 2002 00:42:36 -0000 1.42 +++ ElemTemplateElement.hpp 10 Jul 2002 05:09:48 -0000 1.43 @@ -82,10 +82,6 @@ -#include <XPath/NodeRefListBase.hpp> - - - #include <XSLT/NamespacesHandler.hpp> @@ -93,11 +89,9 @@ class AttributeList; class ElemTemplate; class NamespacesHandler; -class NodeSorter; class Stylesheet; class StylesheetConstructionContext; class StylesheetExecutionContext; -class XPath; @@ -729,45 +723,6 @@ */ const XalanDOMString* getNamespaceForPrefixInternal(const XalanDOMString& prefix) const; - - /** - * Perform a query if needed, and call transformChild for each child. - * - * @param executionContext The current execution context - * @param xslInstruction The stylesheet element context (deprecated -- I do - * not think we need this). - * @param template The owning template context. - * @param sourceNodeContext The current source node context. - * @param selectPattern The XPath with which to perform the selection. - * @param selectStackFrameIndex stack frame context for executing the - * select statement - */ - void - transformSelectedChildren( - StylesheetExecutionContext& executionContext, - const ElemTemplateElement& xslInstruction, - const ElemTemplateElement* theTemplate, - XalanNode* sourceNodeContext, - const XPath& selectPattern, - NodeSorter* sorter, - int selectStackFrameIndex) const; - - /** - * Perform a query if needed, and call transformChild for each child. - * - * @param executionContext The current execution context - * @param xslInstruction The stylesheet element context - * @param theTemplate The owning template context. - * @param sourceNodes The source nodes to transform. - * @param sourceNodesCount The count of source nodes to transform. - */ - void - transformSelectedChildren( - StylesheetExecutionContext& executionContext, - const ElemTemplateElement& xslInstruction, - const ElemTemplateElement* theTemplate, - const NodeRefListBase& sourceNodes, - NodeRefListBase::size_type sourceNodesCount) const; /** * Given an element, find the corresponding 1.16 +5 -1 xml-xalan/c/src/XSLT/ElemVariable.hpp Index: ElemVariable.hpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemVariable.hpp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- ElemVariable.hpp 13 Aug 2001 17:08:53 -0000 1.15 +++ ElemVariable.hpp 10 Jul 2002 05:09:48 -0000 1.16 @@ -83,6 +83,10 @@ +class XPath; + + + class ElemVariable : public ElemTemplateElement { public: 1.9 +4 -0 xml-xalan/c/src/XSLT/ElemWithParam.hpp Index: ElemWithParam.hpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemWithParam.hpp,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- ElemWithParam.hpp 13 Aug 2001 17:08:53 -0000 1.8 +++ ElemWithParam.hpp 10 Jul 2002 05:09:48 -0000 1.9 @@ -73,6 +73,10 @@ +class XPath; + + + class ElemWithParam : public ElemTemplateElement { public:
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]