为xquery marklogic中的节点值赋值

时间:2013-11-19 13:08:22

标签: xquery marklogic

我在

之类的变量中有 xml 格式
let $node := <root><a/></root>

我想为< a>

赋予价值

我正在使用marklogic 6,我想在 marklogic

的qconsole中运行此 xquery

2 个答案:

答案 0 :(得分:1)

根据您对$ node的处理方式,以及首先获得$ node值的位置,有几个选项。它基本上归结为内存更新或数据库更新。

如果要保留其他查询的更改,但这涉及存储和从数据库检索内容,则数据库更新很有用。 MarkLogic不支持XQuery Update语法,但它允许您存储内容。您可以使用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
    }

HTH!

答案 1 :(得分:0)

一般的想法是将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