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()); }
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); } }
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; }
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
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)); }
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); } }
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); }
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); } }
internal override XPathNavigator peekElement() { Debug.Assert(_ResultQuery != null && _ResultQuery.ReturnType() == XPathResultType.NodeSet); return(_ResultQuery.peekElement()); }