Push and pop xslt-current node only when needed. Also evaluate xsl:with-param only once in an xsl:apply-templates.

b=97405, r=peterv, sr=jst


git-svn-id: svn://10.0.0.236/trunk@102489 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
sicking%bigfoot.com 2001-09-07 00:04:02 +00:00
parent 0d507fb37f
commit c9f433c3dc

View File

@ -921,7 +921,6 @@ void XSLTProcessor::processAction
Element* actionElement = (Element*)xslAction;
ps->pushAction(actionElement);
ps->pushCurrentNode(node);
switch ( getElementType(nodeName, ps) ) {
@ -955,20 +954,27 @@ void XSLTProcessor::processAction
child = child->getNextSibling();
}
// Process xsl:with-param elements
NamedMap* actualParams = processParameters(actionElement, node, ps);
//-- push nodeSet onto context stack
ps->getNodeSetStack()->push(nodeSet);
for (int i = 0; i < nodeSet->size(); i++) {
Element* xslTemplate = ps->findTemplate(nodeSet->get(i), node, mode);
Node* currNode = nodeSet->get(i);
Element* xslTemplate = ps->findTemplate(currNode, node, mode);
if (xslTemplate) {
NamedMap* actualParams = processParameters(actionElement, node, ps);
processTemplate(nodeSet->get(i), xslTemplate, ps, actualParams);
delete actualParams;
ps->pushCurrentNode(currNode);
processTemplate(currNode, xslTemplate, ps, actualParams);
ps->popCurrentNode();
}
else {
processDefaultTemplate(currNode, ps, mode);
}
else
processDefaultTemplate(nodeSet->get(i), ps, mode);
}
//-- remove nodeSet from context stack
ps->getNodeSetStack()->pop();
delete actualParams;
}
else {
notifyError("error processing apply-templates");
@ -1191,7 +1197,10 @@ void XSLTProcessor::processAction
//-- push nodeSet onto context stack
ps->getNodeSetStack()->push(nodeSet);
for (int i = 0; i < nodeSet->size(); i++) {
processChildren(nodeSet->get(i), actionElement, ps);
Node* currNode = nodeSet->get(i);
ps->pushCurrentNode(currNode);
processChildren(currNode, actionElement, ps);
ps->popCurrentNode();
}
//-- remove nodeSet from context stack
ps->getNodeSetStack()->pop();
@ -1453,7 +1462,6 @@ void XSLTProcessor::processAction
break;
} //-- switch
ps->popAction();
ps->popCurrentNode();
} //-- end if (element)
//cout << "XSLTProcessor#processAction [exit]\n";
@ -1653,11 +1661,16 @@ void XSLTProcessor::processDefaultTemplate(Node* node, ProcessorState* ps, Strin
//-- push nodeSet onto context stack
ps->getNodeSetStack()->push(nodeSet);
for (int i = 0; i < nodeSet->size(); i++) {
Element* xslTemplate = ps->findTemplate(nodeSet->get(i), node, mode);
if (xslTemplate)
processTemplate(nodeSet->get(i), xslTemplate, ps, NULL);
else
processDefaultTemplate(nodeSet->get(i), ps, mode);
Node* currNode = nodeSet->get(i);
Element* xslTemplate = ps->findTemplate(currNode, node, mode);
if (xslTemplate) {
ps->pushCurrentNode(currNode);
processTemplate(currNode, xslTemplate, ps, NULL);
ps->popCurrentNode();
}
else {
processDefaultTemplate(currNode, ps, mode);
}
}
//-- remove nodeSet from context stack
ps->getNodeSetStack()->pop();