0

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

根据Saxon 文档,从 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 和模式验证的成熟库?

4

3 回答 3

1

这个站点,看起来您需要启用 xpath 3.0:

((net.sf.saxon.xpath.XPathEvaluator)xpath).setXPathLanguageLevel("3.0");
于 2015-05-13T12:51:43.080 回答
0

结合@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());
      }
    }
于 2015-05-15T10:32:09.950 回答
0

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

于 2015-05-20T19:48:49.560 回答