通过XCC将XQuery xml元素作为外部变量传递给Marklogic

Iri*_*nik 8 xquery marklogic

我们有一个相当简单的XQuery和Groovy代码如下.Xquery代码:

declare variable $criteria as element(criteria) external ;

<scopedInterventions>{
$criteria/equals/field
}</scopedInterventions>
Run Code Online (Sandbox Code Playgroud)

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

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()
}
Run Code Online (Sandbox Code Playgroud)

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

引起: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]] [客户端:XCC/5.0-3,服务器:XDBC/5.0-3] expr :xs:QName("element()")位于com.marklogic.xcc.impl.handlers.ServerExceptionHandler.handleResponse(ServerExceptionHandler.java:34)的com.marklogic.xcc.impl.handlers.EvalRequestController.serverDialog(EvalRequestController.java) :83)com.marklogic.xcc.impl.handlers.AbstractRequestController.runRequest(AbstractRequestController.java:84)at com.marklogic.xcc.impl.SessionImpl.submitRequestInternal(SessionImpl.java:373)at com.marklogic.xcc. impl.SessionImpl.submitRequest(SessionImpl.java:356)com.zynx.galen.dataaccess.MarkLogicUtilities.executeQueryWithMultipleXMLParameters(MarkLogicUtilities.groovy:52)at com.zynx.galen.repositories.ScopedInterventionService.getScopedInterventionsByCriteria(ScopedInterventionService.groovy:20)... 1 more

任何帮助都会受到高度赞赏.

mbl*_*ele 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:unquoteXQuery模块.请注意,xdmp:unquote返回文档节点,因此/*XPath步骤会生成其根元素.

declare variable $xml-string as xs:string external ;
declare variable $criteria as element(criteria) := xdmp:unquote($xml-string)/* ;
....
Run Code Online (Sandbox Code Playgroud)