SAXON - XPST0017:找不到名为的匹配的 1 参数函数
SAXON - XPST0017: Cannot find a matching 1-argument function named
我有一个简单的 jar 测试程序,我用它来解析 xml xquery 文件。
问题是我在 xquery 文件中声明了一个 java 命名空间:
declare namespace java="java:MyString";
然后出于测试目的,我只有一个静态方法 toString(Object o).
当我在 Eclipse 之外执行它时(当我手动设置 class 文件夹时,他正确地管理了 class 路径)我在标题中得到错误:
> C:\>java -jar XQueryJava.jar
> -xq XQuery\test.xq -xml XQuery\test.xml Error on line 9 of XQuery\test.xml: XPST0017: Cannot find a matching 1-argument
> function named {java:MyString}toString() ; SystemID: XQuery\test.xml;
> Line#: 9; Column#: -1 net.sf.saxon.trans.StaticError: Cannot find a
> matching 1-argument function named {java:MyString}toString()
> at net.sf.saxon.query.UnboundFunctionLibrary.bindUnboundFunctionCalls(UnboundFunctionLibrary.java:114)
> at net.sf.saxon.query.StaticQueryContext.bindUnboundFunctionCalls(StaticQueryContext.java:1479)
> at net.sf.saxon.query.QueryParser.makeXQueryExpression(QueryParser.java:106)
> at net.sf.saxon.query.StaticQueryContext.compileQuery(StaticQueryContext.java:472)
> at net.sf.saxon.query.StaticQueryContext.compileQuery(StaticQueryContext.java:502)
> at xpath.AffichageXPath.execute(AffichageXPath.java:91)
> at xpath.AffichageXPath.main(AffichageXPath.java:49)
我尝试使用“-cp”和我将 .class 文件放入的文件夹:
java --class-path XQuery\class -jar XQueryJava.jar -xq XQuery\test.xq -xml XQuery\test.xml
但还是一样的问题。
如果我将 class 文件放在与 jar 相同的文件夹中,一切都很好。
为什么它不适用于 CP 参数?我认为这是重点...
有什么想法吗?
谢谢。
首先,堆栈跟踪显示您正在使用
调用处理器
net.sf.saxon.query.StaticQueryContext.compileQuery
这是一个非常低级的入口点,在这个级别上有很多错误的方法。我建议您使用 s9api 接口 (XQueryCompiler.compile()
)。
您很容易出错的一件事是 运行 没有启用 Saxon-PE/EE。调用自反扩展函数至少需要 Saxon-PE,它还需要存在许可证文件。检查 Saxon 配置是 ProfessionalConfiguration 还是 EnterpriseConfiguration。
在命令行上使用 -TJ 选项,或在 API (FeatureKeys.TRACE_EXTERNAL_FUNCTIONS
) 中使用等效配置 属性 可以更好地诊断失败的原因找到函数。
最后,请注意在 Java 命令行上使用 -jar
意味着忽略 class 路径:所有内容都必须从 JAR 文件本身加载。这使得获取许可证文件和任何外部库 classes 变得相当困难,因此最好避免这样做。
我有一个简单的 jar 测试程序,我用它来解析 xml xquery 文件。 问题是我在 xquery 文件中声明了一个 java 命名空间:
declare namespace java="java:MyString";
然后出于测试目的,我只有一个静态方法 toString(Object o).
当我在 Eclipse 之外执行它时(当我手动设置 class 文件夹时,他正确地管理了 class 路径)我在标题中得到错误:
> C:\>java -jar XQueryJava.jar
> -xq XQuery\test.xq -xml XQuery\test.xml Error on line 9 of XQuery\test.xml: XPST0017: Cannot find a matching 1-argument
> function named {java:MyString}toString() ; SystemID: XQuery\test.xml;
> Line#: 9; Column#: -1 net.sf.saxon.trans.StaticError: Cannot find a
> matching 1-argument function named {java:MyString}toString()
> at net.sf.saxon.query.UnboundFunctionLibrary.bindUnboundFunctionCalls(UnboundFunctionLibrary.java:114)
> at net.sf.saxon.query.StaticQueryContext.bindUnboundFunctionCalls(StaticQueryContext.java:1479)
> at net.sf.saxon.query.QueryParser.makeXQueryExpression(QueryParser.java:106)
> at net.sf.saxon.query.StaticQueryContext.compileQuery(StaticQueryContext.java:472)
> at net.sf.saxon.query.StaticQueryContext.compileQuery(StaticQueryContext.java:502)
> at xpath.AffichageXPath.execute(AffichageXPath.java:91)
> at xpath.AffichageXPath.main(AffichageXPath.java:49)
我尝试使用“-cp”和我将 .class 文件放入的文件夹:
java --class-path XQuery\class -jar XQueryJava.jar -xq XQuery\test.xq -xml XQuery\test.xml
但还是一样的问题。
如果我将 class 文件放在与 jar 相同的文件夹中,一切都很好。 为什么它不适用于 CP 参数?我认为这是重点...
有什么想法吗?
谢谢。
首先,堆栈跟踪显示您正在使用
调用处理器net.sf.saxon.query.StaticQueryContext.compileQuery
这是一个非常低级的入口点,在这个级别上有很多错误的方法。我建议您使用 s9api 接口 (XQueryCompiler.compile()
)。
您很容易出错的一件事是 运行 没有启用 Saxon-PE/EE。调用自反扩展函数至少需要 Saxon-PE,它还需要存在许可证文件。检查 Saxon 配置是 ProfessionalConfiguration 还是 EnterpriseConfiguration。
在命令行上使用 -TJ 选项,或在 API (FeatureKeys.TRACE_EXTERNAL_FUNCTIONS
) 中使用等效配置 属性 可以更好地诊断失败的原因找到函数。
最后,请注意在 Java 命令行上使用 -jar
意味着忽略 class 路径:所有内容都必须从 JAR 文件本身加载。这使得获取许可证文件和任何外部库 classes 变得相当困难,因此最好避免这样做。