Anda perlu mengubah baris
testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(n);
untuk
testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(DBMS_XMLDOM.getFirstChild(n));
Dalam XML DOM, elemen tidak memiliki 'nilai' untuk dibicarakan. Node elemen berisi node Teks sebagai anak, dan node inilah yang berisi nilai yang Anda inginkan.
EDIT (menanggapi komentar Tomalak):Saya tidak mengetahui fungsi apa pun di DBMS_XMLDOM untuk mendapatkan nilai gabungan dari semua simpul teks anak dari suatu elemen. Jika itu yang Anda butuhkan, maka Anda mungkin perlu menggunakan sesuatu seperti fungsi berikut:
CREATE OR REPLACE FUNCTION f_get_text_content (
p_node DBMS_XMLDOM.DOMNode
) RETURN VARCHAR2
AS
l_children DBMS_XMLDOM.DOMNodeList;
l_child DBMS_XMLDOM.DOMNode;
l_text_content VARCHAR2(32767);
l_length INTEGER;
BEGIN
l_children := DBMS_XMLDOM.GetChildNodes(p_node);
l_length := DBMS_XMLDOM.GetLength(l_children);
FOR i IN 0 .. l_length - 1 LOOP
l_child := DBMS_XMLDOM.Item(l_children, i);
IF DBMS_XMLDOM.GetNodeType(l_child) IN (DBMS_XMLDOM.TEXT_NODE, DBMS_XMLDOM.CDATA_SECTION_NODE) THEN
l_text_content := l_text_content || DBMS_XMLDOM.GetNodeValue(l_child);
END IF;
END LOOP;
RETURN l_text_content;
END f_get_text_content;
/