如何生成超级XML节点

How to generate a super XML node

我有以下 XML 片段:

<topic>
  <data attribute1="1">some data 1<data>
  <data attribute1="1">some data x<data>
  <data2 type="sometype">some data 2</data2>
</topic>
<topic>
  <data attribute1="1">some data 1<data>
  <data attribute2="2">some data 2<data>
</topic>

我想从这些 topics 生成一个超级 XML 节点,这样最终输出是单个 topic 元素按属性、元素名称和值分组:

<topic>
  <data attribute1="1">some data 1<data>
  <data attribute1="1">some data x<data>
  <data2 type="sometype">some data 2</data2>
  <data attribute2="2">some data 2<data>
</topic>

实现此目标的最佳方法是什么?我可以使用 XQuery 吗?我一直在玩 http://basex.org/ 但运气不佳。

修改您的输入 XML 使其成为具有根元素和结束标记的有效 XML 文件后

<root>
    <topic>
        <data attribute1="1">some data 1</data>
        <data attribute1="1">some data x</data>
        <data2 type="sometype">some data 2</data2>
    </topic>
    <topic>
        <data attribute1="1">some data 1</data>
        <data attribute2="2">some data 2</data>
    </topic>
</root>

您可以使用此 XQuery 将 <topic> 元素的所有子节点合并到一个 <topic> 元素中:

let $file := doc("a.xml")/root 
return
  <topic>{for $item in $file/topic/* return $item}</topic>

它的输出是

<topic>
    <data attribute1="1">some data 1</data>
    <data attribute1="1">some data x</data>
    <data2 type="sometype">some data 2</data2>
    <data attribute1="1">some data 1</data>
    <data attribute2="2">some data 2</data>
</topic>

这与您的预期输出不同。但是因为您没有为输出指定任何规则,所以这已经很好了。