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:
parent
0d507fb37f
commit
c9f433c3dc
@ -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();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user