加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 如何将属性添加到节点的所有特定子节点

发布时间:2020-12-16 22:41:13 所属栏目:百科 来源:网络整理
导读:我有以下节点,我想在其中添加属性到所有添加节点. test addx1/add caddx2/add/c b att1="x"x/b/test 我试过了 functx:add-attributes($test,xs:QName('att1'),1) 它可以将属性添加到测试节点.但 当我尝试 functx:add-attributes($test/add,1) 它将属性添加到
我有以下节点,我想在其中添加属性到所有添加节点.

<test>
  <add>x1</add>
  <c><add>x2</add></c>
  <b att1="x">x</b>
</test>

我试过了

functx:add-attributes($test,xs:QName('att1'),1)

它可以将属性添加到测试节点.但

当我尝试

functx:add-attributes($test/add,1)

它将属性添加到第一个添加节点,但仅返回添加了属性的添加节点.然后,当我尝试使用$test //添加它时抛出错误.

当我尝试

for $add in $test//add 
   return functx:add-attributes($add,1)

它分别返回两个添加节点.现在,如何重构原始节点以仅将属性添加到指定节点.

解决方法

首先,我要指出,仅仅在内存中使用与更新数据库内容的方式有所不同.对于后者,您可以这样做:

for $add in $test//add
return
  xdmp:node-insert-child(
    $add,attribute atta1 { 1 }
  )

要在内存中更改它,这就是functx所做的,您将制作原始文件的副本,在构建副本时对副本进行更改.这称为递归下降,是一种非常常见的模式.我刚才写了一篇博文,显示了how to implement recursive descent,但基本上你会做一个类型开关,当遇到“add”元素时,会创建新属性.您可以使用functx功能.沿着这些方向的东西(未经测试):

declare function local:change($node) 
{ 
  typeswitch($node) 
    case element(add) return 
      functx:add-attributes($node,1)
    case element() return 
      element { fn:node-name($node) } { 
        $node/@*,$node/node() ! local:change(.)
      } 
    default return $node 
};

此代码假定add元素不会在其中添加元素;如果你愿意的话,你会想做第一种情况的第二种情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读