如何在for循环中插入节点作为第一个元素?

时间:2016-07-02 09:12:35

标签: xquery basex

我收到以下错误:

XUST0001元素构造函数:不允许更新表达式。

尝试将插入节点时首先插入到$ c

我觉得我的代码跟随examples我在网上看到了,虽然显然我有些不对劲。

如何插入带有for循环的节点?

declare namespace db="http://basex.org/modules/db";
declare namespace file="http://expath.org/ns/file";
declare variable $form13FFileNumber as xs:string external;

let $data := db:open('13F')//data[contains(edgarSubmission/formData/coverPage/form13FFileNumber,$form13FFileNumber)]

let $fields := 

<form13FFile>
{
for $c in $data return 
insert nodes <b4>test</b4> as first into $c  
}
</form13FFile>

return file:write(concat('../OUT/' , $form13FFileNumber , '.xml'), $fields)

为了更清楚,我的xml看起来像

   <data>
     <first_Child>text</first_child>
   </data>
   <data>
     <first_Child>text</first_child>
   </data>

我希望它适应

<form13FFile>
    <data>
     <b4>test</b4>
     <first_Child>text</first_child>
    </data>
    <data>
     <b4>test</b4>
     <first_Child>text</first_child>
    </data>
</form13FFile>

2 个答案:

答案 0 :(得分:2)

您似乎想要创建一个新的结果集:您根本不需要XQuery更新!如果您想要更改现有文档,XQuery Update非常有用,但在构建新文档时根本不需要。

<form13FFile>
{
for $c in $data return 
<b4>test</b4>
}
</form13FFile>

或者如果你想坚持as first语义(我希望将来静态测试元素会改变),在循环之前反转$data

<form13FFile>
{
for $c in reverse($data) return 
<b4>test</b4>
}
</form13FFile>

答案 1 :(得分:1)

[我已经回答“离线”,但作为参考,我也在这里提出我的建议]

我认为你需要的是一个复制 - 修改 - 返回表达式,这就是你创建更新副本的方式。

let $fields :=
<form13FFile>
{
  for $c in $data
  return 
    copy $new-node := $c
    modify insert nodes <b4>test</b4> as first into $new-node
    return $new-node  
}
</form13FFile>
相关问题