使用 Xquery 将元素作为子元素插入现有 XML 中

Tus*_*nne 1 xml xquery

我是 Xquery 的新手。我正在处理一些需要将新的 XML 元素插入到现有 XML 中的事情。

前任:

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Run Code Online (Sandbox Code Playgroud)

上面的 xml 需要通过添加新的 Element 地址来更新。

<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    <address>Address</address>
</note>
Run Code Online (Sandbox Code Playgroud)

这需要使用 XQuery 来完成。

我参考了这个 stackoverflow 链接

请指教。

Mad*_*sen 5

XQuery 1.0 解决方案是使用递归类型切换函数:

declare function local:insert-address($nodes as node()*)
{
 for $node in $nodes
 return 
    typeswitch($node)
        case element(note)
            return 
                element { name($node) } {
                    $node/@*, 
                    local:insert-address($node/node()),
                    element address { "Address" }
                }
        case element()
            return 
                element { name($node) } {
                    $node/@*, 
                    local:insert-address($node/node())
                }
        default 
            return $node
};

let $doc := 
  <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>

return 
  local:insert-address($doc)
Run Code Online (Sandbox Code Playgroud)

根据您使用的 XQuery 引擎,如果您的处理器支持XQuery Update(如 Alexander Petrov 的答案)或自定义函数(如 MarkLogic 的xdmp:node-insert-child() ),则可能有更简单的解决方案。