Как использовать XQuery для обновления атрибута в базе данных BaseX XML?

Я использую BaseX для хранения данных XML с несколькими узлами item в следующем формате:

<root>
  <item id="Root" parent_id="0" type="folder">
    <content>
      <name>Root</name>
    </content>
  </item>

  <item id="One" parent_id="Root" type="file">
    <content>
      <name>First File in the Tree</name>
    </content>
  </item>

  <item id="Two" parent_id="Root" type="file">
    <content>
      <name>Second File in the Tree</name>
    </content>
  </item>
</root>

Я пытаюсь обновить parent_id на одном из узлов 'item' до атрибута id другого узла item.

Дерево перед выполнением выражения XQuery:

Корень
∟ Первый файл в дереве
∟ Второй файл в дереве

Я пытаюсь выяснить правильное выражение XQuery, чтобы изменить родителя одного из item с root на «один» item, так что мое дерево теперь выглядит так:

Дерево ожидаемого результата:

Корень
∟ Первый файл в дереве
    ∟ Второй файл в дереве

Поскольку этим управляет атрибут parent_id, я хочу обновить именно это.


person supersophisticated    schedule 16.11.2014    source источник


Ответы (1)


Если все, что вы хотите сделать, это обновить атрибут @parent_id, используйте простой запрос на обновление, например

  replace value of node //item[@id='Two']/@parent_id with 'One'

Но: на самом деле это не изменит дерево XML, а только то, которое вы представляете в XML (хотя я считаю, что именно об этом был ваш вопрос). Более похожий на XML подход к хранению дерева будет напрямую отображать дерево, которое вы хотите иметь, в XML:

<root>
  <item id="Root" type="folder">
    <content>
      <name>Root</name>
    </content>
    <item id="One" type="file">
      <content>
        <name>First File in the Tree</name>
      </content>
      <item id="Two" type="file">
        <content>
          <name>Second File in the Tree</name>
        </content>
      </item>
    </item>
  </item>
</root>

Или еще более лаконично, с той же информацией:

<folder id="Root" name="Root">
  <file id="One" name="First File in the Tree">
    <file id="Two" name="Second File in the Tree" />
  </file>
</folder>
person Jens Erat    schedule 16.11.2014