You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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处理资源解析的必需组件,缺失会导致类加载失败。

解决步骤

  1. 下载XML Resolver的jar包(针对Saxon 11.x,建议使用xmlresolver-4.4.0.jar版本)
  2. 将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:13:31