मुझे लगता है कि आप खाली टेक्स्ट को अस्थायी मान से बदलकर, अन्य सभी टेक्स्ट को अपडेट करके और फिर अस्थायी मान को शून्य से बदलकर समस्या से बच सकते हैं।
मुझे XPath की समझ नहीं है, ऐसा करने का शायद एक बेहतर तरीका है, लेकिन यह काम करता प्रतीत होता है:
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);