如何使用s9api XQuery转换获取xml转换中的Element节点

时间:2019-06-14 10:40:22

标签: xquery element saxon

我正在使用saxon s9api用XQuery转换xml。使用下面的代码是可能的,但我遇到了XPathException。

XQueryEvaluator需要Element节点,但是我不确定如何从Document节点获取Element。

我试图迭代并传递文档的子级。

// first java class
Processor processor = new Processor(false);
DocumentBuilder db = processor.newDocumentBuilder();
XdmNode doc = db.build(new StreamSource(new 
StringReader(innerResponse.getBody())));

// second java class where new processor is created.
XQueryCompiler compiler = processor.newXQueryCompiler();
XQueryExecutable executable = 
compiler.compile(getXQueryFileAsString(interfaceId));
XQueryEvaluator query = executable.load();

query.setExternalVariable(new QName("result1"), ((XdmNode) doc));
XdmValue nodes = query.evaluate();


// XQuery
(:: pragma bea:global-element-parameter parameter="$result1" element="result" location="../XMLSchemas/myxsd.xsd" ::)
(:: pragma bea:global-element-return element="result" location="../XMLSchemas/anotherxsd.xsd" ::)

declare namespace xf = "http://tempuri.org/somepath/XQueries/Result/";

declare function xf:Result($result1 as element(result),

// input xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
        <code>OK</code>
        <somedata>
        ..
        </somedata>
</result>

例外:

  

XPTY0004:变量$ result1的值的必需项类型为element(Q {} result);   提供的值doc()不匹配。提供的值是一个文档节点   net.sf.saxon.s9api.SaxonApiException:变量$ result1的值的必需项类型为element(Q {} result);提供的值doc()不匹配。提供的值是一个文档节点     在net.sf.saxon.s9api.XQueryEvaluator.evaluate(XQueryEvaluator.java:430)

1 个答案:

答案 0 :(得分:0)

假设result元素是文档的最外面的元素,并且您正在使用Saxon 9.9,请使用

doc.select(child("result")).asNode();

获取result元素。

您将需要

import static net.sf.saxon.s9api.streams.Steps.child;

访问child()方法