2016-12-14 69 views
1

我是Xquery的新手。 我正在處理需要在現有XML中插入新XML元素的內容。使用Xquery在現有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來完成。

我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的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