U moet de regel wijzigen
testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(n);
naar
testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(DBMS_XMLDOM.getFirstChild(n));
In XML DOM hebben elementen geen 'waarde' om van te spreken. Elementknooppunten bevatten tekstknooppunten als onderliggende knooppunten, en het zijn deze knooppunten die de gewenste waarden bevatten.
EDIT (in reactie op de opmerking van Tomalak):Ik ben niet op de hoogte van functies in DBMS_XMLDOM om de gecombineerde waarde van alle onderliggende tekstknooppunten van een element te verkrijgen. Als dat is wat je nodig hebt, dan moet je misschien iets als de volgende functie gebruiken:
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;
/