1

I am new to Xquery. I am working on something where I need to insert a new XML element into existing XML.

Ex:

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

The above xml needs to be updated by adding a new Element address.

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

This needs to be done using XQuery.

I refered to this stackoverflow link

Please Advise.

Community
  • 1
  • 1
Tushar Banne
  • 1,587
  • 4
  • 20
  • 38

2 Answers2

4

An XQuery 1.0 solution would be to use a recursive typeswitch function:

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)

Depending on what XQuery engine you are using, there may be more simple solutions if your processor supports XQuery Update like Alexander Petrov's answer, or custom functions such as MarkLogic's xdmp:node-insert-child().

Mads Hansen
  • 63,927
  • 12
  • 112
  • 147
1

Try this:

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
Alexander Petrov
  • 13,457
  • 2
  • 20
  • 49