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

How do I insert a node as first element within a for loop?

我收到以下错误:

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

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

我觉得我的代码遵循 examples 我在网上看到的代码,但显然我有问题。

如何插入带有 for 循环的节点?[​​=16=]

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>

您似乎想要创建一个新的结果集:您在这里根本不需要 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>

[我已经回答了 "offline",但为了参考,我也把我的建议放在这里]

我认为您需要的是复制-修改-return 表达式,这就是您创建更新副本的方式。

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>