【问题标题】:XQuery3.0 function not supported by Saxon EE 9.5 - how to use format-number?Saxon EE 9.5 不支持 XQuery3.0 功能 - 如何使用格式编号?
【发布时间】:2015-07-24 17:23:12
【问题描述】:

我正在尝试使用 XQuery/XPath 3.0 中的 format-number 函数。

根据Saxon documentation,从 v9.3-9.4 开始支持。

我正在使用 Saxon-EE 9.5:

    <dependency>
        <groupId>com.saxonica</groupId>
        <artifactId>Saxon-EE</artifactId>
        <version>9.5.1-3</version>
    </dependency>

一个非常简单的测试抛出一个异常,错误如下:

@Test
public void testFormatNumber() throws SaxonApiException {
  Processor proc = new Processor(false);
  XQueryCompiler comp = proc.newXQueryCompiler();
  XQueryExecutable exp = comp.compile("format-number(number('123.4'),'#.00000000')");
}

这会引发以下错误:

Error on line 1 column 0 
  XPST0017 XQuery static error near #...(number('123.4'),'#.00000000')#:
    System function format-number#2 is not available with this host language/version

这可以使用 Saxon-HE-9.6.0-4,但我需要 EE 版本来进行架构验证,而 Saxon-EE 9.5.1-3 是我们拥有许可的版本。

Saxon-EE 有什么解决方案吗?是否有其他成熟的库支持 XQuery 3.0 和模式验证?

【问题讨论】:

  • 如果您想使用 XQuery 3.0,那么首先要尝试使用如下查询:comp.compile("xquery version \"3.0\"; format-number(number('123.4'),'#.00000000')");。我认为在这种情况下,Saxon 9.5 EE 会将您的查询视为 XQuery 3.0 查询。
  • 谢谢;这本身并不能解决问题,但结合@flafoux 的建议它可以工作!

标签: java xpath saxon xquery-3.0


【解决方案1】:

来自this site,看来您需要启用 xpath 3.0:

((net.sf.saxon.xpath.XPathEvaluator)xpath).setXPathLanguageLevel("3.0");

【讨论】:

  • 这似乎不适用于 XQuery(注意这里我使用的是 XQueryCompiler)。这个函数也是一个 XPath 函数,但问题实际上是关于 XQuery 的。
  • 你可以尝试指定给xquerycompiler comp.setLanguageVersion("3.0")
  • 谢谢你...它几乎工作了:(这会抛出一个 java.lang.UnsupportedOperationException: XQuery 3.0 扩展仅在 Saxon-PE 中受支持时编译格式编号 XQuery 表达式...
【解决方案2】:

结合@flafoux 和@martin-honnen 的答案,解决方案是:

    @Test
    public void testFormatNumber() throws SaxonApiException {
      Processor proc = new Processor(true);
      XQueryCompiler comp = proc.newXQueryCompiler();
      comp.setLanguageVersion("3.0");
      XQueryExecutable exp = comp.compile("xquery version \"3.0\"; format-number(number('123.4'),'#.00000000')");

      XQueryEvaluator qe = exp.load();
      Serializer out = new Serializer(new StringWriter());
      qe.run(out);

      for(XdmItem i : qe) {
        System.out.println(i.getStringValue());
      }
    }

【讨论】:

    【解决方案3】:

    在 Saxon 9.5 中,XQuery 3.0 支持仅在 -PE 和 -EE 中可用,并且需要显式启用。这在 Saxon 9.6 中发生了变化,“核心”XQ 3.0 功能在 -HE 产品中可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      相关资源
      最近更新 更多