避免重新声明Xquery中的事务

时间:2013-08-07 16:18:30

标签: transactions xquery marklogic

鉴于:

let $name := '751-1500'    
return xdmp:node-delete(doc(concat('/', $name, '.xml'))//foo);

let $name := '751-1500'
return xdmp:node-delete(doc(concat('/', $name, '.xml'))//bar);

let $name := '751-1500'
return xdmp:node-delete(doc(concat('/', $name, '.xml'))//baz);

如何避免重新声明$ name?

2 个答案:

答案 0 :(得分:3)

在一次交易中,有更简单的方法,但这应该有效(未经测试)

let $name := '751-1500'     
let $doc := doc(concat('/', $name, '.xml'))
return 
(xdmp:node-delete($doc//foo),
 xdmp:node-delete($doc//bar),
 xdmp:node-delete($doc//baz))

答案 1 :(得分:1)

使用单独的交易我不确定有一个很好的方法来做到这一点。但是您可以将变量声明为外部变量。它仍然需要多次声明,但您只需在通过xdmp:invoke(或xdmp:eval)调用时分配一次:

declare variable $name as xs:string external ;
xdmp:node-delete(doc(concat('/', $name, '.xml'))//foo);

declare variable $name as xs:string external ;    
xdmp:node-delete(doc(concat('/', $name, '.xml'))//bar);

declare variable $name as xs:string external ;
xdmp:node-delete(doc(concat('/', $name, '.xml'))//baz);

然后,您可以使用具有不同值的invoke多次调用此模块:

xdmp:invoke('delete-nodes.xqy', (xs:QName('name'), '751-1500')),
xdmp:invoke('delete-nodes.xqy', (xs:QName('name'), '751-1501')),
xdmp:invoke('delete-nodes.xqy', (xs:QName('name'), '751-1502'))

如果您不想要额外的模块,可以将其全部包含在接受$name参数的函数中,然后使用xdmp:eval