public QilNode Axis(XPathAxis xpathAxis, XPathNodeType nodeType, string prefix, string name) {
Debug.Assert(
xpathAxis == XPathAxis.Child ||
xpathAxis == XPathAxis.Attribute ||
xpathAxis == XPathAxis.DescendantOrSelf ||
xpathAxis == XPathAxis.Root
);
QilLoop result;
double priority;
switch (xpathAxis) {
case XPathAxis.DescendantOrSelf :
Debug.Assert(nodeType == XPathNodeType.All && prefix == null && name == null, " // is the only d-o-s axes that we can have in pattern");
return f.Nop(this.fixupNode); // We using Nop as a flag that DescendantOrSelf exis was used between steps.
case XPathAxis.Root :
QilIterator i;
result = f.BaseFactory.Filter(i = f.For(fixupNode), f.IsType(i, T.Document));
priority = 0.5;
break;
default :
string nsUri = prefix == null ? null : this.environment.ResolvePrefix(prefix);
result = BuildAxisFilter(f, f.For(fixupNode), xpathAxis, nodeType, name, nsUri);
switch (nodeType) {
case XPathNodeType.Element :
case XPathNodeType.Attribute :
if (name != null) {
priority = 0;
} else {
if (prefix != null) {
priority = -0.25;
} else {
priority = -0.5;
}
}
break;
case XPathNodeType.ProcessingInstruction :
priority = name != null ? 0 : -0.5;
break;
default:
priority = -0.5;
break;
}
break;
}
SetPriority(result, priority);
SetLastParent(result, result);
return result;
}