在Shell运行Saxon执行XQuery时遇NoClassDefFoundError及语法错误
解决Saxon执行XQuery的两类问题
问题1:Saxon-HE 11.4执行时抛出NoClassDefFoundError
错误场景
执行命令时出现如下异常:
$ java -cp "/path/to/lib/saxon-he-11.4.jar" net.sf.saxon.Query -qversion:3.1 -q:xquery.txt Exception in thread "main" java.lang.NoClassDefFoundError: org/xmlresolver/Resolver at net.sf.saxon.lib.CatalogResourceResolver.<init>(CatalogResourceResolver.java:46) at net.sf.saxon.Configuration.init(Configuration.java:367) at net.sf.saxon.Configuration.<init>(Configuration.java:230) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) at java.base/java.lang.Class.newInstance(Class.java:584) at net.sf.saxon.Configuration.newConfiguration(Configuration.java:246) at net.sf.saxon.Query.doQuery(Query.java:265) at net.sf.saxon.Query.main(Query.java:103) Caused by: java.lang.ClassNotFoundException: org.xmlresolver.Resolver at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 11 more
原因
Saxon从10.x版本开始,HE(免费版)不再内置XML Resolver依赖,该库是Saxon处理资源解析的必需组件,缺失会导致类加载失败。
解决步骤
- 下载XML Resolver的jar包(针对Saxon 11.x,建议使用xmlresolver-4.4.0.jar版本)
- 将XML Resolver的jar包加入classpath,修改执行命令如下:
$ java -cp "/path/to/lib/saxon-he-11.4.jar:/path/to/lib/xmlresolver-4.4.0.jar" net.sf.saxon.Query -qversion:3.1 -q:xquery.txt
问题2:Saxon9HE执行时提示无法识别copy关键字
错误场景
执行命令时出现语法错误:
$ java -cp "/path/to/lib/saxon9he.jar" net.sf.saxon.Query -qversion:3.0 -q:xquery.txt Error on line 2 column 1 of xquery.txt: XPST0003 XQuery syntax error near #...rocessingml/2006/main";; copy $#: Unexpected token "copy" in path expression Static error(s) in query
原因
Saxon9HE(尤其是早期9.x版本,如9.4及之前)仅支持XQuery 1.0标准,而copy-modify-return是XQuery 3.0引入的更新语法,旧版本无法识别该关键字。
解决方法(二选一)
方案1:升级Saxon版本
将Saxon9HE升级到支持XQuery 3.0+的版本,比如Saxon 9.8 HE及以上版本(或直接使用11.x版本并解决上述依赖问题),新版本HE已支持XQuery 3.0核心特性。
方案2:改写XQuery为1.0兼容语法
使用XQuery 1.0的节点构造语法实现相同的删除逻辑,示例脚本如下:
declare namespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; let $input := doc("/tmp/file.xml") return element root { $input/root/@*, for $lvl in $input/root/w:lvl return element w:lvl { $lvl/@*, $lvl/*[not(self::w:rPr)] } }
附:用户提供的原始文件
XQuery脚本(xquery.txt)
declare namespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; copy $input := doc("/tmp/file.xml") modify delete node $input//w:rPr return $input
XML输入文件(/tmp/file.xml)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:lvl w:ilvl="0"> <w:rPr> TO REMOVE </w:rPr> <w:rPx> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPx> </w:lvl> </root>
内容的提问来源于stack exchange,提问作者Gilles Quénot
相关产品推荐
相关产品推荐

