8

我们有一个相当简单的 XQuery 和 Groovy 代码,如下所示。查询代码:

declare variable $criteria as element(criteria) external ;

<scopedInterventions>{
$criteria/equals/field
}</scopedInterventions>

这是试图调用它的测试代码

def uri = new URI("xcc://admin:admin@localhost:8001")

def contentSource = ContentSourceFactory.newContentSource(uri)

def request = session.newModuleInvoke("ourQuery.xqy")
def criteria =
"""<criteria>
<equals>
<field>status</field>
<value>draft</value>
</equals>
</criteria>
"""

request.setNewVariable("criteria",ValueType.ELEMENT, criteria);

session.submitRequest(request).asString()
}

我们在执行时收到此错误:

引起:com.marklogic.xcc.exceptions.XQueryException: XDMP-LEXVAL: xs:QName("element()") -- 无效的词法值 "element()" [Session: user=admin, cb={default} [ ContentSource: user=admin, cb={none} [provider: address=localhost/127.0.0.1:9001, pool=1/64]]] [Client: XCC/5.0-3, Server: XDBC/5.0-3] expr : xs:QName("element()") at com.marklogic.xcc.impl.handlers.ServerExceptionHandler.handleResponse(ServerExceptionHandler.java:34) at com.marklogic.xcc.impl.handlers.EvalRequestController.serverDialog(EvalRequestController.java :83) com.marklogic.xcc.impl.handlers.AbstractRequestController.runRequest(AbstractRequestController.java:84) com.marklogic.xcc.impl.SessionImpl.submitRequestInternal(SessionImpl.java:373) com.marklogic.xcc。 impl.SessionImpl.submitRequest(SessionImpl.java:356) 在 com.zynx.galen.dataaccess.MarkLogicUtilities.executeQueryWithMultipleXMLParameters(MarkLogicUtilities.groovy:52) 在 com.zynx.galen.repositories.ScopedInterventionService.getScopedInterventionsByCriteria(ScopedInterventionService.groovy:20) ... 还有 1 个

任何帮助将不胜感激。

4

1 回答 1

7

http://docs.marklogic.com/javadoc/xcc/overview-summary.html有答案,我认为:

使用查询传递变量

变量可以绑定到 Request 对象。当使用 Session.submitRequest(Request) 向服务器发出执行请求时,当前绑定到 Request 对象的所有变量都被发送并定义为服务器执行上下文中的外部变量。

XCC 允许您创建 XdmNodes 和 XdmSequences,以及 XdmAtomic 值。但是,在最初的 XCC 版本中,这种类型的值可能不会绑定为外部变量,因为 MarkLogic Server 还不能接受它们。预计未来版本会提供此功能。

由于XdmNode不支持,我想它的子类 XdmElement 也不支持。所以这些类只对响应有用,对请求没有用。错误消息可能需要改进。

您可以使用 传递 XML 字符串setNewStringVariable,然后调用xdmp:unquote您的 XQuery 模块。请注意,它xdmp:unquote返回一个文档节点,因此/*XPath 步骤产生它的根元素。

declare variable $xml-string as xs:string external ;
declare variable $criteria as element(criteria) := xdmp:unquote($xml-string)/* ;
....
于 2012-11-16T21:30:26.160 回答