我有一个xml格式的变量,如下
let $node := <root><a/></root>
我想给<a>。
我使用的是marklogic 6,我想在marklogic
根据您想对$node做什么,以及从哪里获得$node的值,有几个选项。它基本上可以归结为执行内存更新或数据库更新。
如果您想为其他查询保留更改,那么数据库更新是有用的,但这涉及到从数据库中存储和检索内容。MarkLogic不支持XQueryUpdate语法,但它允许您存储内容。您可以使用类似xdmp:document-insert
的函数来更新完整的文档,也可以使用类似于xdmp:node-insert-child
的函数来操作存储在数据库中的文档。
对于内存中的更新,您必须手动重建节点树。您可以使用dirkk引用的内存更新库,也可以自己使用。一个简单的方法是:
let $node := <root><a/></root>
let $a-value := "a value"
return
<root><a>{$a-value}</a></root>
或者更一般地说:
let $node := <root><a/></root>
let $a-value := "a value"
return
element { node-name($node) } {
$node/@*,
for $child in $node/node()
return
typeswitch ($child)
case element(a) return
element { node-name($node) } {
$node/@*,
$a-value
}
default return $child
}
啊!
一般的想法是将XML转换为您想要的形状。在最简单的情况下,您可以对所有内容进行硬编码:
let $node := <root><a/></root>
return <root><a>hello world</a></root>
当然,你可能想让事情变得更动态:
let $node := <root><a/></root>
let $value := "hello world"
return <root><a>{ $value }</a></root>
或
let $node := <root><a/></root>
let $value := "hello world"
return element { node-name($node) } {
<a>{ $value }</a>
}
或者
let $node := <root><a/></root>
let $value := "hello world"
return element { node-name($node) } {
$node/@*,
for $n in $node/node() return typeswitch($n)
case element(a) return element { node-name($n) } { $n/@*, $value }
default return $n
}
从那里,您可以进入递归类型切换表单或XSLT:请参阅http://docs.marklogic.com/guide/app-dev/typeswitch了解更多信息。