create local temp table tmp_xn_68149 as
-- explain analyze
select
    trg.kind,
    trg.dewey,
    trg.tagid,
    trg.value
from
    xml_node trg,
    xml_node xn
where
    xn.id = 68149 and
    _int_flagment(trg.dewey,xn.dewey);

create or replace view vw_tocat as
-- explain analyze
-- Element
select
    xn.dewey as dewey,
    1 as seq,
    '<' || xt.name as parsed_text
from
    tmp_xn_68149 xn,
    xml_tag xt
where
    xn.tagid = xt.tagid and
    xn.kind = '1'
union all
-- Attibute, namespace decl
select
    xn.dewey,
    xn.kind - 3,    -- att=2,ns=3
    case
        when xn.kind = '5' then
            ' ' || xa.name || '="' || xn.value || '"'
        else
            ' ' || ns.name || '="' || xn.value || '"'
    end
from
    tmp_xn_68149 xn left join xml_attribute xa using(tagid)
    left join xml_namespace ns using(tagid)
where
    xn.kind = '5' or xn.kind = '6'
union all
-- right delimiter(element)
select
    xn.dewey + 1,
    4 as seq,
    '>'
from
    tmp_xn_68149 xn
where
    xn.kind = '1'
union all
-- text,comment,pi
select
    xn.dewey,
    5,
    case
        when xn.kind = '2' then
            xn.value
        when xn.kind = '3' then
            '<!-- ' || xn.value || ' -->'
        else
            '<?' || pi.name || xn.value || '?>'
    end
from
    tmp_xn_68149 xn left join xml_pi pi using(tagid)
where
    xn.kind = '2' or xn.kind = '3' or xn.kind = '4'
union all
-- closing tag
select
    xn.dewey + 2147483647,
    6 as seq,
    '</' || xt.name || '>'
from
    tmp_xn_68149 xn,
    xml_tag xt
where
    xn.tagid = xt.tagid and
    xn.kind = '1'
order by dewey, seq;
-- explain analyze
select list(parsed_text) from vw_tocat;

/*
explain analyze
select toXML(68149)
*/