2016-04-05 12 views
1

ich saxon9-7-0-4source.zip bauen und versuchen, die xPath .//item[@name='entry']//property[matches(@value,'test[0-9]{1,2}$')]/.. bei einem dom4j Dokument auszuführen auf den folgenden XML-basiert:Saxon kann nicht kompilieren xPath

<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> 

Die xPath tut, was ich exspect ich es testen online unter http://www.qutoric.com/xslt/analyser/xpathtool.html

Aber wenn ich das gleiche in meinem Java-Code versuchen

 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); 

ich einen unerwarteten Fehler Exception in thread "main" erhalten

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) 

Dieser Fehler tritt auf, wenn ich versuche, die xPath über XPathExecutable viewPath = xpath.compile(path); zu kompilieren.

+2

GIven, dass Sie scheinen, eine sächsische Version selbst vom Quellcode zu bauen, und die Fehlermeldung gegeben ("kann nicht instanziieren ..."), vermute ich ein Build-Problem. Wahrscheinlich gibt es eine Klasse, die net.sf.saxon.expr.SystemFunctionCall benötigt, die Sie aus dem Build herausgelassen haben. Das Ausführen mit Class Loader-Tracing kann bei der Diagnose helfen. –

+0

Ich habe den entsprechenden Code-Snippet in einer Standard-Java-Anwendung ausgeführt und den Stack-Trace erhalten, den Sie in meinem Bearbeitungsposten finden. – StellaMaris

Antwort

0

Ich habe herausgefunden, wo diese Ausnahme herkommt. Meine Version von Eclipse ist zu alt wie es beschrieben wird here. Ich muss Sachse 9,7 gegen Java 8 kompilieren.

+0

Saxon 9.7 sollte mit jeder Java-Version ab 1.6 aufwärts laufen, aber ich habe nie versucht, die Quelle unter Eclipse zu kompilieren. Die wahrscheinlichste Erklärung für die beschriebenen Symptome ist, dass der Ausdruck matches() aufruft, was die Engine für reguläre Ausdrücke erfordert, und die Regex-Engine einige XML-Datendateien verwendet, die sich im Verzeichnis "data" in der JAR-Datei befinden. Wenn Sie diese nicht in Ihren Build aufnehmen, erklären Sie die Symptome, die Sie beschreiben. –