public TemplateMatch(Template template, QilLoop filter) { _template = template; _priority = double.IsNaN(template.Priority) ? XPathPatternBuilder.GetPriority(filter) : template.Priority; _iterator = filter.Variable; _condition = filter.Body; XPathPatternBuilder.CleanAnnotation(filter); NipOffTypeNameCheck(); Debug.Assert( _qname == null || _nodeKind == XmlNodeKindFlags.Element || _nodeKind == XmlNodeKindFlags.Attribute || _nodeKind == XmlNodeKindFlags.PI, "qname may be not null only for element, attribute, or PI patterns" ); }
/* * StepPattern ::= ChildOrAttributeAxisSpecifier NodeTest Predicate* * ChildOrAttributeAxisSpecifier ::= @ ? | ('child' | 'attribute') '::' */ private QilNode ParseStepPattern() { QilNode opnd; XPathAxis axis; switch (_scanner.Kind) { case LexKind.Dot: case LexKind.DotDot: throw _scanner.CreateException(SR.XPath_InvalidAxisInPattern); case LexKind.At: axis = XPathAxis.Attribute; _scanner.NextLex(); break; case LexKind.Axis: axis = _scanner.Axis; if (axis != XPathAxis.Child && axis != XPathAxis.Attribute) { throw _scanner.CreateException(SR.XPath_InvalidAxisInPattern); } _scanner.NextLex(); // Skip '::' _scanner.NextLex(); break; case LexKind.Name: case LexKind.Star: // NodeTest must start with Name or '*' axis = XPathAxis.Child; break; default: throw _scanner.CreateException(SR.XPath_UnexpectedToken, _scanner.RawValue); } XPathNodeType nodeType; string nodePrefix, nodeName; XPathParser.InternalParseNodeTest(_scanner, axis, out nodeType, out nodePrefix, out nodeName); opnd = _ptrnBuilder.Axis(axis, nodeType, nodePrefix, nodeName); XPathPatternBuilder xpathPatternBuilder = _ptrnBuilder as XPathPatternBuilder; if (xpathPatternBuilder != null) { //for XPathPatternBuilder, get all predicates and then build them List <QilNode> predicates = new List <QilNode>(); while (_scanner.Kind == LexKind.LBracket) { predicates.Add(ParsePredicate(opnd)); } if (predicates.Count > 0) { opnd = xpathPatternBuilder.BuildPredicates(opnd, predicates); } } else { while (_scanner.Kind == LexKind.LBracket) { opnd = _ptrnBuilder.Predicate(opnd, ParsePredicate(opnd), /*reverseStep:*/ false); } } return(opnd); }
private QilGenerator(bool debug) { _scope = new CompilerScopeManager<QilIterator>(); _outputScope = new OutputScopeManager(); _prefixesInUse = new HybridDictionary(); _f = new XsltQilFactory(new QilFactory(), debug); _xpathBuilder = new XPathBuilder((IXPathEnvironment)this); _xpathParser = new XPathParser<QilNode>(); _ptrnBuilder = new XPathPatternBuilder((IXPathEnvironment)this); _ptrnParser = new XPathPatternParser(); _refReplacer = new ReferenceReplacer(_f.BaseFactory); _invkGen = new InvokeGenerator(_f, debug); _matcherBuilder = new MatcherBuilder(_f, _refReplacer, _invkGen); _singlFocus = new SingletonFocus(_f); _funcFocus = new FunctionFocus(); _curLoop = new LoopFocus(_f); _strConcat = new QilStrConcatenator(_f); _varHelper = new VariableHelper(_f); _elementOrDocumentType = T.DocumentOrElement; _textOrAttributeType = T.NodeChoice(XmlNodeKindFlags.Text | XmlNodeKindFlags.Attribute); _nameCurrent = _f.QName("current", XmlReservedNs.NsXslDebug); _namePosition = _f.QName("position", XmlReservedNs.NsXslDebug); _nameLast = _f.QName("last", XmlReservedNs.NsXslDebug); _nameNamespaces = _f.QName("namespaces", XmlReservedNs.NsXslDebug); _nameInit = _f.QName("init", XmlReservedNs.NsXslDebug); _formatterCnt = 0; }