// handle parameters if any
ParameterSet params = assembleParams(context, actualParams);
ParameterSet tunnels = assembleTunnelParams(context, tunnelParams);
Rule currentRule = context.getCurrentTemplateRule();
if (currentRule==null) {
XPathException e = new XPathException("There is no current template rule");
e.setXPathContext(context);
e.setErrorCode("XTDE0560");
throw e;
}
Mode mode = context.getCurrentMode();
if (mode == null) {
mode = controller.getRuleManager().getUnnamedMode();
}
if (context.getCurrentIterator()==null) {
XPathException e = new XPathException("There is no context item");
e.setXPathContext(context);
e.setErrorCode("XTDE0565");
throw e;
}
Item currentItem = context.getCurrentIterator().current();
if (!(currentItem instanceof NodeInfo)) {
XPathException e = new XPathException("Cannot call xsl:next-match when context item is not a node");
e.setXPathContext(context);
e.setErrorCode("XTDE0565");
throw e;
}
NodeInfo node = (NodeInfo)currentItem;
Rule rule = controller.getRuleManager().getNextMatchHandler(node, mode, currentRule, context);
if (rule==null) { // use the default action for the node
mode.getBuiltInRuleSet().process(node, params, tunnels, context, getSourceLocator());
} else if (useTailRecursion) {
//Template nh = (Template)rule.getAction();
// clear all the local variables: they are no longer needed
Arrays.fill(context.getStackFrame().getStackFrameValues(), null);
return new NextMatchPackage(rule, params, tunnels, context);
} else {
Template nh = rule.getAction();
XPathContextMajor c2 = context.newContext();
c2.openStackFrame(nh.getStackFrameMap());
c2.setLocalParameters(params);
c2.setTunnelParameters(tunnels);
c2.setCurrentTemplateRule(rule);