2016-12-14 1 views
1

Я новичок в Xquery. Я работаю над тем, где мне нужно вставить новый XML-элемент в существующий XML.Вставить элемент в качестве дочернего элемента в существующий XML с помощью Xquery

Ex:

<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.

Я refered к this stackoverflow link

Пожалуйста посоветуйте.

ответ

3

раствор, 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 двигатель вы используете, могут быть более простые решения, если ваш процессор поддерживает XQuery Update, как ответ Александра Петрова, или пользовательские функции, такие как MarkLogic's xdmp:node-insert-child().

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 
Смежные вопросы