XQuery Saxon 异常 (java.lang.IllegalArgumentException)

XQuery Saxon Exception (java.lang.IllegalArgumentException)

我不是 XQuery 专家。只要知道就够了。最近我将我的 Xquery 执行代码从 Saxon 8.4 迁移到了 9.9.1.2。所以我对 XQ 文件的执行方式做了一些更改。代码没有错误,但在 运行 时间内,出现异常:

java.lang.IllegalArgumentException: Supplied node must be built using the same or a compatible Configuration

我修改为 运行 XQ 文件的代码如下所示:

// Prepare the environment for Saxon
        SaxonErrorListener listener = new SaxonErrorListener();
        listener.setLogger(new StandardLogger(new PrintStream(errors, true, "UTF-8")));
        getSaxonConfig().setErrorListener(listener);
        StaticQueryContext staticContext = new StaticQueryContext(getSaxonConfig());
        Configuration configuration = new Configuration();

        staticContext.setBaseURI("");

        // Set up the dynamic context
        DynamicQueryContext dynamicContext = new DynamicQueryContext(getSaxonConfig());

        if ((xmlData != null) && (xmlData.length() > 0)) {
            dynamicContext.setContextItem(configuration.buildDocumentTree(new StreamSource(new StringReader(xmlData))).getRootNode());
        }             

        // If required use a (URI) uriResolver to handle xquery "doc" functions and module imports
        if (uriResolver != null) {
            dynamicContext.setURIResolver(uriResolver);
            staticContext.setModuleURIResolver(uriResolver);
        }

        // If any external variables required, add them to the dynamic context
        if (getExternalVariables().size() > 0) {

            for (String varname : getExternalVariables().keySet()) {

                StructuredQName structuredQName = new StructuredQName("", "", varname);
                ObjectValue<Object> objectValue = new ObjectValue<Object>(getExternalVariables().get(varname));
                dynamicContext.setParameter(structuredQName, objectValue);

            }
        }

        // Prepare the XQuery
        XQueryExpression exp;
        exp = staticContext.compileQuery(xQuery);

        // Run the XQuery
        StringWriter out = new StringWriter();
        exp.run(dynamicContext, new StreamResult(out), saxonProps);

        // Collect the content
        xqResult = out.toString();

抛出错误的行是:

dynamicContext.setContextItem(configuration.buildDocumentTree(new StreamSource(new StringReader(xmlData))).getRootNode());

现在我用 Google 搜索了解决方案,但没有找到太多相关信息。 XQ 文档也没有太多可供我学习的示例。任何帮助,将不胜感激。谢谢!

从 8.4 开始,您使用的 API 类 和方法(如 StaticQueryContextDynamicQueryContext)不再是最佳实践,如果它们在全部。 9.1左右引入了s9api接口,更好用,更稳定

但是,错误是因为您有多个 Saxon Configuration 对象。我无法确切地看到发生了什么,因为你没有向我们展示完整的图片,但是创建一个 new Configuration() 时必须已经存在一个用于 getSaxonConfig() 访问的调用看起来像个坏消息.

我看不出 getSaxonConfig() 做了什么,但我猜如果你改变

Configuration configuration = new Configuration();

Configuration configuration = getSaxonConfig();

那么问题就迎刃而解了。