我是使用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参考指南之外的所有可用教程链接。
谢谢
答案 0 :(得分:0)
我建议使用s9api接口(类似XdmValue
,XdmAtomicValue
,XdmNode
的类),而不是使用较低级别的接口(类似NodeInfo
,{{1 }},Int64Value
),因为较低级别的接口暴露了太多的内部复杂性,并且在发行版之间不稳定。
在s9api级别,您可以使用Sequence
编译查询以返回XQueryCompiler.compile()
;为此调用XQueryExecutable
以获得load()
,然后对此调用XQueryEvaluator
以调用特定的XQuery函数。 callFunction()
方法接受参数,并以callFunction()
实例的形式返回结果。如果查询返回一个节点,它将以XdmValue
实例的形式出现,您可以通过使用{{1 }}。
如果您确实想使用下级接口,则XdmNode
是一个接口,您将必须选择特定的实现。对于单个节点的序列,子接口XdmNode
是合适的;但是您需要知道,当函数返回单个节点时,它不一定会作为XQueryEvaluator.setContextItem()
的实例返回,例如,可能由Sequence
的{{1}}方法返回需要调用以获得NodeInfo
。如果可以避免的话,您确实不想参与这样的复杂性。因此请使用s9api。