如何在Java中将嵌套的XML复杂元素转换为Saxon.Sequence?

时间:2019-02-13 03:53:36

标签: java dom saxon

我是使用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参考指南之外的所有可用教程链接。

谢谢

1 个答案:

答案 0 :(得分:0)

我建议使用s9api接口(类似XdmValueXdmAtomicValueXdmNode的类),而不是使用较低级别的接口(类似NodeInfo,{{1 }},Int64Value),因为较低级别的接口暴露了太多的内部复杂性,并且在发行版之间不稳定。

在s9api级别,您可以使用Sequence编译查询以返回XQueryCompiler.compile();为此调用XQueryExecutable以获得load(),然后对此调用XQueryEvaluator以调用特定的XQuery函数。 callFunction()方法接受参数,并以callFunction()实例的形式返回结果。如果查询返回一个节点,它将以XdmValue实例的形式出现,您可以通过使用{{1 }}。

如果您确实想使用下级接口,则XdmNode是一个接口,您将必须选择特定的实现。对于单个节点的序列,子接口XdmNode是合适的;但是您需要知道,当函数返回单个节点时,它不一定会作为XQueryEvaluator.setContextItem()的实例返回,例如,可能由Sequence的{​​{1}}方法返回需要调用以获得NodeInfo。如果可以避免的话,您确实不想参与这样的复杂性。因此请使用s9api。