public void AddSort(IQuery evalQuery, IComparer comparer)
        {
            Debug.Assert(this.expressions.Length == this.comparers.Length);
            Debug.Assert(0 < this.expressions.Length);
            Debug.Assert(0 <= numSorts && numSorts <= this.expressions.Length);
            // Ajust array sizes if needed.
            if (numSorts == this.expressions.Length)
            {
                IQuery[]    newExpressions = new IQuery[numSorts * 2];
                IComparer[] newComparers   = new IComparer[numSorts * 2];
                for (int i = 0; i < numSorts; i++)
                {
                    newExpressions[i] = this.expressions[i];
                    newComparers  [i] = this.comparers[i];
                }
                this.expressions = newExpressions;
                this.comparers   = newComparers;
            }
            Debug.Assert(numSorts < this.expressions.Length);

            // Fixup expression to handle node-set resurn type:
            XPathResultType queryType = evalQuery.ReturnType();

            if (queryType == XPathResultType.NodeSet || queryType == XPathResultType.Error || queryType == XPathResultType.Any)
            {
                ArrayList argList = new ArrayList();
                argList.Add(evalQuery);
                evalQuery = new StringFunctions(argList, FT.FuncString);
            }

            this.expressions[numSorts] = evalQuery;
            this.comparers[numSorts]   = comparer;
            numSorts++;
        }
 internal override XPathResultType  ReturnType()
 {
     if (_VarQuery != null)
     {
         return(_VarQuery.ReturnType());
     }
     throw new XPathException(Res.Xp_UndefinedXsltContext, Prefix, Name);
 }
 public XPathSelectionIterator(XPathNavigator nav, string xpath) {
     this.nav = nav;
     query = new QueryBuilder().Build( xpath, /*allowVar:*/true, /*allowKey:*/true );
     if (query.ReturnType() != XPathResultType.NodeSet) {
         throw new XPathException(Res.Xp_NodeSetExpected);
     }
     query.setContext(nav.Clone());
 }
 public XPathSelectionIterator(XPathNavigator nav, XPathExpression expr) {
     this.nav = nav.Clone();
     query = ((CompiledXpathExpr) expr).QueryTree;
     if (query.ReturnType() != XPathResultType.NodeSet) {
         throw new XPathException(Res.Xp_NodeSetExpected);
     }
     query.setContext(nav.Clone());
 }
 public XPathSelectionIterator(XPathNavigator nav, string xpath)
 {
     this.nav = nav;
     query    = new QueryBuilder().Build(xpath, /*allowVar:*/ true, /*allowKey:*/ true);
     if (query.ReturnType() != XPathResultType.NodeSet)
     {
         throw new XPathException(Res.Xp_NodeSetExpected);
     }
     query.setContext(nav.Clone());
 }
 public XPathSelectionIterator(XPathNavigator nav, XPathExpression expr)
 {
     this.nav = nav.Clone();
     query    = ((CompiledXpathExpr)expr).QueryTree;
     if (query.ReturnType() != XPathResultType.NodeSet)
     {
         throw new XPathException(Res.Xp_NodeSetExpected);
     }
     query.setContext(nav.Clone());
 }
Exemple #7
0
        private String toString(XPathNavigator qyContext, XPathNodeIterator iterator)
        {
            if (_ArgList != null && _ArgList.Count > 0)
            {
                IQuery _qy = (IQuery)_ArgList[0];

                if (_qy.ReturnType() == XPathResultType.NodeSet)
                {
                    _qy.setContext(qyContext.Clone());

                    XPathNavigator value = _qy.advance();

                    if (value != null)
                    {
                        return(value.Value);
                    }
                    else
                    {
                        return(String.Empty);
                    }
                }
                else if (_qy.ReturnType() == XPathResultType.String)
                {
                    return(_qy.getValue(qyContext, iterator).ToString());
                }
                else if (_qy.ReturnType() == XPathResultType.Boolean)
                {
                    return(Convert.ToBoolean(_qy.getValue(qyContext, iterator)) ? "true" : "false");
                }
                else
                {
                    return(toString(XmlConvert.ToXPathDouble(_qy.getValue(qyContext, iterator))));
                }
            }
            else if (qyContext != null)
            {
                return(qyContext.Value);
            }
            else
            {
                return(String.Empty);
            }
        }
Exemple #8
0
        private String toString(IQuery qyContext)
        {
            XPathNavigator value = null;

            if (_ArgList != null && _ArgList.Count > 0)
            {
                IQuery _qy = (IQuery)_ArgList[0];

                if (_qy.ReturnType() == XPathResultType.NodeSet)
                {
                    _qy.setContext(qyContext.peekElement().Clone());

                    value = _qy.advance();
                    if (value != null)
                    {
                        return(value.Value);
                    }
                    else
                    {
                        return(String.Empty);
                    }
                }
                else if (_qy.ReturnType() == XPathResultType.String)
                {
                    return(_qy.getValue(qyContext).ToString());
                }
                else if (_qy.ReturnType() == XPathResultType.Boolean)
                {
                    return(toString(Convert.ToBoolean(_qy.getValue(qyContext))));
                }
                return(toString(XmlConvert.ToXPathDouble(_qy.getValue(qyContext))));
            }
            else
            if ((value = qyContext.peekElement()) != null)
            {
                return(value.Value);
            }
            else
            {
                return(String.Empty);
            }
        }
Exemple #9
0
 internal NumericExpr(Operator.Op op, IQuery  opnd1, IQuery  opnd2) {
     if ( opnd1 is VariableQuery || opnd1 is XsltFunction  || opnd1.ReturnType() != XPathResultType.Number)
         _opnd1= new NumberFunctions(opnd1);
     else
         _opnd1 = opnd1;
     if (opnd2 != null && (opnd2 is VariableQuery || opnd2 is XsltFunction ||   opnd2.ReturnType() != XPathResultType.Number))
         _opnd2= new NumberFunctions(opnd2);
     else
         _opnd2 = opnd2;
     _op= op;
 }
Exemple #10
0
        internal void AddSort(IQuery evalQuery, IComparer comparer)
        {
            if (evalQuery.ReturnType() == XPathResultType.NodeSet)
            {
                ArrayList argList = new ArrayList();
                argList.Add(evalQuery);
                _sortExpressions.Add(new StringFunctions(argList, FT.FuncString));
            }
            else
            {
                _sortExpressions.Add(evalQuery);
            }

            _comparers.Add(comparer);
        }
 internal Boolean toBoolean(XPathNavigator qyContext, XPathNodeIterator iterator)
 {
     if (_qy.ReturnType() == XPathResultType.NodeSet)
     {
         _qy.setContext(qyContext.Clone());
         XPathNavigator value = _qy.advance();
         if (value != null)
         {
             return(true);
         }
         else
         {
             return(false);
         }
     }
     else if (_qy.ReturnType() == XPathResultType.String)
     {
         object result = _qy.getValue(qyContext, iterator);
         if (result.ToString().Length > 0)
         {
             return(true);
         }
         else
         {
             if (result is string)
             {
                 return(false);
             }
             else
             {
                 Debug.Assert(result is XPathNavigator);
                 return(true);              // RTF can't be empty ?
             }
         }
     }
     else if (_qy.ReturnType() == XPathResultType.Boolean)
     {
         return(Convert.ToBoolean(_qy.getValue(qyContext, iterator)));
     }
     else if (_qy.ReturnType() == XPathResultType.Number)
     {
         return(toBoolean(XmlConvert.ToXPathDouble(_qy.getValue(qyContext, iterator))));
     }
     return(false);
 } // toBoolean
Exemple #12
0
 internal override void SetXsltContext(XsltContext input)
 {
     m_qyInput.SetXsltContext(input);
     _opnd.SetXsltContext(input);
     if (_opnd.ReturnType() != XPathResultType.Number)
     {
         ReversePositionQuery query = m_qyInput as ReversePositionQuery;
         if (query != null)
         {
             m_qyInput = query.m_qyInput;
         }
     }
 }
        /// <include file='doc\XPathNavigator.uex' path='docs/doc[@for="XPathNavigator.Evaluate1"]/*' />
        public virtual object Evaluate(XPathExpression expr, XPathNodeIterator context)
        {
            CompiledXpathExpr cexpr = expr as CompiledXpathExpr;

            if (cexpr == null)
            {
                throw new XPathException(Res.Xp_BadQueryObject);
            }
            IQuery query = cexpr.QueryTree;

            query.reset();

            XPathNavigator current = (context != null) ? context.Current : this;

            if (query.ReturnType() == XPathResultType.NodeSet)
            {
                return(new XPathSelectionIterator(current, expr));
            }
            return(query.getValue(current, context));
        }
Exemple #14
0
 internal NumericExpr(Operator.Op op, IQuery opnd1, IQuery opnd2)
 {
     if (opnd1 is VariableQuery || opnd1 is XsltFunction || opnd1.ReturnType() != XPathResultType.Number)
     {
         _opnd1 = new NumberFunctions(opnd1);
     }
     else
     {
         _opnd1 = opnd1;
     }
     if (opnd2 != null && (opnd2 is VariableQuery || opnd2 is XsltFunction || opnd2.ReturnType() != XPathResultType.Number))
     {
         _opnd2 = new NumberFunctions(opnd2);
     }
     else
     {
         _opnd2 = opnd2;
     }
     _op = op;
 }
        /// <include file='doc\XPathNavigator.uex' path='docs/doc[@for="XPathNavigator.Matches"]/*' />
        public virtual bool Matches(XPathExpression expr)
        {
            CompiledXpathExpr cexpr = expr as CompiledXpathExpr;

            if (cexpr == null)
            {
                throw new XPathException(Res.Xp_BadQueryObject);
            }

            IQuery query = cexpr.QueryTree;

            if (query.ReturnType() != XPathResultType.NodeSet)
            {
                throw new XPathException(Res.Xp_NodeSetExpected);
            }

            try {
                return(query.MatchNode(this) != null);
            }
            catch (XPathException) {
                throw new XPathException(Res.Xp_InvalidPattern, cexpr.Expression);
            }
        }
 private double Number(XPathNavigator qyContext, XPathNodeIterator iterator)
 {
     if (_qy != null)
     {
         if (_qy.ReturnType() == XPathResultType.NodeSet)
         {
             _qy.setContext(qyContext.Clone());
             XPathNavigator value = _qy.advance();
             if (value != null)
             {
                 return(Number(value.Value));
             }
             else
             {
                 return(double.NaN);
             }
         }
         else
         if (_qy.ReturnType() == XPathResultType.String)
         {
             return(Number(_qy.getValue(qyContext, iterator).ToString()));
         }
         else
         if (_qy.ReturnType() == XPathResultType.Boolean)
         {
             return(Number(Convert.ToBoolean(_qy.getValue(qyContext, iterator))));
         }
         else
         {
             return(XmlConvert.ToXPathDouble(_qy.getValue(qyContext, iterator)));
         }
     }
     else
     if (qyContext != null)
     {
         return(XmlConvert.ToXPathDouble(qyContext.Value));
     }
     else
     {
         return(double.NaN);
     }
 }
Exemple #17
0
        internal void AddSort(IQuery evalQuery, IComparer comparer) {
            if (evalQuery.ReturnType() == XPathResultType.NodeSet) {
                ArrayList argList = new ArrayList();
                argList.Add(evalQuery);
                _sortExpressions.Add(new StringFunctions(argList, FT.FuncString));
            }
            else
                _sortExpressions.Add(evalQuery);

            _comparers.Add(comparer);
        }
Exemple #18
0
        private void InvokeFunction(XPathNavigator qy)
        {
            IXsltContextFunction function = this.Function;

            // calculate arguments:
            Debug.Assert(_ArgArray != null && _ArgArray.Length == _ArgList.Count);
            for (int i = _ArgList.Count - 1; 0 <= i; i--)
            {
                IQuery arg = (IQuery)_ArgList[i];
                if (arg.ReturnType() == XPathResultType.NodeSet)
                {
                    _ArgArray[i] = new XPathQueryIterator(arg, qy.Clone());
                }
                else
                {
                    _ArgArray[i] = arg.getValue(qy, null);
                }
            }

            try {
                object result = function.Invoke(_XsltContext, _ArgArray, qy);

                if (result == null)
                {
                    _ResultQuery = new OperandQuery(String.Empty, XPathResultType.String);
                }
                else
                {
                    XPathResultType returnedType = function.ReturnType;
                    if (returnedType == XPathResultType.Any)
                    {
                        // If function is untyped get returned type from real result
                        returnedType = XsltCompileContext.GetXPathType(result.GetType());
                    }
                    switch (returnedType)
                    {
                    case XPathResultType.String:
                        // trick. As soon XPathResultType.Navigator will be distinct type rid of from it.
                        //_ResultQuery = new OperandQuery( result, XPathResultType.String );
                        if (result is XPathNavigator)
                        {
                            _ResultQuery = new NavigatorQuery((XPathNavigator)result);
                        }
                        else
                        {
                            _ResultQuery = new OperandQuery(result, XPathResultType.String);
                        }
                        break;

                    case XPathResultType.Boolean:
                        _ResultQuery = new OperandQuery(result, XPathResultType.Boolean);
                        break;

                    case XPathResultType.Number:
                        _ResultQuery = new OperandQuery(XmlConvert.ToXPathDouble(result), XPathResultType.Number);
                        break;

                    case XPathResultType.NodeSet:
                        if (result is ResetableIterator)
                        {
                            _ResultQuery = new XmlIteratorQuery((ResetableIterator)result);
                        }
                        else
                        {
                            Debug.Assert(false, "Unexpected type of XPathNodeIterator");
                            throw new NotSupportedException(Res.GetString(Res.XmlUnsupportedType, result.GetType().FullName));
                        }
                        break;

//                  case XPathResultType.Navigator :
//                      _ResultQuery = new NavigatorQuery((XPathNavigator)result);
//                      break;
                    default:
                        _ResultQuery = new OperandQuery(result.ToString(), XPathResultType.String);
                        break;
                    }
                }
            }
            catch (Exception ex) {
                string qname = _Prefix != string.Empty ? _Prefix + ":" + _Name : _Name;
                throw new XsltException(Res.Xslt_FunctionFailed, new string[] { qname }, ex);
            }
        }
Exemple #19
0
 internal override XPathNavigator peekElement()
 {
     Debug.Assert(_ResultQuery != null && _ResultQuery.ReturnType() == XPathResultType.NodeSet);
     return(_ResultQuery.peekElement());
 }