Как получить элементный элемент в преобразовании xml с помощью преобразования XQuery s9api - PullRequest
0 голосов
/ 14 июня 2019

Я использую saxon s9api для преобразования xml с помощью XQuery.С кодом ниже это возможно, но я получаю XPathException.

XQueryEvaluator ожидает узел Element, но я не уверен, как получить элемент из узла Document.

Я пытался выполнить итерацию и передачудети документа.

// 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 голосов
/ 14 июня 2019

Предполагая, что элемент result является самым внешним элементом документа, и что вы используете Saxon 9.9, используйте

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

, чтобы получить элемент result.

Вам понадобится

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

для доступа к child() методу

...