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
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); } }
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)); }
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); }
internal override Object getValue(IQuery qy) { InvokeFunction(qy.peekElement().Clone()); return(_ResultQuery.getValue(qy)); }
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); } }
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; }
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; }
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; } } }
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; } } }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; } } }
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; }
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); } }
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; }