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

通过XCC将XQuery xml元素作为外部变量传递给Marklogic,xquery,marklogic,Xquery,Marklogic,我们有一个相当简单的XQuery和Groovy代码,如下所示。 Xquery代码: declare variable $criteria as element(criteria) external ; <scopedInterventions>{ $criteria/equals/field }</scopedInterventions> 将变量$criteria声明为元素(条件)外部; { $criteria/equals/字段 } 下面是试图调用它的测试代码 d

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

declare variable $criteria as element(criteria) external ;

<scopedInterventions>{
$criteria/equals/field
}</scopedInterventions>
将变量$criteria声明为元素(条件)外部;
{
$criteria/equals/字段
}
下面是试图调用它的测试代码

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()
}
def uri=新uri(“xcc://admin:admin@本地主机:8001“)
def contentSource=ContentSourceFactory.newContentSource(uri)
def request=session.newModuleInvoke(“ourQuery.xqy”)
def标准=
"""
地位
草案
"""
request.setNewVariable(“标准”,ValueType.ELEMENT,标准);
session.submitRequest(请求).asString()
}
我们在执行时遇到此错误:

原因:com.marklogic.xcc.exceptions.XQueryException:XDMP-LEXVAL: xs:QName(“element()”)--无效的词法值“element()”[会话: user=admin,cb={default}[ContentSource:user=admin,cb={none} [提供者:地址=localhost/127.0.0.1:9001,池=1/64]][客户端: XCC/5.0-3,服务器:XDBC/5.0-3]expr:xs:QName(“element()”)位于 com.marklogic.xcc.impl.handlers.ServerExceptionHandler.HandlerResponse(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.GetScopedInterventionByCriteria(ScopedInterventionService.groovy:20) ... 还有一个

任何帮助都将不胜感激。

有答案,我想:

通过查询传递变量

变量可以绑定到请求对象。当执行请求 与会话一起发布到服务器。所有 当前绑定到请求对象的变量将随和一起发送 在服务器的执行上下文中定义为外部变量

XCC允许您创建XdmNodes和XDMSequence,以及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)/* ;
....

Irina,你确定XQuery代码与产生错误的代码相同吗?错误消息
XDMP-LEXVAL:xs:QName(“element()”)--无效的词法值“element()”
看起来可能完全来自其他地方。8001也是正确的端口吗?这将是非常奇怪的,因为通常管理服务器是8001。嗨,Michael,你是对的,端口是9001(我替换了变量)。如果我更改代码以接受字符串变量,错误就会消失,因此我无法确定是代码产生了错误。