Наследование: XPathPatternParser.IPatternBuilder
Пример #1
0
        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"
                );
        }
Пример #2
0
        /*
         *   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);
        }
Пример #3
0
        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;
        }