2015-11-19 4 views
0

Я struggeled найти рабочий SAXON примера для выполнения простой задачи, как вычислив следующее XPath 2.0 выражения:Оценка выражений XPath 2.0 с SAXON

abs(-a) 

вычисление выражения, как

3 + 4 

работает довольно отлично, но мне не удалось предоставить SAXON значение для переменной a.

Я пробовал такие вещи, как:

final Processor proc = new Processor(false); 
    final XPathCompiler xpath = proc.newXPathCompiler(); 
    QName a = new QName("a"); 
    xpath.declareVariable(a); 

    System.out.println(xpath.evaluate("abs(-a)", null)); 

Но очевидно, что это не работает, так как я не указать значение для .

Как я могу объявить значение для a?

Любая помощь была бы высоко оценена!

Edit: Это не работает либо:

final Processor proc = new Processor(false); 
final XPathCompiler xpath = proc.newXPathCompiler(); 

XPathSelector exp = xpath.compile("abs(-$a)").load(); 

exp.setVariable(new QName("a"), new XdmAtomicValue(17)); 
XdmItem result = exp.evaluateSingle(); 

Это бросает исключение:

net.sf.saxon.s9api.SaxonApiException: необъявленной переменной в выражении XPath: $ A at net.sf.saxon.s9api.XPathCompiler.internalCompile (XPathCompiler.java:500) at net.sf.saxon.s9api.XPathCompiler.compile (XPathCompiler.java:472) at xpathtest.SaxonTest.test (SaxonTest.java : 26) at sun.reflect.NativeMe thodAccessorImpl.invoke0 (Родной метод) на sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) на sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:483) at org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:47) на org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) на org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:44) на org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:17) на org.junit.runners. ParentRunner.runLeaf (ParentRunner.java:271) на org.junit.runners.BlockJUni t4ClassRunner.runChild (BlockJUnit4ClassRunner.java:70) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:50) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:238) в орг .junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren (ParentRunner.java:236) at org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java : 53) at org.junit.runners.ParentRunner $ 2.оценить (ParentRunner.java:229) на org.junit.runners.ParentRunner.run (ParentRunner.java:309) at org.eclipse.jdt.internal. junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution. java: 38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java: 675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java: 192) Вызвано: net.sf.saxon.trans.XPathException: Необъявленная переменная в выражении XPath: $ a at net.sf.saxon.sxpath.IndependentContext.bindVariable (IndependentContext.java:458) at net.sf. saxon.expr.parser.XPathParser.parseVariableReference (XPathParser.java:1905) at net.sf.saxon.expr.parser.XPathParser.parseBasicStep (XPathParser.java:1703) at net.sf.saxon.expr.parser. XPathParser.parseStepExpression (XPathParser.java:1638) at net.sf.saxon.expr.parser.XPathParser.parseRelativePath (XPathParser.java:1564) at net.sf.sax on.expr.parser.XPathParser.parsePathExpression (XPathParser.java:1529) at net.sf.saxon.expr.parser.XPathParser.parseSimpleMappingExpression (XPathParser.java:1541) at net.sf.saxon.expr.parser. XPathParser.parseUnaryExpression (XPathParser.java:1419) at net.sf.saxon.expr.parser.XPathParser.parseUnaryExpression (XPathParser.java:1390) at net.sf.saxon.expr.parser.XPathParser.parseExprSingle (XPathParser. Java: 511) на net.sf.saxon.expr.parser.XPathParser.parseFunctionArgument (XPathParser.java:2629) на net.sf.saxon.expr.parser.XPathParser.parseFunctionCall (XPathParser.java:2371) на net.sf.saxon.expr.parser.XPathParser.parseBasicStep (XPathParser.java:1723) at net.sf.saxon.expr.parser.XPathParser.parseStepExpression (XPathParser.java:1638) at net.sf.saxon.expr.parser.XPathParser.parseRelativePath (XPathParser.java:1564) at net.sf.saxon.expr.parser.XPathParser.parsePathExpression (XPathParser.java:1529) at net.sf. saxon.expr.parser.XPathParser.parseSimpleMappingExpression (XPathParser.java:1541) at net.sf.saxon.expr.parser.XPathParser.parseUnaryExpression (XPathParser.java:1419) at net.sf.saxon.expr.parser. XPathParser.parseExprSingle (XPathParser.java:511) at net.sf.saxon.expr.parser.XPathParser.parseExpression (XPathParser.java:450) at net.sf.saxon.expr.parser.XPathParser.parse (XPathParser. java: 386) at net.sf.saxon.expr.parser.ExpressionTool.make (ExpressionTool.java:102) at net.sf.saxon.sxpath.XPathEvaluator.createExpression (XPathEvaluat or.java:153) в net.sf.saxon.s9api.XPathCompiler.internalCompile (XPathCompiler.java:497) ... 25 больше

ответ

1

Во-первых, она должна быть abs(-$a). Обратите внимание на $.

Для предоставления параметров вы не можете использовать метод «коротких вырезов» XPathCompiler.evaluate(). Вы должны сделать это долгий путь:

XPathSelector exp = xpath.compile("abs(-$a)").load(); 
exp.setVariable(new QName("a"), new XdmAtomicValue(17)); 
XdmItem result = exp.evaluateSingle(); 
+0

Я все еще получаю исключение * необъявленной переменной *. Я добавил ваше предложение и stacktrace к стартовому сообщению. –

+1

Вы вышли из 'xpath.declareVariable()' перед 'xpath.compile()', который вы получили прямо в своей исходной версии. –

1

Я знаю, эта нить старый, но я столкнулся с этой проблемой в последнее время, и провел почти 2 часа в поисках ответов. Наконец, я получил эту работу с Saxon-HE 9.4. Я все время получал ошибку от компиляции, несмотря на объявление внешней переменной до тех пор, пока я еще не позвонил:

xpath.setAllowUndeclaredVariables(true);