예제 #1
0
 public override object visit(XPathExpr e)
 {
     if (e.slashes() > 0)
     {
         throw new XPathParserException("Access to root node is not allowed (set by caller)");
     }
     do
     {
         e.expr().accept(this); // check the single step (may have filter with root access)
         e = e.next();          // follow singly linked list of the path, it's all relative past the first one
     } while (e != null);
     return(null);
 }
예제 #2
0
        /// <summary>
        /// Validate an xpath expression.
        /// </summary>
        /// <param name="e">
        ///            is the expression. </param>
        /// <returns> null. </returns>
        public virtual object visit(XPathExpr e)
        {
            XPathExpr xp        = e;
            bool      firstStep = true;

            while (xp != null)
            {
                if (firstStep && xp.slashes() != 0)
                {
                    _rootUsed = true;
                }

                firstStep = false;
                StepExpr se = xp.expr();

                if (se != null)
                {
                    se.accept(this);
                }

                xp = xp.next();
            }
            return(null);
        }
예제 #3
0
        /// <param name="e">
        ///            is the xpath expression. </param>
        /// <returns> result. </returns>
        public virtual object visit(XPathExpr e)
        {
            XPathExpr xp     = e;
            int       depth  = 0;      // indicates how many / we traversed
            XPathExpr result = e;

            while (xp != null)
            {
                int      slashes = xp.slashes();
                StepExpr se      = xp.expr();

                if (slashes == 1)
                {
                    // this is a single slash and nothing else...
                    if (se == null)
                    {
                        return(make_root_self_node());
                    }

                    // /RelativePathExpr
                    if (depth == 0)
                    {
                        XPathExpr xpe = make_root_self_node();
                        xpe.set_next(e);

                        result = xpe;
                    }
                }

                if (slashes == 2)
                {
                    // //RelativePathExpr
                    if (depth == 0)
                    {
                        XPathExpr desc = make_descendant_or_self();
                        desc.set_slashes(1);
                        e.set_slashes(1);
                        desc.set_next(e);

                        XPathExpr root_self = make_root_self_node();
                        root_self.set_next(desc);
                        return(root_self);
                    }
                }

                if (se != null)
                {
                    se.accept(this);
                }

                XPathExpr next = xp.next();

                // peek if the next guy will have 2 slashes...
                if (next != null)
                {
                    // StepExpr//StepExpr
                    if (next.slashes() == 2)
                    {
                        // create the node to stick between the
                        // slashes
                        XPathExpr desc = make_descendant_or_self();
                        desc.set_slashes(1);

                        // current node / desc / next
                        xp.set_next(desc);
                        desc.set_next(next);
                        next.set_slashes(1);
                    }
                }
                xp = next;
                depth++;
            }
            return(result);
        }