问题描述
我是使用它来处理现有xqueries的saxon的新手。 我可以使用来自Java类的原始类型(简单类型)执行简单的xquery,如下所示:
Xquery:
declare function xf:addNumberss($int1 as xs:int,
$int2 as xs:int)
as xs:int {
<value>{data($int1)+data($int2)}</value>
};
Java:
final Sequence[] arglist = new Sequence[2];
arglist[0] = new Int64Value(10);
arglist[1] = new Int64Value(10);
arglist[0] = new Int64Value(request.getNo1());
arglist[1] = new Int64Value(request.getNo2());
Sequence result = null;
try {
result = fn1.call(arglist, controller);
在哪里得到预期的答复。 但是我被困在如何将复杂元素作为输入传递给Xquery
Ex: Xquery
declare function xf:addNumbersByElements($addNumbers1 as element(ns0:addNumbers))
as element(ns0:addNumbersResponse) {
<ns0:addNumbersResponse>
<ns0:response>
<ns0:result>{ data($addNumbers1/ns0:request/ns0:no1) + data($addNumbers1/ns0:request/ns0:no2) }</ns0:result>
</ns0:response>
</ns0:addNumbersResponse>
Java:
final Sequence[] arglist = new Sequence[1];
arglist[0] = (Sequence)addNumType;
无法将AdNumType复杂类型转换为序列Exception:java.lang.ClassCastException:com.xq.AddNumbersType与net.sf.saxon.om.Sequence不兼容
任何人都可以帮助如何在Saxon中将复杂类型转换为xquery输入。 另外,除了API参考指南之外,还建议任何可用的教程链接。
谢谢
1楼
我建议使用s9api接口( XdmValue
, XdmAtomicValue
, XdmNode
类的类)而不是较低层的接口( NodeInfo
, Int64Value
, Sequence
类的类),因为较低层的接口暴露了太多的内部复杂性,并且之间的稳定性不高。版本。
在s9api级别,可以使用XQueryCompiler.compile()
编译查询以返回XQueryExecutable
;
对此调用load()
以获得XQueryEvaluator
,然后callFunction()
调用callFunction()
以调用特定的XQuery函数。
callFunction()
方法采用参数并以XdmValue
实例的形式返回结果。
如果查询返回一个节点,它将采用XdmNode
实例的形式,您可以使用XQueryEvaluator.setContextItem()
将其设置为另一个查询的上下文项,从而对该XdmNode
运行进一步的查询。
如果确实要使用较低级别的接口,则Sequence
是一个接口,您将必须选择特定的实现。
对于单个节点的序列,子接口NodeInfo
适用;
但是您需要知道,当一个函数返回一个节点时,它不一定会作为NodeInfo
的实例返回,例如,它可能是由LazySequence
其head()
方法来获取NodeInfo
。
如果可以避免的话,您确实不想参与这样的复杂性。
因此请使用s9api。