private XslNode XslChoose()
{
ContextInfo ctxInfo = _input.GetAttributes();
List<XslNode> content = new List<XslNode>();
bool otherwise = false;
bool when = false;
QName parentName = _input.ElementName;
if (_input.MoveToFirstChild())
{
do
{
switch (_input.NodeType)
{
case XmlNodeType.Element:
XslNode node = null;
if (Ref.Equal(_input.NamespaceUri, _atoms.UriXsl))
{
if (Ref.Equal(_input.LocalName, _atoms.When))
{
if (otherwise)
{
ReportError(/*[XT_018]*/SR.Xslt_WhenAfterOtherwise);
_input.SkipNode();
continue;
}
else
{
when = true;
node = XslIf();
}
}
else if (Ref.Equal(_input.LocalName, _atoms.Otherwise))
{
if (otherwise)
{
ReportError(/*[XT_019]*/SR.Xslt_DupOtherwise);
_input.SkipNode();
continue;
}
else
{
otherwise = true;
node = XslOtherwise();
}
}
}
if (node == null)
{
ReportError(/*[XT_020]*/SR.Xslt_UnexpectedElement, _input.QualifiedName, parentName);
_input.SkipNode();
continue;
}
AddInstruction(content, node);
break;
case XmlNodeType.Whitespace:
case XmlNodeType.SignificantWhitespace:
break;
default:
Debug.Assert(_input.NodeType == XmlNodeType.Text);
ReportError(/*[XT_020]*/SR.Xslt_TextNodesNotAllowed, parentName);
break;
}
} while (_input.MoveToNextSibling());
}
CheckError(!when, /*[XT_021]*/SR.Xslt_NoWhen);
return SetInfo(f.Choose(), content, ctxInfo);
}