Как создать супер XML узел - PullRequest
0 голосов
/ 06 марта 2020

У меня есть следующий 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>

Я бы хотел сгенерировать супер XML узел из этих topics так, чтобы конечный результат был единственным 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/, но мне не повезло.

1 Ответ

1 голос
/ 07 марта 2020

После изменения вашего ввода XML, чтобы сделать его действительным XML файлом с элементом root и такими закрывающими тегами

<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>

, вы можете объединить все подузлы <topic> элементы в одном <topic> элементе с этим XQuery:

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>

, что отличается от ожидаемого результата. Но поскольку вы не указали никаких правил для вывода, это так же хорошо, как и получается.

...