使用Xquery向现有XML中的元素添加属性

JPS

我需要使用XQuery将属性添加到响应XML的元素中。将以下XML作为输入,

<xyz:RootNode xmlns:abc="url1" xmlns:xyz="url2">
  <abc:OtherNodes/>
  <abc:messageHeader att1="val1" att2="val2">
       <abc:childNodes/>  
  </abc:messageHeader>
  <abc:OtherNodes/>
</xyz:RootNode>

需要一个XQuery是增加一个属性newAtt与价值的newval并给出了结果为,

<xyz:RootNode xmlns:abc="url1" xmlns:xyz="url2">
   <abc:OtherNodes/>
   <abc:messageHeader att1="val1" att2="val2" newAtt="newVal">
       <abc:childNodes/>  
  </abc:messageHeader>
  <abc:OtherNodes>
</xyz:RootNode>

每次消息头的属性数量可能会更改。因此,查询应添加一个新属性以及所有现有属性,并返回整个文档。

劳伦·卡兰德(Loren Cahlander)

请尝试以下方法:

xquery version "3.0";

module namespace foo="http://exist-db.org/apps/ns/foo";

declare function foo:process-node($node as node()?, $model as map()) {
    if ($node) then 
    typeswitch($node) 
        case text() return $node
        case element(messageHeader) return foo:messageHeader($node, $model)
        default return element { $node/name() } 
                               { $node/@*, foo:recurse($node, $model) }

    else () 
};

declare function foo:recurse($node as node()?, $model as map()) as item()* {
    if ($node) 
    then 
        for $cnode in $node/node() 
        return foo:process-node($cnode, $model) 
    else ()
};

declare function foo:messageHeader($node as node(), $model as map()) {
element { $node/name() } 
        { $node/@*, 
          attribute { 'newAtt' } { 'newVal' },
          foo:recurse($node, $model)
        }
};

然后,您在RootNode上调用foo:process-node

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章