📄 xquery.java
字号:
Consumer save = ctx.consumer; try { ctx.consumer = out; applyWithFocus$X(proc, values, ctx); } finally { ctx.consumer = save; } } /** Call a procedure with each item in a sequence as the context item. * @param proc a 3-operand <code>Procedure</code> as returned by * <code>evalToFocusProc</code> * @param values a sequence. The <code>proc</code> is called once for each * item, with the item as the first argument, a 1-based index as the * second argument, and the sequence size as the third argument. * @return the result of applying <code>proc</code> */ public Object applyWithFocus (Procedure proc, Object values) throws Throwable { CallContext ctx = CallContext.getInstance(); int oldIndex = ctx.startFromContext(); try { applyWithFocus$X(proc, values, ctx); return ctx.getFromContext(oldIndex); } catch (Throwable ex) { ctx.cleanupFromContext(oldIndex); throw ex; } } /** Call a procedure with each item in a sequence as the context item. * @param proc a 3-operand <code>Procedure</code> as returned by * <code>evalToFocusProc</code> * @param values a sequence. The <code>proc</code> is called once for each * item, with the item as the first argument, a 1-based index as the * second argument, and the sequence size as the third argument. * @param ctx the <code>CallContext</code>. The <code>$X</code> in the * method name tells Kawa that this argument is implicit when invoked * from XQuery. */ public void applyWithFocus$X (Procedure proc, Object values, CallContext ctx) throws Throwable { if (values instanceof Values) { Values v = (Values) values; int count = v.size(); if (count == 0) return; int ipos = 0; IntNum size = IntNum.make(count); for (int i = 1; ; i++) { proc.check3(v.getPosNext(ipos), IntNum.make(i), size, ctx); ctx.runUntilDone(); if (i == count) break; ipos = v.nextPos(ipos); } } else { IntNum one = IntNum.one(); proc.check3(values, one, one, ctx); ctx.runUntilDone(); } } /** Parse an XQuery expression that is the body of a procedure. * Helper method used by <code>evalWithFocus</code> methods. * @param expr an XQuery expression (query) to evaluate * @return a 3-operand Procedure whose arguments become * the context item, position, and size. */ public Procedure evalToFocusProc (String expr) throws Throwable { SourceMessages messages = new SourceMessages(); Procedure proc = evalToFocusProc(new CharArrayInPort(expr), messages); if (messages.seenErrors()) throw new RuntimeException("invalid syntax in eval form:\n" + messages.toString(20)); return proc; } /** Parse an XQuery expression from a <code>Reader</code> that is the body of a procedure. * Helper method used by <code>evalWithFocus</code> methods. * @param in where we read the expression from * @param messages where to write syntax errors * @return a 3-operand Procedure whose arguments become * the context item, position, and size. */ public Procedure evalToFocusProc (Reader in, SourceMessages messages) throws Throwable { InPort port = in instanceof InPort ? (InPort) in : new InPort(in); Compilation comp = parse(port, messages, PARSE_WITH_FOCUS|PARSE_IMMEDIATE); CallContext ctx = CallContext.getInstance(); int oldIndex = ctx.startFromContext(); try { ModuleExp.evalModule(Environment.getCurrent(), ctx, comp, null, null); return (Procedure) ctx.getFromContext(oldIndex); } catch (Throwable ex) { ctx.cleanupFromContext(oldIndex); throw ex; } } /** Evaluate an expression with each item in a sequence as the context item. * @param in where we read the expression from * @param messages where to write syntax errors * @param values becomes the context sequence while * evaluating <code>expr</code>. * @param out where to send the result of the expression */ public void evalWithFocus (Reader in, SourceMessages messages, Object values, Consumer out) throws Throwable { applyWithFocus(evalToFocusProc(in, messages), values, out); } /** Evaluate an expression with each item in a sequence as the context item. * @param expr an XQuery expression (query) to evaluate * @param values becomes the context sequence while * evaluating the expression * @return the result of evaluating the expression */ public Object evalWithFocus (String expr, Object values) throws Throwable { return applyWithFocus(evalToFocusProc(expr), values); } /** Evaluate an expression with a given focus (context). * @param expr an XQuery expression (query) to evaluate * @param item becomes the context item while evaluating <code>expr</code>. * @param position becomes the context position * @param size becomes the context size * @return the result of evaluating <code>expr</code> */ public Object evalWithFocus (String expr, Object item, int position, int size) throws Throwable { return applyWithFocus(evalToFocusProc(expr), item, position, size); } /** Evaluate an expression with a given focus (context). * @param in where we read the expression from * @param messages where to write syntax errors * @param item becomes the context item while evaluating the expression * @param position becomes the context position * @param size becomes the context size * @param out where to send the result of the expression */ public void evalWithFocus (Reader in, SourceMessages messages, Object item, int position, int size, Consumer out) throws Throwable { applyWithFocus(evalToFocusProc(in, messages), item, position, size, out); } /** Evaluate an expression with a given focus (context). * Similar to <code>evalWithFocus(String, Object, Consumer)</code>. * The "$X" in the method name tells the Kawa compiler that the CallContext * argument is implicit, so it can be invoked from XQuery code thus: * <code>XQuery:eval-with-focus($xquery, "expr", $sequence)</code> */ public void eval_with_focus$X (String expr, Object values, CallContext ctx) throws Throwable { applyWithFocus$X(evalToFocusProc(expr), values, ctx); } /** Evaluate an expression with a given focus (context). * Similar to <code>evalWithFocus(String, Object, int, int, Consumer)</code>. * The "$X" in the method name tells the Kawa compiler that the CallContext * argument is implicit, so it can be invoked from XQuery code thus: * <code>XQuery:eval-with-focus($xquery, "expr", $item, $pos, $size)</code> */ public void eval_with_focus$X (String expr, Object item, int position, int size, CallContext ctx) throws Throwable { Procedure proc = evalToFocusProc(expr); proc.check3(item, IntNum.make(position), IntNum.make(size), ctx); } public static final Environment xqEnvironment = Environment.make(XQUERY_FUNCTION_NAMESPACE); // This field need to be public so that the findLiteral method in // gnu.expr.LitTable can find it. public static final XQuery instance = new XQuery(); static { instance.initXQuery(); } public XQuery() { environ = xqEnvironment; defaultNamespace = xqueryFunctionNamespace; } private void initXQuery () { ModuleBody.setMainPrintValues(true); defProcStFld("unescaped-data", "gnu.kawa.xml.MakeUnescapedData", "unescapedData"); defProcStFld("item-at", "gnu.xquery.util.ItemAt", "itemAt"); defProcStFld("count", "gnu.kawa.functions.CountValues", "countValues"); define_method("sum", "gnu.xquery.util.Reduce", "sum"); // Overloaded defProcStFld("avg", "gnu.xquery.util.Average", "avg"); defProcStFld("sublist", "gnu.xquery.util.SubList", "subList"); // deprecated defProcStFld("subsequence", "gnu.xquery.util.SubList", "subList"); define_method("empty", "gnu.xquery.util.SequenceUtils", "isEmptySequence"); define_method("exists", "gnu.xquery.util.SequenceUtils", "exists"); define_method("insert-before", "gnu.xquery.util.SequenceUtils", "insertBefore$X"); define_method("remove", "gnu.xquery.util.SequenceUtils", "remove$X"); define_method("reverse", "gnu.xquery.util.SequenceUtils", "reverse$X"); defProcStFld("false", "gnu.xquery.lang.XQuery", "falseFunction"); defProcStFld("true", "gnu.xquery.lang.XQuery", "trueFunction"); defProcStFld("boolean", "gnu.xquery.util.BooleanValue", "booleanValue"); define_method("trace", "gnu.xquery.util.Debug", "trace"); define_method("error", "gnu.xquery.util.XQException", "error"); // overloaded defProcStFld("write-to", "gnu.kawa.xml.WriteTo", "writeTo"); defProcStFld("write-to-if-changed", "gnu.kawa.xml.WriteTo", "writeToIfChanged"); defProcStFld("iterator-items", "gnu.kawa.xml.IteratorItems", "iteratorItems"); defProcStFld("list-items", "gnu.kawa.xml.ListItems", "listItems"); define_method("node-name", "gnu.xquery.util.NodeUtils", "nodeName"); define_method("nilled", "gnu.xquery.util.NodeUtils", "nilled"); define_method("data", "gnu.xquery.util.NodeUtils", "data$X"); define_method("lower-case", "gnu.xquery.util.StringUtils", "lowerCase"); define_method("upper-case", "gnu.xquery.util.StringUtils", "upperCase"); define_method("substring", "gnu.xquery.util.StringUtils", "substring"); define_method("string-length", "gnu.xquery.util.StringUtils", "stringLength"); define_method("substring-before", "gnu.xquery.util.StringUtils", "substringBefore"); define_method("substring-after", "gnu.xquery.util.StringUtils", "substringAfter"); define_method("translate", "gnu.xquery.util.StringUtils", "translate"); define_method("encode-for-uri", "gnu.xquery.util.StringUtils", "encodeForUri"); define_method("iri-to-uri", "gnu.xquery.util.StringUtils", "iriToUri"); define_method("escape-html-uri", "gnu.xquery.util.StringUtils", "escapeHtmlUri"); // Non-standard (in F&O example appendix). Put in qexo namespace? // define_method("string-pad", "gnu.xquery.util.StringUtils", "stringPad"); define_method("contains", "gnu.xquery.util.StringUtils", "contains"); define_method("starts-with", "gnu.xquery.util.StringUtils", "startsWith"); define_method("ends-with","gnu.xquery.util.StringUtils", "endsWith"); define_method("codepoint-equal", "gnu.xquery.util.StringUtils", "codepointEqual"); define_method("normalize-unicode", "gnu.xquery.util.StringUtils", "normalizeUnicode"); define_method("string-join", "gnu.xquery.util.StringUtils", "stringJoin"); define_method("concat", "gnu.xquery.util.StringUtils", "concat$V"); define_method("matches", "gnu.xquery.util.StringUtils", "matches"); define_method("replace", "gnu.xquery.util.StringUtils", "replace"); define_method("tokenize", "gnu.xquery.util.StringUtils", "tokenize$X"); define_method("string-to-codepoints", "gnu.xquery.util.StringUtils", "stringToCodepoints$X"); define_method("codepoints-to-string", "gnu.xquery.util.StringUtils", "codepointsToString"); define_method("abs", "gnu.xquery.util.NumberValue", "abs"); define_method("floor", "gnu.xquery.util.NumberValue", "floor"); define_method("ceiling", "gnu.xquery.util.NumberValue", "ceiling"); define_method("round", "gnu.xquery.util.NumberValue", "round"); define_method("round-half-to-even", "gnu.xquery.util.NumberValue", "roundHalfToEven"); define_method("QName", "gnu.xquery.util.QNameUtils", "makeQName"); define_method("resolve-QName", "gnu.xquery.util.QNameUtils", "resolveQNameUsingElement"); define_method("prefix-from-QName", "gnu.xquery.util.QNameUtils", "prefixFromQName"); define_method("local-name-from-QName", "gnu.xquery.util.QNameUtils", "localNameFromQName"); define_method("namespace-uri-from-QName", "gnu.xquery.util.QNameUtils", "namespaceURIFromQName"); define_method("namespace-uri-for-prefix", "gnu.xquery.util.QNameUtils", "namespaceURIForPrefix"); define_method("in-scope-prefixes", "gnu.xquery.util.NodeUtils", "inScopePrefixes$X"); define_method("document-uri", "gnu.xquery.util.NodeUtils", "documentUri"); define_method("years-from-duration", "gnu.xquery.util.TimeUtils", "yearsFromDuration"); define_method("months-from-duration", "gnu.xquery.util.TimeUtils", "monthsFromDuration"); define_method("days-from-duration", "gnu.xquery.util.TimeUtils", "daysFromDuration"); define_method("hours-from-duration", "gnu.xquery.util.TimeUtils", "hoursFromDuration"); define_method("minutes-from-duration", "gnu.xquery.util.TimeUtils", "minutesFromDuration"); define_method("seconds-from-duration", "gnu.xquery.util.TimeUtils", "secondsFromDuration"); define_method("year-from-dateTime", "gnu.xquery.util.TimeUtils", "yearFromDateTime"); define_method("month-from-dateTime", "gnu.xquery.util.TimeUtils", "monthFromDateTime"); define_method("day-from-dateTime", "gnu.xquery.util.TimeUtils", "dayFromDateTime"); define_method("hours-from-dateTime", "gnu.xquery.util.TimeUtils", "hoursFromDateTime"); define_method("minutes-from-dateTime", "gnu.xquery.util.TimeUtils", "minutesFromDateTime"); define_method("seconds-from-dateTime", "gnu.xquery.util.TimeUtils", "secondsFromDateTime"); define_method("timezone-from-dateTime", "gnu.xquery.util.TimeUtils", "timezoneFromDateTime"); define_method("year-from-date", "gnu.xquery.util.TimeUtils", "yearFromDate"); define_method("month-from-date", "gnu.xquery.util.TimeUtils", "monthFromDate"); define_method("day-from-date", "gnu.xquery.util.TimeUtils", "dayFromDate"); define_method("timezone-from-date", "gnu.xquery.util.TimeUtils", "timezoneFromDate"); define_method("hours-from-time", "gnu.xquery.util.TimeUtils", "hoursFromTime"); define_method("minutes-from-time", "gnu.xquery.util.TimeUtils", "minutesFromTime"); define_method("seconds-from-time", "gnu.xquery.util.TimeUtils",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -