Necesitas cambiar la línea
testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(n);
a
testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(DBMS_XMLDOM.getFirstChild(n));
En XML DOM, los elementos no tienen ningún "valor" del que hablar. Los nodos de elemento contienen nodos de texto como elementos secundarios, y son estos nodos los que contienen los valores que desea.
EDITAR (en respuesta al comentario de Tomalak):no conozco ninguna función en DBMS_XMLDOM para obtener el valor combinado de todos los nodos de texto secundarios de un elemento. Si eso es lo que necesita, es posible que deba usar algo como la siguiente función:
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;
/