/// <summary> /// Declare a variable for use by the XPath expression. If the expression /// refers to any variables, then they must be declared here, unless the /// <c>AllowUndeclaredVariables</c> property has been set to true. /// </summary> /// <param name="name">The name of the variable, as a <c>QName</c></param> public void DeclareVariable(QName name) { if (cache != null) { cache.Clear(); } JXPathVariable var = env.declareVariable(name.ToQNameValue()); //declaredVariables.Add(var); }
/// <summary> /// Compile an expression supplied as a String. /// </summary> /// <example> /// <code> /// XPathExecutable q = compiler.Compile("distinct-values(//*/node-name()"); /// </code> /// </example> /// <param name="source">A string containing the source text of the XPath expression</param> /// <returns>An <c>XPathExecutable</c> which represents the compiled xpath expression object. /// The XPathExecutable may be run as many times as required, in the same or a different /// thread. The <c>XPathExecutable</c> is not affected by any changes made to the <c>XPathCompiler</c> /// once it has been compiled.</returns> /// <exception cref="StaticError"> /// Throws a <c>Saxon.Api.StaticError</c> if there is any static error in the XPath expression. /// This includes both syntax errors, semantic errors such as references to undeclared functions or /// variables, and statically-detected type errors. /// </exception> public XPathExecutable Compile(String source) { if (cache != null) { XPathExecutable exec = (XPathExecutable)cache[source]; if (exec != null) { return(exec); } } try { JIndependentContext ic = env; if (ic.isAllowUndeclaredVariables()) { // self-declaring variables modify the static context. The XPathCompiler must not change state // as the result of compiling an expression, so we need to copy the static context. ic = new JIndependentContext(env); for (JIterator iter = env.iterateExternalVariables(); iter.hasNext();) { JXPathVariable var = (JXPathVariable)iter.next(); JXPathVariable var2 = ic.declareVariable(var.getVariableQName()); } } JXPathEvaluator eval = new JXPathEvaluator(config); eval.setStaticContext(ic); JXPathExpression cexp = eval.createExpression(source); XPathExecutable exec = new XPathExecutable(cexp, config, ic); if (cache != null) { cache[source] = exec; } return(exec); } catch (net.sf.saxon.trans.XPathException err) { throw new StaticError(err); } }
/// <summary> /// Compile an expression supplied as a String. /// </summary> /// <example> /// <code> /// XPathExecutable q = compiler.Compile("distinct-values(//*/node-name()"); /// </code> /// </example> /// <param name="source">A string containing the source text of the XPath expression</param> /// <returns>An <c>XPathExecutable</c> which represents the compiled xpath expression object. /// The XPathExecutable may be run as many times as required, in the same or a different /// thread. The <c>XPathExecutable</c> is not affected by any changes made to the <c>XPathCompiler</c> /// once it has been compiled.</returns> public XPathExecutable Compile(String source) { JIndependentContext ic = env; if (ic.isAllowUndeclaredVariables()) { // self-declaring variables modify the static context. The XPathCompiler must not change state // as the result of compiling an expression, so we need to copy the static context. ic = env.copy(); for (JIterator iter = env.iterateExternalVariables(); iter.hasNext();) { JXPathVariable var = (JXPathVariable)iter.next(); JXPathVariable var2 = ic.declareVariable(var.getVariableQName()); } } JXPathEvaluator eval = new JXPathEvaluator(config); eval.setStaticContext(ic); JXPathExpression cexp = eval.createExpression(source); return(new XPathExecutable(cexp, config, ic)); }
/// <summary> /// Declare a variable for use by the XPath expression. If the expression /// refers to any variables, then they must be declared here. /// </summary> /// <param name="name">The name of the variable, as a <c>QName</c></param> public void DeclareVariable(QName name) { JXPathVariable var = env.declareVariable(name.ToQNameValue()); declaredVariables.Add(var); }