2017-06-13 3 views
3

Ich schreibe Code, der eine geänderte Version eines XML-Knotens zurückgeben muss, ohne den ursprünglichen Knoten im übergeordneten Dokument zu ändern.Wie kopiere/klone ich einen Knoten in Marklogic XQuery

Wie kann ich den Knoten kopieren/klonen, so dass der ursprüngliche Kontext nicht mit ihm verbunden ist? Ich möchte nicht, dass Änderungen an diesem Knoten den ursprünglichen Knoten im übergeordneten Dokument ändern, nur in die Kopie, die meine Funktion zurückgibt.

Was ich suche, was auch immer cts sehr ähnlich sein würde: Highlight wird intern tun:

Gibt eine Kopie des Knotens, einen beliebigen Text ersetzt die Abfrage mit dem angegebenen Ausdruck entsprechen. Sie können diese Funktion verwenden, um einfach den in einer Abfrage gefundenen Text hervorzuheben ( ). Anders als fn: replace und andere XQuery-String-Funktionen, die literalen Text entsprechen, cts: highlight entspricht jeder Begriff, der der Suche entspricht, einschließlich Stielted Matches oder Übereinstimmungen mit unterschiedlicher Großschreibung. [marklogic docs > cts:highlight]

Antwort

6

Der einfachste Weg, um einen Klon/Kopie eines Knotens zu erstellen, ist die computed document node constructor zu verwenden:

document{ $doc } 

Wenn Sie einen Knoten klonen, der kein document-node() ist, und wollen nicht ein document-node(), nur ein Klon des ursprünglichen node(), dann können Sie XPath, dass geklonte Knoten aus dem neuen document-node() wählen:

document{ $foo }/node() 
0

Just for comp Leteness: Im Allgemeinen verfügt die XQuery Update Facility über Copy-Modify-Ausdrücke, die explizit eine Kopie ausführen. Ohne Modifikationen ist dies wie explizites Klonen.

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

Ich bin mir nicht sicher, ob MarkLogic diese Syntax unterstützt oder nicht. Soweit ich weiß, verwendet es eine eigene Funktionsbibliothek für Updates.

+0

Leider nicht, obwohl https://github.com/ryanjdew/XQuery-XML-Memory-Operations ziemlich nah .. – grtjn

0

In-Memory-XML-Knoten sind nicht direkt modifizierbar. Stattdessen nehmen Sie die gewünschten Änderungen vor, während Sie einen neuen Knoten erstellen. Wenn Sie XSLT kennen, kann das ein guter Weg sein. Wenn nicht, können Sie eine XQuery technique called recursive descent verwenden.

Verwandte Themen