【问题标题】:MarkLogic - How to insert element into XMLMarkLogic - 如何将元素插入 XML
【发布时间】:2017-06-02 12:04:17
【问题描述】:

如何在 XML 中插入节点。

let $a := <a><b>bbb</b></a>)
return
      xdmp:node-insert-after(doc("/example.xml")/a/b, <c>ccc</c>);

预期输出:

<a><c>ccc</c><b>bbb</b></a>

请帮助获取输出。

【问题讨论】:

    标签: xquery marklogic xpath-2.0


    【解决方案1】:

    你应该使用xdmp:node-insert-before我相信以下方式:

    xdmp:document-insert('/example.xml', <a><b>bbb</b></a>);
    
    xdmp:node-insert-before(fn:doc('/example.xml')/a/b, <c>ccc</c>);
    
    fn:doc('/example.xml');
    
    (: returns <a><c>ccc</c><b>bbb</b></a> :)
    

    【讨论】:

      【解决方案2】:

      节点是不可变的,所以内存中的变异只能通过创建一个新副本来完成。

      副本可以使用原始未修改的包含节点:

      declare function local:insert-after(
          $prior as node(),
          $inserted as node()+
      ) as element()
      {
          let $container := $prior/parent::element()
          return element {fn:node-name($container)} {
              $container/namespace::*,
              $container/attribute(),
              $prior/preceding-sibling::node(),
              $prior,
              $inserted,
              $prior/following-sibling::node()
          }
      };
      
      let $a := <a><b>bbb</b></a>
      return local:insert-after($a//b, <c>ccc</c>)
      

      在内存中创建副本然后插入副本比在数据库中插入和修改文档要快。

      根据插入的文档数量,差异可能很大。

      有用于复制更改的社区库,但有时编写快速函数也很容易(必要时递归)。

      【讨论】:

        【解决方案3】:

        您可以使用以下代码将元素插入 XML:

        xdmp:node-insert-child(fn:doc('directory URI'),element {fn:QName('http://yournamesapce','elementName') }{$elementValue})
        

        这里我们使用fn:QName 删除添加节点中添加的xmlns=""

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多