【问题标题】:Saxon cant compile xPathSaxon 无法编译 xPath
【发布时间】:2016-04-05 14:18:04
【问题描述】:

我构建 saxon9-7-0-4source.zip 并尝试在基于以下 xml 的 dom4j 文档中执行 xPath .//item[@name='entry']//property[matches(@value,'test[0-9]{1,2}$')]/..

<root>
<item name="abc">
  <iitem>
    <property value="test"/>
  </iitem>
</item>
<item name="entry">
  <iitem>
    <property value="test"/>
  </iitem>
  <iitem>
    <iiitem>
      <property value="test12"/>
    </iiitem>
  </iitem>
  <iitem>
    <property value="123"/>
  </iitem>
</item>
</root>

xPath 符合我的预期,我在 http://www.qutoric.com/xslt/analyser/xpathtool.html 在线测试它

但是如果我在我的 java 代码中尝试同样的方法

        Processor proc = new Processor(false);
        proc.getUnderlyingConfiguration().registerExternalObjectModel(new DOM4JObjectModel());
        DocumentBuilder db = proc.newDocumentBuilder();
        XdmNode xdmDoc = db.wrap(doc4j);
        XPathCompiler xpath = proc.newXPathCompiler();
        String path=".//item[@name='entry']//property[matches(@value,'test[0-9]{1,2}$')]/..";
        XPathExecutable viewPath = xpath.compile(path);

我在线程“main”中收到意外错误异常

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Cannot instantiate the type SystemFunctionCall

    at net.sf.saxon.functions.SystemFunction.makeFunctionCall(SystemFunction.java:94)
    at net.sf.saxon.functions.RegexFunction.makeFunctionCall(RegexFunction.java:69)
    at net.sf.saxon.functions.RegexFunctionSansFlags.makeFunctionCall(RegexFunctionSansFlags.java:49)
    at net.sf.saxon.functions.SystemFunctionLibrary.bind(SystemFunctionLibrary.java:91)
    at net.sf.saxon.functions.FunctionLibraryList.bind(FunctionLibraryList.java:105)
    at net.sf.saxon.expr.parser.XPathParser.parseFunctionCall(XPathParser.java:3015)
    at net.sf.saxon.expr.parser.XPathParser.parseBasicStep(XPathParser.java:2005)
    at net.sf.saxon.expr.parser.XPathParser.parseStepExpression(XPathParser.java:1890)
    at net.sf.saxon.expr.parser.XPathParser.parseRelativePath(XPathParser.java:1815)
    at net.sf.saxon.expr.parser.XPathParser.parsePathExpression(XPathParser.java:1777)
    at net.sf.saxon.expr.parser.XPathParser.parseSimpleMappingExpression(XPathParser.java:1791)
    at net.sf.saxon.expr.parser.XPathParser.parseUnaryExpression(XPathParser.java:1666)
    at net.sf.saxon.expr.parser.XPathParser.parseExprSingle(XPathParser.java:653)
    at net.sf.saxon.expr.parser.XPathParser.parseExpression(XPathParser.java:592)
    at net.sf.saxon.expr.parser.XPathParser.parsePredicate(XPathParser.java:1958)
    at net.sf.saxon.expr.parser.XPathParser.parseStepExpression(XPathParser.java:1900)
    at net.sf.saxon.expr.parser.XPathParser.parseRelativePath(XPathParser.java:1820)
    at net.sf.saxon.expr.parser.XPathParser.parsePathExpression(XPathParser.java:1777)
    at net.sf.saxon.expr.parser.XPathParser.parseSimpleMappingExpression(XPathParser.java:1791)
    at net.sf.saxon.expr.parser.XPathParser.parseUnaryExpression(XPathParser.java:1666)
    at net.sf.saxon.expr.parser.XPathParser.parseExprSingle(XPathParser.java:653)
    at net.sf.saxon.expr.parser.XPathParser.parseExpression(XPathParser.java:592)
    at net.sf.saxon.expr.parser.XPathParser.parse(XPathParser.java:464)
    at net.sf.saxon.expr.parser.ExpressionTool.make(ExpressionTool.java:98)
    at net.sf.saxon.sxpath.XPathEvaluator.createExpression(XPathEvaluator.java:144)
    at net.sf.saxon.s9api.XPathCompiler.internalCompile(XPathCompiler.java:506)
    at net.sf.saxon.s9api.XPathCompiler.compile(XPathCompiler.java:481)
    at xslt.XSLT.main(XSLT.java:35)

如果我尝试通过 XPathExecutable viewPath = xpath.compile(path); 编译 xPath,则会出现此错误。

【问题讨论】:

  • 鉴于您似乎正在从源代码自己构建撒克逊版本,并给出错误消息(“无法实例化...”),我怀疑存在构建问题。可能有一个 net.sf.saxon.expr.SystemFunctionCall 需要的类,您已将其排除在构建之外。使用类加载器跟踪运行可能有助于诊断它。
  • 我在标准 java 应用程序中运行相关的 code-sn-p 并获得了堆栈跟踪,您可以在我的编辑帖子中找到它。

标签: java xpath saxon


【解决方案1】:

我找到了这个异常的原因。我的 eclipse 版本太旧了,就像here 描述的那样。我必须针对 java 8 编译 saxon 9.7。

【讨论】:

  • Saxon 9.7 应该与 1.6 以上的任何 Java 版本一起运行,但我从未尝试在 Eclipse 下编译源代码。对所描述的症状最可能的解释是表达式调用了matches(),这需要正则表达式引擎,而正则表达式引擎使用了一些XML 数据文件,这些文件位于JAR 文件的“data”目录中。未能将这些包含在您的构建中将解释您所描述的症状。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
相关资源
最近更新 更多