Tôi nghĩ rằng bạn có thể tránh được sự cố bằng cách thay thế văn bản trống bằng giá trị tạm thời, cập nhật tất cả văn bản khác, sau đó thay thế giá trị tạm thời bằng giá trị rỗng.
Tôi không hiểu XPath, có lẽ có một cách tốt hơn nhiều để làm điều này, nhưng cách này có vẻ hiệu quả:
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);