Exemple #1
0
        internal override object getValue(XPathNavigator qyContext, XPathNodeIterator iterator)
        {
            double n1 = 0, n2 = 0;

            //Debug.Assert(_opnd1 != null);
            //Debug.Assert((_opnd2 != null) || (OperandValue::NEGATE == _op));

            n1 = XmlConvert.ToXPathDouble(_opnd1.getValue(qyContext, iterator));
            if (_op != Operator.Op.NEGATE)
            {
                n2 = XmlConvert.ToXPathDouble(_opnd2.getValue(qyContext, iterator));
            }
            switch (_op)
            {
            case Operator.Op.PLUS: return(n1 + n2);

            case Operator.Op.MINUS: return(n1 - n2);

            case Operator.Op.MOD: return(n1 % n2);

            case Operator.Op.DIV: return(n1 / n2);

            case Operator.Op.MUL: return(n1 * n2);

            case Operator.Op.NEGATE: return(-n1);
            }
            return(null);
        }
        } // Advance

        internal override Object getValue(IQuery qy)
        {
            if (_VarQuery != null)
            {
                return(_VarQuery.getValue(qy));
            }
            throw new XPathException(Res.Xp_UndefinedXsltContext, Prefix, Name);
        }
 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 #4
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 #5
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);
            }
        }
        /// <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 #7
0
        internal bool matches(IQuery e, XPathNavigator context)
        {
            if (_opnd == null)
            {
                return(false);
            }
            XPathResultType resultType = _opnd.ReturnType();

            if (resultType == XPathResultType.Number)
            {
                double i = XmlConvert.ToXPathDouble(_opnd.getValue(e));
                return(i == e.Position);
            }
            if (resultType == XPathResultType.NodeSet)
            {
                _opnd.setContext(context);
                if (_opnd.advance() != null)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            if (resultType == XPathResultType.Boolean)
            {
                return(Convert.ToBoolean(_opnd.getValue(e)));
            }
            if (resultType == XPathResultType.String)
            {
                if (_opnd.getValue(context, null).ToString().Length > 0)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            return(false);
        }
Exemple #8
0
 internal override Object getValue(IQuery qy)
 {
     InvokeFunction(qy.peekElement().Clone());
     return(_ResultQuery.getValue(qy));
 }
Exemple #9
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 #10
0
        static bool compareNumberBool1(IQuery opnd1, IQuery opnd2, IQuery qyContext, Operator.Op op) {
            Boolean n1 = BooleanFunctions.toBoolean(XmlConvert.ToXPathDouble(opnd1.getValue(qyContext)));
            Boolean n2 = Convert.ToBoolean(opnd2.getValue(qyContext));  
            switch (op) {
                

                case Operator.Op.EQ : return( n1 == n2 ) ;
                case Operator.Op.NE : return( n1 != n2 ) ;
            } 
            return false;
        }
Exemple #11
0
      static bool compareNumberNumber(IQuery opnd1, IQuery opnd2, XPathNavigator qyContext, Operator.Op op, XPathNodeIterator iterator) {

            double n1 = XmlConvert.ToXPathDouble(opnd1.getValue(qyContext, iterator));
            double n2 = XmlConvert.ToXPathDouble(opnd2.getValue(qyContext, iterator));  
            switch (op) {
                
                case Operator.Op.LT : return( n1 <  n2 ) ;
                case Operator.Op.GT : return( n1 >  n2 ) ;
                case Operator.Op.LE : return( n1 <= n2 ) ;
                case Operator.Op.GE : return( n1 >= n2 ) ;
                case Operator.Op.EQ : return( n1 == n2 ) ;
                case Operator.Op.NE : return( n1 != n2 ) ;
            }
            return false;
        }
Exemple #12
0
      static bool compareStringQuery2(IQuery opnd1, IQuery opnd2, XPathNavigator qyContext, Operator.Op op, XPathNodeIterator iterator) {
            XPathNavigator val1;
            opnd2.setContext(qyContext.Clone()); 
            double n2, n1 = NumberFunctions.Number(XmlConvert.ToXPathString(opnd1.getValue(qyContext, iterator)));

            while (true) {
                val1 = opnd2.advance();
                if (val1 != null)
                    n2 = NumberFunctions.Number(val1.Value);
                else
                    return false;

                switch (op) {
                    
                    case Operator.Op.LT :if (n1 <  n2) return true ;
                        break;
                    case Operator.Op.GT :if (n1 >  n2) return true ;
                        break;
                    case Operator.Op.LE :if (n1 <= n2) return true ;
                        break;
                    case Operator.Op.GE :if (n1 >= n2) return true ;
                        break;
                    case Operator.Op.EQ :if (n1 == n2) return true ;
                        break;
                    case Operator.Op.NE :if (n1 != n2) return true ;
                        break;

                }

            }
        }
Exemple #13
0
       static bool compareQueryString2(IQuery opnd1, IQuery opnd2, IQuery qyContext, Operator.Op op) {

            XPathNavigator val1;
            opnd1.setContext(qyContext.peekElement().Clone()); 
            double n1, n2 = NumberFunctions.Number(XmlConvert.ToXPathString(opnd2.getValue(qyContext)));

            while (true) {
                val1 = opnd1.advance();
                if (val1 != null)
                    n1 = NumberFunctions.Number(val1.Value);
                else
                    return false;

                switch (op) {
                    
                    case Operator.Op.LT :if (n1 <  n2) return true;
                        break;
                    case Operator.Op.GT :if (n1 >  n2) return true;
                        break;
                    case Operator.Op.LE :if (n1 <= n2) return true;
                        break;
                    case Operator.Op.GE :if (n1 >= n2)  return true;
                        break;
                    case Operator.Op.EQ :if (n1 == n2) return true;
                        break;
                    case Operator.Op.NE :if (n1 != n2) return true;
                        break;
                }
            }
        }
Exemple #14
0
        static bool compareBoolQuery2(IQuery opnd1, IQuery opnd2, XPathNavigator qyContext, Operator.Op op, XPathNodeIterator iterator) {
            XPathNavigator val1;
            opnd2.setContext(qyContext.Clone()); 
            double n2, n1 = NumberFunctions.Number(Convert.ToBoolean(opnd1.getValue(qyContext, iterator)));

                val1 = opnd2.advance();
                if (val1 != null)
                    n2 = 1.0;
                else {
                    n2 = 0;
                    switch (op) {                    
                        case Operator.Op.LT : return (n1 <  n2) ;
                        case Operator.Op.GT : return (n1 >  n2) ;
                        case Operator.Op.LE : return (n1 <= n2) ;
                        case Operator.Op.GE : return (n1 >= n2) ;

                    }
                }

                switch (op) {
                    
                    case Operator.Op.LT : return (n1 <  n2)  ;
                    case Operator.Op.GT : return (n1 >  n2)  ;
                    case Operator.Op.LE : return (n1 <= n2) ;
                    case Operator.Op.GE : return (n1 >= n2)   ;
                }
                return false;

        }
Exemple #15
0
        static bool compareBoolBool1(IQuery opnd1, IQuery opnd2, IQuery qyContext, Operator.Op op) {
            Boolean n1 = Convert.ToBoolean(opnd1.getValue(qyContext));
            Boolean n2 = Convert.ToBoolean(opnd2.getValue(qyContext));
            switch (op) {
                
                case Operator.Op.EQ : return( n1 == n2 ) ;
                case Operator.Op.NE : return( n1 != n2 ) ;
            } 
            return false;

        }
Exemple #16
0
      static bool compareBoolQuery1(IQuery opnd1, IQuery opnd2, XPathNavigator qyContext, Operator.Op op, XPathNodeIterator iterator) {
            XPathNavigator val1;
            opnd2.setContext(qyContext.Clone()); 
            Boolean n2 = false, n1 = Convert.ToBoolean(opnd1.getValue(qyContext, iterator));

                val1 = opnd2.advance();
                if (val1 != null)
                    n2 = true;
                else {
                    if (op ==  Operator.Op.EQ ) {
                        return (n2 == n1);
                    }
                    return (n2 != n1);
                }

                switch (op) {
                    
                    case Operator.Op.EQ : return (n1 == n2) ;
                    case Operator.Op.NE : return (n1 != n2) ;
                }
                return false;

        }
Exemple #17
0
        static bool compareQueryBool2(IQuery opnd1, IQuery opnd2, IQuery qyContext, Operator.Op op) {
            XPathNavigator val1;
            opnd1.setContext(qyContext.peekElement().Clone()); 
            double n1, n2 = NumberFunctions.Number(Convert.ToBoolean(opnd2.getValue(qyContext)));

                val1 = opnd1.advance();
                if (val1 != null)
                    n1 = 1.0;
                else {
                    n1 = 0;
                    switch (op) {                    
                        case Operator.Op.LT : return (n1 <  n2) ;
                        case Operator.Op.GT : return (n1 >  n2) ;
                        case Operator.Op.LE : return (n1 <= n2) ;
                        case Operator.Op.GE : return (n1 >= n2) ;

                    }
                }

                switch (op) {
                    
                    case Operator.Op.LT : return (n1 <  n2) ;
                    case Operator.Op.GT : return (n1 >  n2) ;
                    case Operator.Op.LE : return (n1 <= n2) ;
                    case Operator.Op.GE : return (n1 >= n2) ;

                }
                return false;

        }
Exemple #18
0
        static bool compareQueryBool1(IQuery opnd1, IQuery opnd2, IQuery qyContext, Operator.Op op) {
            XPathNavigator val1;
            opnd1.setContext(qyContext.peekElement().Clone()); 
            Boolean n1 = false, n2 = Convert.ToBoolean(opnd2.getValue(qyContext));

                val1 = opnd1.advance();
                if (val1 != null) {
                    n1 = true;
                }
                else {
                    if (op ==  Operator.Op.EQ ) {
                        return (n2 == n1);
                    }
                    return (n2 != n1);
                }

                switch (op) {
                    
                    case Operator.Op.EQ : return (n1 == n2)  ;
                    case Operator.Op.NE : return (n1 != n2) ;
                }
                return false;

        }
Exemple #19
0
 static bool compareQueryString1(IQuery opnd1, IQuery opnd2, XPathNavigator qyContext, Operator.Op op, XPathNodeIterator iterator) {
     XPathNavigator val1;
     opnd1.setContext(qyContext.Clone()); 
     String n2 = XmlConvert.ToXPathString(opnd2.getValue(qyContext, iterator));
     while ((val1 = opnd1.advance()) != null) {
         if (op == Operator.Op.EQ) {
             if (val1.Value == n2) return true;
         }
         else if (val1.Value != n2) return true;
     }
     return false;
 }
Exemple #20
0
       static bool compareStringString1(IQuery opnd1, IQuery opnd2, XPathNavigator qyContext, Operator.Op op, XPathNodeIterator iterator) {
            String n1 = XmlConvert.ToXPathString(opnd1.getValue(qyContext, iterator));
            String n2 = XmlConvert.ToXPathString(opnd2.getValue(qyContext, iterator));  
            switch (op) {
                
                case Operator.Op.EQ : return( n1 == n2 ) ;
                case Operator.Op.NE : return( n1 != n2 ) ;
            }
            return false;

        } 
Exemple #21
0
 static bool compareBoolNumber2(IQuery opnd1, IQuery opnd2, IQuery qyContext, Operator.Op op) {
     double n1 = NumberFunctions.Number(Convert.ToBoolean(opnd1.getValue(qyContext)));
     double n2 = XmlConvert.ToXPathDouble(opnd2.getValue(qyContext));  
     switch (op) {
         
         case Operator.Op.LT : return( n1 <  n2 ) ;
         case Operator.Op.GT : return( n1 >  n2 ) ;
         case Operator.Op.LE : return( n1 <= n2 ) ;
         case Operator.Op.GE : return( n1 >= n2 ) ;
     }
     return false;
 }
Exemple #22
0
        static bool compareStringQuery1(IQuery opnd1, IQuery opnd2, XPathNavigator qyContext, Operator.Op op , XPathNodeIterator iterator) {
            XPathNavigator val1;
            opnd2.setContext(qyContext.Clone()); 
            String n2, n1 = XmlConvert.ToXPathString(opnd1.getValue(qyContext, iterator));

            while (true) {
                val1 = opnd2.advance();
                if (val1 != null)
                    n2 = val1.Value;
                else
                    return false;

                switch (op) {
                    
                    case Operator.Op.EQ : if (n1 == n2) return true ;
                        break;
                    case Operator.Op.NE : if (n1 != n2) return true ;
                        break;
                }

            }
        }
Exemple #23
0
       static bool compareBoolString1(IQuery opnd1, IQuery opnd2, XPathNavigator qyContext, Operator.Op op, XPathNodeIterator iterator) {
            Boolean n1 = Convert.ToBoolean(opnd1.getValue(qyContext, iterator));
            Boolean n2 = BooleanFunctions.toBoolean(XmlConvert.ToXPathString(opnd2.getValue(qyContext, iterator)));  
            switch (op) {
                
                case Operator.Op.EQ : return( n1 == n2 );
                case Operator.Op.NE : return( n1 != n2 );
            } 
            return false;

        }
Exemple #24
0
 static bool compareBoolString2(IQuery opnd1, IQuery opnd2, XPathNavigator qyContext, Operator.Op op, XPathNodeIterator iterator) {
      double n1 = NumberFunctions.Number(Convert.ToBoolean(opnd1.getValue(qyContext, iterator)));
      double n2 = NumberFunctions.Number(XmlConvert.ToXPathString(opnd2.getValue(qyContext, iterator)));
      switch (op) {
          
          case Operator.Op.LT : return( n1 <  n2 ) ;
          case Operator.Op.GT : return( n1 >  n2 ) ;
          case Operator.Op.LE : return( n1 <= n2 ) ;
          case Operator.Op.GE : return( n1 >= n2 ) ;
      } 
      return false;
  }      
 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 #26
0
 static bool compareNumberString(IQuery opnd1, IQuery opnd2, IQuery qyContext, Operator.Op op) {
     double n1 = XmlConvert.ToXPathDouble(opnd1.getValue(qyContext));
     double n2 = NumberFunctions.Number(XmlConvert.ToXPathString(opnd2.getValue(qyContext)));  
     switch (op) {
         
         case Operator.Op.LT : return( n1 <  n2 ) ;
         case Operator.Op.GT : return( n1 >  n2 ) ;
         case Operator.Op.LE : return( n1 <= n2 ) ;
         case Operator.Op.GE : return( n1 >= n2 ) ;
         case Operator.Op.EQ : return( n1 == n2 ) ;
         case Operator.Op.NE : return( n1 != n2 ) ;
     }
     return false;
 }