0

经过一番研究,我还没有找到解决方案,但是很多人都遇到了这个问题:

我正在尝试在 Java 应用程序中使用 XQuery 转换

net.sf.saxon.s9api

但是,在尝试编译 XQueryExecutable exec = compiler.compile(...));我的 XQuery 时出现此错误:

    Error on line 13 column 3 of AivPumaRequest.xquery:
  XPST0081 XQuery static error near #... fn-bea:inlinedXML(fn:concat#:
    Prefix fn-bea has not been declared
Error on line 44 column 102 of AivPumaRequest.xquery:
  XPST0081 XQuery static error near #... div xdt:dayTimeDuration('P1D'#:
    Prefix xdt has not been declared
Error on line 199 column 3 of AivPumaRequest.xquery:
  XPST0081 XQuery static error near #... fn-bea:inlinedXML(fn:concat#:
    Prefix fn-bea has not been declared
Error on line 282 column 4 of AivPumaRequest.xquery:
  XPST0081 XQuery static error near #... {fn-bea:inlinedXML(fn:concat#:
    Prefix fn-bea has not been declared

net.sf.saxon.s9api.SaxonApiException: Prefix fn-bea has not been declared

有没有办法静态包含这个前缀或者我错过了什么,所以我的 XQuery 引擎 (SAXON) 找到了前缀?

4

1 回答 1

1

您的问题的简单答案是,您可以在查询序言中声明命名空间前缀,使用

declare namespace fn-bea = "http://some-appropriate-uri";

或在撒克逊 API 中使用

XQueryCompiler.declareNamespace("fn-bea", "http://some-appropriate-uri")

但这不会让您更进一步,除非(a)您知道将前缀绑定到哪个 URI,并且(b)您使具有这些名称的函数对查询处理器可用。

对 xdt:dayTimeDuration 的引用向我表明,这个查询是在 XQuery 仍是工作草案时编写的。例如,如果您查看 2005 年的工作草案

https://www.w3.org/TR/2005/CR-xquery-20051103/

您将在第 2 节中看到它使用内置前缀

xdt = http://www.w3.org/2005/xpath-datatypes

当 XQuery 1.0 成为推荐标准时,该dayTimeDuration数据类型已移至标准 XML Schema (xs) 命名空间,因此您可以简单地将“xdt”替换为“xs”——尽管您应该知道该语言的语义可能在小细节上也发生了变化。

至于fn-bea:inlinedXML,前缀的选择向我表明这可能是 BEA 查询处理器中的内置供应商扩展,已被 Oracle 接管。这里的规格:

https://docs.oracle.com/cd/E13162_01/odsi/docs10gr3/xquery/extensions.html

说:

fn-bea:inlinedXML 解析文本 XML 并返回 XQuery 1.0 数据模型的实例。

这表明该函数的作用与 XQuery 3.0 函数非常相似fn:parse-xml(),我建议您尝试在查询中进行替换。

于 2017-03-21T14:34:42.030 回答