Учитывая ответ Кристиана Грюна в списке рассылки BaseX , это выполнимо, когда добавляемый узел определяется в операторе XQuery Update и, следовательно, может быть улучшен с помощью {enclosed expression}
* 1004. * до вставка:
Вы можете указать счетчик атрибутов в вашем XML-файле / базе данных
и увеличивайте его каждый раз, когда вы вставляете элемент. Просто
Пример:
Input.xml:
<root count="0"/>
insert.xq:
let $root := doc('input.xml')/root
let $count := $root/@count
return (
insert node <node id='{ $count }'/> into $root,
replace value of node $count with $count + 1
)
Мне не удалось добиться того же с внешним org.w3c.dom.Document
, созданным в Java и добавленным в базу данных XML с использованием XQJ и declare variable $doc external
. Здесь может возникнуть искушение обновить данные «автоинкремента» после добавления документа. Однако модель обработки определяет, что изменения не будут видны до тех пор, пока все команды не будут поставлены в очередь ( Pending Update List ). Следовательно, новый документ или узел по определению просто не виден для обновлений в том же выражении FLWOR. Итак:
db:add('db1', '<counters comment-id="0"/>', 'counters')
... с последующим повторением следующих действий НЕ будет работать:
let $doc := document{ <note id=""><text>Hello world</text></note> }
let $count := /counters/@comment-id
return (
db:add('db1', $doc, 'dummy'),
replace value of node $count with $count + 1
for $note in /note[@id='']
return replace value of node $note/@id with $count (: WRONG! :)
)
Выше, последний вставленный документ всегда будет иметь <note id="">
и не будет обновляться, пока не будет добавлен следующий документ. (Кроме того, он не будет работать, если существует несколько документов с <note id="">
.)
Хотя в приведенном выше примере можно успешно удалить часть for $note in ...
и использовать:
let $doc := document{ <note id="{ $count }"><text>Hello world</text></note> }
... мне не повезло, установив <note id="{ $count }">
в документе в коде Java, , поскольку это вложенное выражение не будет заменено тогда .
Наконец, некоторые состояния для аналогичных решений :
[...] плохо работает, так как блокирует одновременные обновления. Вам следует рассмотреть возможность использования xdmp: random () для генерации 64-битного случайного числа для вашего уникального идентификатора.
В нашем случае идентификатор также будет использоваться в URL; тогда не слишком приятно
См. Также XRX / идентификатор файла автоинкремента и Использование XQuery для возврата идентификаторов документа .