private QilNode CompileChoose(XslNode node)
{
IList<XslNode> cases = node.Content;
QilNode result = null;
// It's easier to compile xsl:choose from bottom to top
for (int i = cases.Count - 1; 0 <= i; i--)
{
XslNode when = cases[i];
Debug.Assert(when.NodeType == XslNodeType.If || when.NodeType == XslNodeType.Otherwise);
QilList nsList = EnterScope(when);
if (when.NodeType == XslNodeType.Otherwise)
{
Debug.Assert(result == null, "xsl:otherwise must be the last child of xsl:choose");
result = CompileInstructions(when.Content);
}
else
{
result = CompileWhen(when, /*otherwise:*/result ?? InstructionList());
}
ExitScope();
SetLineInfoCheck(result, when.SourceLine);
result = SetDebugNs(result, nsList);
}
if (result == null)
{
return _f.Sequence();
}
return IsDebug ? _f.Sequence(result) : result;
}