是否有 basex 函数可以随机删除 XML 文件的部分内容?

Is there a basex function to randomly erase parts of an XML file?

我有一个包含 X 条注释的 XML 文件,我想随机编辑它以使其少于 X 条。对于实际问题:我有 40 个注释,我希望最终只有 7 个,随机选择这些注释。我的每个文件都有不同的原始注释数量,但我希望最后总是有七个。每个注释如下所示:

  <ndpviewstate id="1">
    <title>1</title>
    <details/>
    <coordformat>nanometers</coordformat>
    <lens>0.480769</lens>
    <x>21841504</x>
    <y>-2550259</y>
    <z>0</z>
    <showtitle>1</showtitle>
    <showhistogram>0</showhistogram>
    <showlineprofile>0</showlineprofile>
    <annotation type="circle" displayname="AnnotateCircle" color="#000000">
      <x>16893748</x>
      <y>79968</y>
      <radius>545000</radius>
      <measuretype>0</measuretype>
    </annotation>
  </ndpviewstate>

我是 XML 和 BaseX(版本 9.4.5)的绝对初学者,因此欢迎任何帮助。

提前致谢, 圭多

可以使用 XQuery update and this includes deleting nodes. XQuery update is best fitted to working on databases rather than files. However one can read a file, use transform with 在 BaseX 中更新 XML,然后保存结果

关于随机选择物品:我建议使用BaseX的random module

将这些放在一起并假设注释元素都在同一级别

(: return items from $seq after removing  $max items at random :)
declare function local:excess($seq,$max as xs:integer){
    random:seeded-permutation(random:integer(),$seq)
    =>subsequence($max+1)
};

let $f:=doc(".../file.xml")
let $updated:= $f transform with {   
                   delete node local:excess(/ndpviewstate/annotation,7)
                 }
return $updated