2012-11-27 19 views
6

Mam kilka dokumentów, na których xdmp:node-replace() nad niektórymi elementami nie działa. Istnieje inny zestaw dokumentów, które są prawie podobne do tych, które mają problem, ale xdmp:node-replace działa na nich doskonale. Wypróbował wszystkie możliwości, które mogły pójść źle, ale na próżno. Przeczytaj, gdzie ta funkcja xdmp:node-replace nie działa na "w elementach pamięci".Co to są elementy pamięci w marklogic?

Aby sprawdzić, czy problem dotyczy "w elementach pamięci", chcę wiedzieć, co to dokładnie jest.

Każde światło na to byłoby bardzo pomocne

Odpowiedz

6

Wszystko zbudowane w zapytaniu jest elementem w pamięci. Na przykład ten XQuery uzyskuje się element w pamięci:

<test/> 

Niektóre funkcja wywołuje również powrót elementów pamięci: xdmp:unquote jest oczywistym przykładem. Każdy węzeł, który nie pochodzi z bieżącej bazy danych, będzie traktowany jako węzeł w pamięci.

To zapytanie daje element bazy danych (jeśli istnieje), które mogą być modyfikowane za pomocą xdmp:node-replace:

doc('fubar')/test 

Jest to typowy błąd w pamięci aktualizacja:

xdmp:node-replace(<x/>, <y/>) 

Z MarkLogic 6.0 -1.1, kod błędu to XDMP-UPCONSTNODES.

6

Jeśli chcesz zaktualizować w pamięci węzłów, jak gdyby były one w bazie danych przy użyciu podobnych wywołań funkcji, istnieje biblioteka narzędziowy, który to robi:

https://github.com/marklogic/commons/tree/master/memupdate

Biblioteka Główna również statki z MarkLogic serwer pod App Usługi:

appservices/utils/w-mEM-update.xqy

+0

na nieco bardziej zoptymalizowanej wersji tej biblioteki, zobacz: https://github.com/ryanjdew/XQuery-XML-Memory-Operations – grtjn

2

Jeśli urządzenie pracuje z in memory elements importu następujący moduł

import module namespace mem = "http://xqdev.com/in-mem-update" at "/MarkLogic/appservices/utils/in-mem-update.xqy";

Zamiast xdmp:node-replace można użyć mem:node-replace(<x/>, <y/>)