【问题标题】:how to convert nested XML complex element to Saxon.Sequence in Java?如何将嵌套的 XML 复杂元素转换为 Java 中的 Saxon.Sequence?
【发布时间】:2019-02-13 03:53:35
【问题描述】:

我是 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 不兼容

任何人都可以帮助如何在撒克逊语中将复杂类型转换为 xquery 输入。此外,请建议除 API 参考指南之外的任何可用教程链接。

谢谢

【问题讨论】:

标签: java dom saxon


【解决方案1】:

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

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

如果您确实想使用较低级别的接口,Sequence 是一个接口,您必须选择一个特定的实现。对于单节点的序列,子接口NodeInfo比较合适;但是您需要注意,当函数返回单个节点时,它不一定会作为NodeInfo 的实例返回,例如可能由LazySequencehead() 方法需要调用才能获得NodeInfo。如果可以避免的话,你真的不想卷入如此复杂的事情;所以使用s9api。

【讨论】:

  • 嗨@Michael Kay,感谢您的解释。我会尝试使用 s9api。还有一个问题,这个s9api和saxon api一样吗?我已经使用了 Java 标准化的 XQJ API。我们可以使用 XQJ Api 进行 xquery 处理吗?
  • 我们在 .NET 上称之为 Saxon.Api,在 Java 上称之为 s9api;它们非常相似。您可以将 XQJ 与 Saxon 一起使用,但它有相当大的限制(例如,节点只能以 DOM 形式实现)所以您真的只想在跨 XQuery 引擎的可移植性对您非常重要时才使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2011-07-27
  • 1970-01-01
相关资源
最近更新 更多