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

how to convert nested XML complex element to Saxon.Sequence in Java?

我是 saxon 的新手,使用它来处理现有的 xqueries。我可以使用 java class 中的原始类型(简单类型)执行简单的 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() 将查询编译为 return 和 XQueryExecutable;在此调用 load() 以获得 XQueryEvaluator,然后在此调用 callFunction() 以调用特定的 XQuery 函数。 callFunction() 方法接受参数,returns 结果以 XdmValue 实例的形式出现。如果查询 return 是一个节点,它将以 XdmNode 实例的形式出现,您可以通过将其设置为上下文来 运行 对此 XdmNode 进行进一步查询使用 XQueryEvaluator.setContextItem().

的另一个查询的项目

如果您确实想使用较低级别的接口,Sequence 是一个接口,您必须选择特定的实现。对于单节点的序列,子接口NodeInfo比较合适;但你需要注意,当函数 return 是单个节点时,它不一定会被 return 编辑为 NodeInfo 的实例,例如 [=29] =]需要调用其head()方法获取NodeInfo。如果可以避免的话,您真的不想卷入这种复杂的事情中;所以使用s9api。