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

Posted

技术标签:

【中文标题】通过 XCC 将 XQuery xml 元素作为外部变量传递给 Marklogic【英文标题】:Passing XQuery xml element as external variable to Marklogic via XCC 【发布时间】:2012-11-05 12:34:37 【问题描述】:

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

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()" [会话: user=admin, cb=default [内容来源:user=admin, cb=none [提供者:地址=localhost/127.0.0.1:9001,池=1/64]]] [客户端: XCC/5.0-3, 服务器: XDBC/5.0-3] expr: xs:QName("element()") at 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) 在 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 更多

任何帮助将不胜感激。

【问题讨论】:

Irina,您确定 XQuery 代码与产生错误的代码相同吗?错误消息XDMP-LEXVAL: xs:QName("element()") -- Invalid lexical value "element()" 看起来完全来自其他地方。 8001也是正确的端口吗?这很奇怪,因为通常管理服务器是 8001。 嗨迈克尔,你是对的,端口是 9001(我替换了变量)。如果我将代码更改为接受字符串变量,错误就会消失,所以我很确定它是代码产生错误。 【参考方案1】:

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

通过查询传递变量

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

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

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

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

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

【讨论】:

以上是关于通过 XCC 将 XQuery xml 元素作为外部变量传递给 Marklogic的主要内容,如果未能解决你的问题,请参考以下文章

XQuery 术语

XQuery:返回元素的值而不是元素本身

XQuery FLWOR 表达式

xquery 转换在元素中创建空命名空间

如何将XQuery表达式标记为确定性? (为了保留来自XML值的计算列)

xquery和jquery的区别