Для определения семантики функциональных update-выражений вида TRANSFORM INSERT и TRANSFORM DELETE выразим их через функциональные update-выражения вида TRANSFORM REPLACE, для которых семантика была определена выше.
В синтаксисе функциональных update-выражений вида TRANSFORM INSERT выражение expr($var1,$var2) определяет упорядоченную последовательность узлов, которые необходимо вставить. Для каждого целевого узла последовательности, возвращаемой выражением locpath2, результат вычисления выражения expr($var1,$var2) вставляется на позицию, определяемую ключевыми словами into, preceding и following. Если указано ключевое слово into, то узлы вставляются в начало последовательности дочерних узлов целевого узла. Если указано ключевое слово preceding, то узлы вставляются непосредственно перед каждым целевым узлом. В случае, если позиция определяется ключевым словом following, узлы вставляются после каждого целевого узла.
В синтаксисе функциональных update-выражений вида TRANSFORM DELETE выражение locpath2($var1) определяет последовательность узлов, которые подлежат удалению из результата. Узлы удаляются вместе со всем их содержимым.
Ниже приводится формальное определение функциональных update-выражений вида TRANSFORM INSERT и TRANSFORM DELETE через выражения вида TRANSFORM REPLACE.
1) INSERT INTO
for $var1 in locpath1 transform insert into $var2 in locpath2($var1) value expr($var1,$var2)
определяется, как
for $var1 in locpath1 transform replace $var2 in locpath2($var1) with element {node-name($var2)} {($var2/@*,expr($var1,$var2),$var2/*)}
2) INSERT PRECEDING
for $var1 in locpath1 transform insert preceding $var2 in locpath2($var1) value expr($var1,$var2)
определяется, как
for $var1 in locpath1 transform replace $var2 in locpath2($var1) with (expr($var1,$var2),$var2)
3) INSERT FOLLOWING
for $var1 in locpath1 transform insert following $var2 in locpath2($var1) value expr($var1,$var2)
определяется, как
for $var1 in locpath1 transform replace $var2 in locpath2($var1) with ($var2, expr($var1,$var2))
4) DELETE
for $var1 in locpath1 transform delete locpath2($var1)
определяется, как
for $var1 in locpath1 transform replace $var2 in locpath2($var1) with ()
Далее мы рассмотрим некоторые подходы к реализации функциональных update-выражений. Будут выделены возможные ограничения семантики таких выражений, которые позволяют упростить реализацию и сделать ее более эффективной.