private QilNode CompileForEach(XslNodeEx node)
{
QilNode result;
IList<XslNode> content = node.Content;
// Push new loop frame on the stack
LoopFocus curLoopSaved = _curLoop;
QilIterator it = _f.For(CompileNodeSetExpression(node.Select));
_curLoop.SetFocus(it);
// Compile sort keys and body
int varScope = _varHelper.StartVariables();
_curLoop.Sort(CompileSorts(content, ref curLoopSaved));
result = CompileInstructions(content);
result = WrapLoopBody(node.ElemNameLi, result, node.EndTagLi);
result = AddCurrentPositionLast(result);
result = _curLoop.ConstructLoop(result);
result = _varHelper.FinishVariables(result, varScope);
// Pop loop frame
_curLoop = curLoopSaved;
return result;
}