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

How to get Element node in transform of xml using s9api XQuery transformation

我正在使用 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: The required item type of the value of variable $result1 is element(Q{}result); the supplied value doc() does not match. The supplied value is a document node net.sf.saxon.s9api.SaxonApiException: The required item type of the value of variable $result1 is element(Q{}result); the supplied value doc() does not match. The supplied value is a document node at net.sf.saxon.s9api.XQueryEvaluator.evaluate(XQueryEvaluator.java:430)

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

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

获取 result 元素。

你需要

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

访问child()方法