0

鉴于:

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?

4

2 回答 2

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))
于 2013-08-07T18:40:52.427 回答
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改为使用的函数中。

于 2013-08-07T17:07:13.787 回答