ОК, так что сначала вы должны получить часть XML. Предполагая, что заголовок и XML являются символьными данными, а заголовок имеет фиксированную длину, я бы, вероятно, использовал комбинацию
dbms_lob.converttoclob, чтобы превратить каплю в сгусток
dbms_lob.substr для получения сгустка с частью XML
xmltype.createXML (clob), чтобы назначить XML для вашего xmltype
xmltype.extract для применения вашего выражения xpath
Если заголовок не является символьными данными, вы все равно можете использовать dbms_lob.substr, но он вернет RAW, который вам нужно будет преобразовать. Если длина заголовка не фиксирована, вы можете найти местоположение
Итак, основываясь на комментариях, используйте что-то вроде этого, чтобы создать clob, который имеет то, что вы хотите, где offset - это количество байтов до начала вашего фактического XML. Модифицируйте, чтобы передать ваш блоб или клоб. Затем примените ваш xpath в конце вместо моего dbms_output.
declare
v_buffer varchar2(32767);
v_offset integer := 5;
v_xml xmltype;
v_clob clob;
v_input clob := 'xxxx<?xml version="1.0" encoding="UTF-8"?><test>This is a test</test>';
i integer := 0;
begin
dbms_lob.createtemporary (v_clob,true);
v_buffer := dbms_lob.substr(v_input,32767,v_offset);
while length (v_buffer) > 0 loop
v_clob := v_clob || v_buffer;
i := i + 1;
v_buffer := dbms_lob.substr(v_input,32767, v_offset + i * 32767);
end loop;
dbms_output.put_line ('x'||v_clob||'x');
v_xml := xmltype.createXML (v_clob);
dbms_lob.freetemporary (v_clob);
dbms_output.put_line (v_xml.getclobval);
end;