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

时间:2016-12-14 16:33:23

标签: xml xquery

我是Xquery的新手。 我正在开发一些我需要在现有XML中插入新XML元素的东西。

前:

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

需要通过添加新的元素地址来更新上述xml。

<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    <address>Address</address>
</note>

这需要使用XQuery完成。

我指的是this stackoverflow link

请告知。

2 个答案:

答案 0 :(得分:4)

XQuery 1.0解决方案是使用递归typeswitch函数:

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)

根据您使用的XQuery引擎,如果您的处理器支持像Alexander Petrov的答案那样XQuery Update,或者像MarkLogic {{3}这样的自定义函数,可能会有更简单的解决方案。 }。

答案 1 :(得分:1)

试试这个:

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

modify (insert node <address>Address</address> into $note)

return $note