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...@locus.apache.org on 2000/07/25 16:49:38 UTC
cvs commit: xml-xalan/c/src/XSLT ElemTemplateElement.cpp ElemTemplateElement.hpp
dbertoni 00/07/25 07:49:36
Modified: c/src/XSLT ElemTemplateElement.cpp ElemTemplateElement.hpp
Log:
Restructured code so that node lists are not copied unnecessarily.
Revision Changes Path
1.26 +208 -66 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.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- ElemTemplateElement.cpp 2000/07/06 20:19:25 1.25
+++ ElemTemplateElement.cpp 2000/07/25 14:49:32 1.26
@@ -96,8 +96,7 @@
#include "ElemForEach.hpp"
#include "ElemSort.hpp"
#include "ElemTemplate.hpp"
-#include "NodeSortKey.hpp"
-#include "NodeSorter.hpp"
+//#include "NodeSortKey.hpp"
#include "Stylesheet.hpp"
#include "StylesheetExecutionContext.hpp"
#include "StylesheetRoot.hpp"
@@ -579,7 +578,7 @@
const QName& mode,
const XPath* selectPattern,
int xslToken,
- int selectStackFrameIndex) const
+ int selectStackFrameIndex) const
{
typedef StylesheetExecutionContext::SetAndRestoreCurrentStackFrameIndex SetAndRestoreCurrentStackFrameIndex;
@@ -630,9 +629,6 @@
keys.push_back(key);
}
}
- // @@ JMD: Now in method processSortKeys in java ...
-
- MutableNodeRefList sourceNodes = executionContext.createMutableNodeRefList();
/*
@@@ JMD: This is newer java code that is not implemented in C++; so, the
@@ -645,36 +641,43 @@
if (0 != selectPattern)
{
- SetAndRestoreCurrentStackFrameIndex theSetAndRestore(
- executionContext,
- selectStackFrameIndex);
+ XObject* theXObject = 0;
-/*
- @@@ JMD: This is newer java code that is not implemented in C++; the
- callback mechanism may affect the correct positioning of the stack frame and
- may be why the parameters aren't working right
-
- // Optimization note: is there a way we can keep from creating
- // a new callback context every time?
- TemplateElementContext callbackContext
- = (null != callback)
- ? new TemplateElementContext(stylesheetTree, xslInstruction,
- template, sourceNodeContext, mode, xslToken, tcontext,
- savedCurrentStackFrameIndex) : null;
-*/
+ {
+ SetAndRestoreCurrentStackFrameIndex theSetAndRestore(
+ executionContext,
+ selectStackFrameIndex);
- const XObjectGuard result(
- executionContext.getXObjectFactory(),
- selectPattern->execute(
- sourceNodeContext,
- xslInstruction,
- executionContext));
+ /*
+ @@@ JMD: This is newer java code that is not implemented in C++; the
+ callback mechanism may affect the correct positioning of the stack frame and
+ may be why the parameters aren't working right
+
+ // Optimization note: is there a way we can keep from creating
+ // a new callback context every time?
+ TemplateElementContext callbackContext
+ = (null != callback)
+ ? new TemplateElementContext(stylesheetTree, xslInstruction,
+ template, sourceNodeContext, mode, xslToken, tcontext,
+ savedCurrentStackFrameIndex) : null;
+ */
+
+ theXObject =
+ selectPattern->execute(
+ sourceNodeContext,
+ xslInstruction,
+ executionContext);
+ }
// @@ JMD: Should this be an assert ??
- if (0 != result.get())
+ if (0 != theXObject)
{
- sourceNodes = result->mutableNodeset();
+ const XObjectGuard result(
+ executionContext.getXObjectFactory(),
+ theXObject);
+ const NodeRefListBase* const sourceNodes = &result->mutableNodeset();
+
if(0 != executionContext.getTraceListeners())
{
executionContext.fireSelectEvent(
@@ -685,63 +688,202 @@
*selectPattern,
result.get()));
}
+
+ const unsigned int nNodes = sourceNodes->getLength();
+
+ if (nNodes > 0)
+ {
+ doTransformSelectedChildren(
+ executionContext,
+ stylesheetTree,
+ xslInstruction,
+ theTemplate,
+ sourceTree,
+ sourceNodeContext,
+ mode,
+ xslToken,
+ selectStackFrameIndex,
+ keys,
+ *sourceNodes,
+ nNodes);
+ }
}
}
else if (keys.size() > 0)
{
- sourceNodes = sourceNodeContext->getChildNodes();
+ const XalanNodeList* const childNodes =
+ sourceNodeContext->getChildNodes();
+
+ const unsigned int nNodes = childNodes->getLength();
+
+ if (nNodes > 0)
+ {
+ doTransformSelectedChildren(
+ executionContext,
+ stylesheetTree,
+ xslInstruction,
+ theTemplate,
+ sourceTree,
+ sourceNodeContext,
+ mode,
+ xslToken,
+ selectStackFrameIndex,
+ keys,
+ *childNodes,
+ nNodes);
+ }
}
+}
+
- const unsigned int nNodes = sourceNodes.getLength();
- if(nNodes > 0)
+void
+ElemTemplateElement::doTransformSelectedChildren(
+ StylesheetExecutionContext& executionContext,
+ const Stylesheet& stylesheetTree,
+ const ElemTemplateElement& xslInstruction,
+ const ElemTemplateElement* theTemplate,
+ XalanNode* sourceTree,
+ XalanNode* sourceNodeContext,
+ const QName& mode,
+ int xslToken,
+ int selectStackFrameIndex,
+ const NodeSorter::NodeSortKeyVectorType& keys,
+ const NodeRefListBase& sourceNodes,
+ unsigned int sourceNodesCount) const
+{
+ typedef StylesheetExecutionContext::SetAndRestoreCurrentStackFrameIndex SetAndRestoreCurrentStackFrameIndex;
+
+ if (keys.size() > 0)
{
- if (keys.size() > 0)
+ MutableNodeRefList sortedSourceNodes =
+ executionContext.createMutableNodeRefList();
+
+ sortedSourceNodes = sourceNodes;
+
{
- NodeSorter sorter(executionContext);
+ NodeSorter sorter;
SetAndRestoreCurrentStackFrameIndex theSetAndRestore(
- executionContext,
- selectStackFrameIndex);
+ executionContext,
+ selectStackFrameIndex);
- sorter.sort(sourceNodes, keys);
+ sorter.sort(executionContext, sortedSourceNodes, keys);
}
- if(executionContext.getTraceSelects() == true)
- {
- executionContext.traceSelect(
- xslInstruction,
- sourceNodes);
- }
+ doTransformSelectedChildren(
+ executionContext,
+ stylesheetTree,
+ xslInstruction,
+ theTemplate,
+ sourceTree,
+ sourceNodeContext,
+ mode,
+ xslToken,
+ sortedSourceNodes,
+ sourceNodesCount);
+ }
+ else
+ {
+ doTransformSelectedChildren(
+ executionContext,
+ stylesheetTree,
+ xslInstruction,
+ theTemplate,
+ sourceTree,
+ sourceNodeContext,
+ mode,
+ xslToken,
+ sourceNodes,
+ sourceNodesCount);
+ }
+}
+
+
+
+void
+ElemTemplateElement::doTransformSelectedChildren(
+ StylesheetExecutionContext& executionContext,
+ const Stylesheet& stylesheetTree,
+ const ElemTemplateElement& xslInstruction,
+ const ElemTemplateElement* theTemplate,
+ XalanNode* sourceTree,
+ XalanNode* sourceNodeContext,
+ const QName& mode,
+ int xslToken,
+ int selectStackFrameIndex,
+ const NodeSorter::NodeSortKeyVectorType& keys,
+ const XalanNodeList& childNodes,
+ unsigned int childNodeCount) const
+{
+ MutableNodeRefList sourceNodes = executionContext.createMutableNodeRefList();
+
+ sourceNodes = &childNodes;
+
+ doTransformSelectedChildren(
+ executionContext,
+ stylesheetTree,
+ xslInstruction,
+ theTemplate,
+ sourceTree,
+ sourceNodeContext,
+ mode,
+ xslToken,
+ selectStackFrameIndex,
+ keys,
+ sourceNodes,
+ childNodeCount);
+}
- // Create an object to set and restore the context node list...
- StylesheetExecutionContext::ContextNodeListSetAndRestore theSetAndRestore(
+
+
+void
+ElemTemplateElement::doTransformSelectedChildren(
+ StylesheetExecutionContext& executionContext,
+ const Stylesheet& stylesheetTree,
+ const ElemTemplateElement& xslInstruction,
+ const ElemTemplateElement* theTemplate,
+ XalanNode* sourceTree,
+ XalanNode* sourceNodeContext,
+ const QName& mode,
+ int xslToken,
+ const NodeRefListBase& sourceNodes,
+ unsigned int sourceNodesCount) const
+{
+ if(executionContext.getTraceSelects() == true)
+ {
+ executionContext.traceSelect(
+ xslInstruction,
+ sourceNodes);
+ }
+
+ // Create an object to set and restore the context node list...
+ StylesheetExecutionContext::ContextNodeListSetAndRestore theSetAndRestore(
executionContext,
sourceNodes);
- for(unsigned int i = 0; i < nNodes; i++)
- {
- XalanNode* childNode = sourceNodes.item(i);
- assert(childNode != 0);
-
- XalanDocument* const ownerDoc = childNode->getOwnerDocument();
+ for(unsigned int i = 0; i < sourceNodesCount; i++)
+ {
+ XalanNode* const childNode = sourceNodes.item(i);
+ assert(childNode != 0);
- if(XalanNode::DOCUMENT_NODE != childNode->getNodeType() && ownerDoc == 0)
- {
- error(XalanDOMString("Child node does not have an owner document!"));
- }
+ XalanDocument* const ownerDoc = childNode->getOwnerDocument();
- transformChild(
- executionContext,
- stylesheetTree,
- &xslInstruction,
- theTemplate,
- sourceTree,
- sourceNodeContext,
- childNode,
- mode,
- xslToken);
+ if(XalanNode::DOCUMENT_NODE != childNode->getNodeType() && ownerDoc == 0)
+ {
+ error(XalanDOMString("Child node does not have an owner document!"));
}
+
+ transformChild(
+ executionContext,
+ stylesheetTree,
+ &xslInstruction,
+ theTemplate,
+ sourceTree,
+ sourceNodeContext,
+ childNode,
+ mode,
+ xslToken);
}
}
1.13 +82 -2 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.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- ElemTemplateElement.hpp 2000/06/08 17:54:26 1.12
+++ ElemTemplateElement.hpp 2000/07/25 14:49:32 1.13
@@ -81,7 +81,12 @@
+#include <XSLT/NodeSorter.hpp>
+
+
+
class AttributeList;
+class NodeRefListBase;
class QName;
class Stylesheet;
class StylesheetConstructionContext;
@@ -676,8 +681,83 @@
XalanNode* sourceNodeContext,
const QName& mode,
const XPath* selectPattern,
- int xslToken,
- int selectStackFrameIndex) const;
+ int xslToken,
+ int selectStackFrameIndex) const;
+
+ /**
+ * Perform a query if needed, and call transformChild for each child.
+ *
+ * @param stylesheetTree The owning stylesheet tree.
+ * @param xslInstruction The stylesheet element context (deprecated -- I do
+ * not think we need this).
+ * @param template The owning template context.
+ * @param sourceTree The input source tree.
+ * @param sourceNodeContext The current source node context.
+ * @param mode The current mode.
+ * @param selectPattern The XPath with which to perform the selection.
+ * @param xslToken The current XSLT instruction (deprecated -- I do not
+ * think we want this).
+ * @param selectStackFrameIndex stack frame context for executing the
+ * select statement
+ */
+ void
+ doTransformSelectedChildren(
+ StylesheetExecutionContext& executionContext,
+ const Stylesheet& stylesheetTree,
+ const ElemTemplateElement& xslInstruction,
+ const ElemTemplateElement* theTemplate,
+ XalanNode* sourceTree,
+ XalanNode* sourceNodeContext,
+ const QName& mode,
+ int xslToken,
+ int selectStackFrameIndex,
+ const NodeSorter::NodeSortKeyVectorType& keys,
+ const NodeRefListBase& sourceNodes,
+ unsigned int sourceNodesCount) const;
+
+ /**
+ * Perform a query if needed, and call transformChild for each child.
+ *
+ * @param stylesheetTree The owning stylesheet tree.
+ * @param xslInstruction The stylesheet element context (deprecated -- I do
+ * not think we need this).
+ * @param template The owning template context.
+ * @param sourceTree The input source tree.
+ * @param sourceNodeContext The current source node context.
+ * @param mode The current mode.
+ * @param selectPattern The XPath with which to perform the selection.
+ * @param xslToken The current XSLT instruction (deprecated -- I do not
+ * think we want this).
+ * @param selectStackFrameIndex stack frame context for executing the
+ * select statement
+ */
+ void
+ doTransformSelectedChildren(
+ StylesheetExecutionContext& executionContext,
+ const Stylesheet& stylesheetTree,
+ const ElemTemplateElement& xslInstruction,
+ const ElemTemplateElement* theTemplate,
+ XalanNode* sourceTree,
+ XalanNode* sourceNodeContext,
+ const QName& mode,
+ int xslToken,
+ int selectStackFrameIndex,
+ const NodeSorter::NodeSortKeyVectorType& keys,
+ const XalanNodeList& childNodes,
+ unsigned int childNodeCount) const;
+
+ void
+ doTransformSelectedChildren(
+ StylesheetExecutionContext& executionContext,
+ const Stylesheet& stylesheetTree,
+ const ElemTemplateElement& xslInstruction,
+ const ElemTemplateElement* theTemplate,
+ XalanNode* sourceTree,
+ XalanNode* sourceNodeContext,
+ const QName& mode,
+ int xslToken,
+ const NodeRefListBase& sourceNodes,
+ unsigned int sourceNodesCount) const;
/**
* Tell if the result namespace decl should be excluded. Should be called before