我是saxon的新手,用它来处理现有的xqueries。我可以从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复杂类型转换为序列异常:java.lang.ClassCastException:com.xq.AddNumbersType与net.sf.saxon.om.Sequence不兼容
有谁可以帮助如何在Saxon中将复杂类型转换为xquery输入。另外,请提供API参考指南以外的任何教程链接。
谢谢
我建议使用s9api接口(像XdmValue
,XdmAtomicValue
,XdmNode
这样的类)而不是低级接口(像NodeInfo
,Int64Value
,Sequence
这样的类),因为较低级别的接口暴露了太多的内部复杂性并且在两者之间不太稳定版本。
在s9api级别,您可以使用XQueryCompiler.compile()
编译查询以返回XQueryExecutable
;调用load()
来获取XQueryEvaluator
,然后调用callFunction()
来调用特定的XQuery函数。 callFunction()
方法接受参数并以XdmValue
实例的形式返回结果。如果查询返回一个节点,它将采用XdmNode
实例的形式,并且您可以通过使用XdmNode
将其设置为另一个查询的上下文项来对此XQueryEvaluator.setContextItem()
运行进一步查询。
如果您确实想使用较低级别的接口,Sequence
是一个接口,您必须选择一个特定的实现。对于作为单个节点的序列,子接口NodeInfo
是合适的;但是你需要注意,当一个函数返回一个单独的节点时,它不一定会作为NodeInfo
的实例返回,它可能是例如LazySequence
,需要调用head()
方法来获得NodeInfo
。如果你能避免它,你真的不想参与这些复杂的事情;所以使用s9api。