Saya pikir Anda dapat menghindari masalah dengan mengganti teks kosong dengan nilai sementara, memperbarui semua teks lainnya, dan kemudian mengganti nilai sementara dengan nol.
Saya tidak mengerti XPath, mungkin ada cara yang jauh lebih baik untuk melakukan ini, tetapi ini tampaknya berhasil:
SELECT
--#3: Replace the temporary value with null, this keeps the start and end tag
UpdateXML(
--#2: Replace everything but the temporary value
UpdateXML(
--#1: Replace empty text with a temporary value
UpdateXML(xmlData, '/TEST/VALUE[not(text())]', '<VALUE>TEMPORARY VALUE</VALUE>')
,'/TEST/VALUE[text()!="TEMPORARY VALUE"]/text()', 'hello')
,'/TEST/VALUE[text()="TEMPORARY VALUE"]/text()', null) examle
FROM (SELECT XMLType('<TEST><VALUE>hi</VALUE><VALUE>hola</VALUE><VALUE></VALUE></TEST>') as xmlData FROM DUAL);