【问题标题】:How to get Element node in transform of xml using s9api XQuery transformation如何使用 s9api XQuery 转换在 xml 转换中获取元素节点
【发布时间】:2019-06-14 10:40:22
【问题描述】:

我正在使用 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的值需要的item类型是element(Q{}result); 提供的值 doc() 不匹配。提供的值是一个文档节点 net.sf.saxon.s9api.SaxonApiException: 变量$result1的值需要的item类型是element(Q{}result);提供的值 doc() 不匹配。提供的值是一个文档节点 在 net.sf.saxon.s9api.XQueryEvaluator.evaluate(XQueryEvaluator.java:430)

【问题讨论】:

  • 您的 XQuery 代码似乎声明了一个函数,其参数名为 $result1,类型为 element(result),您的输入文档看起来如何,是否包含任何名为 result 的元素?哪里,这只是根元素吗?

标签: xquery element saxon


【解决方案1】:

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

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

获取result 元素。

你需要

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

访问child() 方法

【讨论】:

  • Michael Kay 的回答效果很好。以前我曾尝试迭代 doc (XdmNode) 元素并获取第一个子元素。 XdmSequenceIterator&lt;XdmNode&gt; iter = doc.axisIterator(Axis.CHILD); if (iter.hasNext()) return iter.next();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多