private void CompileSort(Sort sort, QilList keyList, ref LoopFocus parentLoop)
{
Debug.Assert(sort.NodeType == XslNodeType.Sort);
QilNode select, select2, lang, order, caseOrder;
bool fwdCompat;
EnterScope(sort);
fwdCompat = sort.ForwardsCompatible;
select = CompileXPathExpression(sort.Select);
if (sort.Lang != null || sort.DataType != null || sort.Order != null || sort.CaseOrder != null)
{
// Calculate these attributes in the context of the parent loop
LoopFocus curLoopSaved = _curLoop;
_curLoop = parentLoop;
lang = CompileLangAttribute(sort.Lang, fwdCompat);
CompileDataTypeAttribute(sort.DataType, fwdCompat, ref select, out select2);
order = CompileOrderAttribute(
/*attName: */ "order",
/*attValue: */ sort.Order,
/*value0: */ "ascending",
/*value1: */ "descending",
/*fwdCompat:*/ fwdCompat
);
caseOrder = CompileOrderAttribute(
/*attName: */ "case-order",
/*attValue: */ sort.CaseOrder,
/*value0: */ "lower-first",
/*value1: */ "upper-first",
/*fwdCompat:*/ fwdCompat
);
// Restore loop context
_curLoop = curLoopSaved;
}
else
{
select = _f.ConvertToString(select);
select2 = lang = order = caseOrder = null;
}
_strConcat.Reset();
_strConcat.Append(XmlReservedNs.NsCollationBase);
_strConcat.Append('/');
_strConcat.Append(lang);
char separator = '?';
if (order != null)
{
_strConcat.Append(separator);
_strConcat.Append("descendingOrder=");
_strConcat.Append(order);
separator = '&';
}
if (caseOrder != null)
{
_strConcat.Append(separator);
_strConcat.Append("upperFirst=");
_strConcat.Append(caseOrder);
separator = '&';
}
QilNode collation = _strConcat.ToQil();
QilSortKey result = _f.SortKey(select, collation);
// Line information is not copied
keyList.Add(result);
if (select2 != null)
{
result = _f.SortKey(select2, collation.DeepClone(_f.BaseFactory));
// Line information is not copied
keyList.Add(result);
}
ExitScope();
}