Как скопировать / клонировать узел в Marklogic XQuery

Я пишу код, который должен возвращать измененную версию узла XML без изменения исходного узла в родительском документе.

Как я могу скопировать / клонировать узел, чтобы исходный контекст не был связан / не затронут им? Я не хочу, чтобы изменения, внесенные в этот узел, изменили исходный узел в родительском документе, только копию, которую возвращает моя функция.

То, что я ищу, будет очень похоже на то, что cts: highlight делает внутренне:

Возвращает копию узла, заменяя любой текст, соответствующий запросу, указанным выражением. Вы можете использовать эту функцию, чтобы легко выделить любой текст, найденный в запросе. В отличие от fn: replace и других строковых функций XQuery, которые соответствуют литеральному тексту, cts: highlight сопоставляет все термины, соответствующие поиску, включая совпадения по корню или совпадения с разными заглавными буквами. [marklogic docs> cts: highlight]


person Fateh Khalsa    schedule 13.06.2017    source источник


Ответы (3)


Самый простой способ создать клон / копию узла - использовать вычисляемый конструктор узла документа.:

document{ $doc }

Если вы клонируете узел, который не является document-node(), и не хотите document-node(), а просто клон исходного node(), то вы можете XPath выбрать этот клонированный узел из нового document-node():

document{ $foo }/node()
person Mads Hansen    schedule 14.06.2017

Просто для полноты: в общем, стандартное средство обновления XQuery имеет выражения копирования-изменения, которые явно выполняют копирование. Без изменений это похоже на явное клонирование.

copy $node := $foo
modify ()
return $node

Я не уверен, поддерживает ли MarkLogic этот синтаксис или нет. Насколько мне известно, для обновлений он использует собственную библиотеку функций.

person Ghislain Fourny    schedule 14.06.2017
comment
К сожалению, нет, хотя github.com/ryanjdew/XQuery-XML-Memory-Operations довольно близко .. - person grtjn; 15.06.2017

XML-узлы в памяти не подлежат непосредственному изменению. Вместо этого вы вносите желаемые изменения при создании нового узла. Если вы знаете XSLT, это может быть хорошим способом сделать это. Если нет, вы можете использовать технику XQuery, называемую рекурсивным спуском.

person Dave Cassel    schedule 15.06.2017