如何使用 Xquery 以 XML 示例中表达的方式修改所有想要的属性值?
我正在使用 Basex 7.6 Xquery 和 XML 数据库引擎。到目前为止,我的目的只是用它处理 XML 文件。
我已经拥有的那个结构:
<address ref="file1" title="title1">
<address ref="file1.1" title="title1.1">
<address ref="file1.1.1" title="title1.1.1"/>
</address>
<address ref="file1.2" title="title1.2">
<address ref="file1.2.1" title="title1.2.1"/>
<address ref="file1.2.2" title="title1.2.2">
<address ref="file1.2.2.1" title="title1.2.2.1"/>
<address ref="file1.2.2.2" title="title1.2.2.2"/>
</address>
</address>
</address>
<address ref="file2" title="title2"/>
但我需要如下:
<address ref="mydir/file1" title="title1">
<address ref="mydir/file1.1" title="title1.1">
<address ref="mydir/file1.1.1" title="title1.1.1"/>
</address>
<address ref="mydir/file1.2" title="title1.2">
<address ref="mydir/file1.2.1" title="title1.2.1"/>
<address ref="mydir/file1.2.2" title="title1.2.2">
<address ref="mydir/file1.2.2.1" title="title1.2.2.1"/>
<address ref="mydir/file1.2.2.2" title="title1.2.2.2"/>
</address>
</address>
</address>
<address ref="mydir/file2" title="title2"/>
我已经设法以我想要的方式更改了第一个元素,但仍然无法以 Xquery 引擎接受的方式正确处理它。
我已经用 BaseX 7.6 中的这段代码更改了第一个元素,但我还没有弄清楚如何将它应用于所有元素。
copy $c :=
(<address ref="file1" title="title1">
<address ref="file1.1" title="title1.1">
<address ref="file1.1.1" title="title1.1.1"/>
</address>
<address ref="file1.2" title="title1.2">
<address ref="file1.2.1" title="title1.2.1"/>
<address ref="file1.2.2" title="title1.2.2">
<address ref="file1.2.2.1" title="title1.2.2.1"/>
<address ref="file1.2.2.2" title="title1.2.2.2"/>
</address>
</address>
</address>
(:<address ref="file2" title="title2"/> WHY IS THIS NOT BY THE WAY ACCEPTED?:)
)
modify (
replace value of node $c/@ref with concat('mydir/', $c/@ref)
)
return $c
关于我试图解决这个问题的方式的信息可以在这里找到:http: //docs.basex.org/wiki/XQuery_Update#Non-Updating_Expressions
我觉得 BaseX 是做这件事的好工具。我只是不知道该怎么做。我认为递归在这种情况下也是答案。由于我的经验不足,我仍然无法弄清楚。
提前致谢!