private void CompileDataTypeAttribute(string attValue, bool fwdCompat, ref QilNode select, out QilNode select2)
{
const string DtText = "text";
const string DtNumber = "number";
QilNode result = CompileStringAvt(attValue);
if (result != null)
{
if (result.NodeType == QilNodeType.LiteralString)
{
string dataType = (string)(QilLiteral)result;
if (dataType == DtNumber)
{
select = _f.ConvertToNumber(select);
select2 = null;
return;
}
else if (dataType == DtText)
{
// fall through to default case
}
else
{
if (!fwdCompat)
{
// check for qname-but-not-ncname
string prefix, local, nsUri;
bool isValid = _compiler.ParseQName(dataType, out prefix, out local, (IErrorHelper)this);
nsUri = isValid ? ResolvePrefix(/*ignoreDefaultNs:*/true, prefix) : _compiler.CreatePhantomNamespace();
if (nsUri.Length == 0)
{
// this is a ncname; we might report SR.Xslt_InvalidAttrValue,
// but the following error message is more user friendly
}
ReportError(/*[XT_034]*/SR.Xslt_BistateAttribute, "data-type", DtText, DtNumber);
}
// fall through to default case
}
}
else
{
// Precalculate its value outside of for-each loop
QilIterator dt, qname;
result = _f.Loop(dt = _f.Let(result),
_f.Conditional(_f.Eq(dt, _f.String(DtNumber)), _f.False(),
_f.Conditional(_f.Eq(dt, _f.String(DtText)), _f.True(),
fwdCompat ? _f.True() :
_f.Loop(qname = _f.Let(ResolveQNameDynamic(/*ignoreDefaultNs:*/true, dt)),
_f.Error(_lastScope.SourceLine,
SR.Xslt_BistateAttribute, "data-type", DtText, DtNumber
)
)
)));
QilIterator text = _f.Let(result);
_varHelper.AddVariable(text);
// Make two sort keys since heterogenous sort keys are not allowed
select2 = select.DeepClone(_f.BaseFactory);
select = _f.Conditional(text, _f.ConvertToString(select), _f.String(string.Empty));
select2 = _f.Conditional(text, _f.Double(0), _f.ConvertToNumber(select2));
return;
}
}
// Default case
select = _f.ConvertToString(select);
select2 = null;
}