У меня есть документ, структурированный, как это:XQuery сравнить два документа и замену узлов с таким же именем
<INVT_DATA xmlns="http://www.mrbook.com/InventoryData">
<AUTHOR>...</AUTHOR>
<TITLE>...</TITLE>
<PUBLISHER>...</PUBLISHER>
</INVT_DATA>
Subchildren из INVT_DATA всегда являются элементами, а не текстовые узлы. Я хотел бы использовать XQuery для сравнения нового документа с той же структурой. Если подэлемент присутствует в новом и оригинальном, его следует заменить. Если подэлемент присутствует в новом, но не находится в старом, он должен быть добавлен к INVT_DATA.
Это XQuery, я думаю, будет работать, но это всегда кажется просто добавить узлы вместо:
declare namespace invtdata="http://www.mrbook.com/InventoryData";
copy $oldInvtData := $oldXml
modify
(
for $mpf in $newXml/invtdata:INVT_DATA/*
let $oldMpf := $oldInvtData/invtdata:INVT_DATA/*[name()=name($mpf)]
return if(exists($oldMpf)) then
replace node $oldMpf with $mpf
else insert node $mpf into $oldInvtData
)
return $oldInvtData
я искал другие подобные проблемы и нашли this, но это совсем немного излишним для чего Я хочу делать. Какие-либо предложения? Если это помогает, я использую XmlQuery из Oracle XML DB версии 11.2.0.3.
'name()' часто вызывает такие проблемы; он часто не возвращает префикс пространства имен, который вы ожидаете. Я бы попытался заменить его на 'localname()' и посмотреть, работает ли это. Если пространство имен имеет значение, вы всегда можете добавить другой предикат (или и), чтобы сравнить это. –