如何将嵌套的 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 接口(类,如 XdmValue
、XdmAtomicValue
、XdmNode
)而不是较低级别的接口(类像 NodeInfo
、Int64Value
、Sequence
),因为较低级别的接口暴露了太多的内部复杂性,并且在版本之间不太稳定。
在 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。
我是 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 接口(类,如 XdmValue
、XdmAtomicValue
、XdmNode
)而不是较低级别的接口(类像 NodeInfo
、Int64Value
、Sequence
),因为较低级别的接口暴露了太多的内部复杂性,并且在版本之间不太稳定。
在 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。