当前位置: 代码迷 >> java >> 如何在Java中将嵌套的XML复杂元素转换为Saxon.Sequence?
  详细解决方案

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

热度:92   发布时间:2023-07-27 09:46:27.0

我是使用它来处理现有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参考指南之外,还建议任何可用的教程链接。

谢谢

我建议使用s9api接口( XdmValueXdmAtomicValueXdmNode类的类)而不是较低层的接口( NodeInfoInt64ValueSequence类的类),因为较低层的接口暴露了太多的内部复杂性,并且之间的稳定性不高。版本。

在s9api级别,可以使用XQueryCompiler.compile()编译查询以返回XQueryExecutable 对此调用load()以获得XQueryEvaluator ,然后callFunction()调用callFunction()以调用特定的XQuery函数。 callFunction()方法采用参数并以XdmValue实例的形式返回结果。 如果查询返回一个节点,它将采用XdmNode实例的形式,您可以使用XQueryEvaluator.setContextItem()将其设置为另一个查询的上下文项,从而对该XdmNode运行进一步的查询。

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

  相关解决方案