CREATE OR REPLACE FUNCTION BE_P_CONTAR_NODOS_XML( xml_string IN VARCHAR2, tipo IN VARCHAR2, path_arreglo IN VARCHAR2) RETURN NUMBER AS sub_xml XMLType; --SUBXML SOLO CON EL ATRIBUTO Y EL VALOR indice NUMBER; --INDICE PARA CONCATENAR AL ELEMENTO n DEL ARREGLO path_buscar VARCHAR2(300); --XPATH DE BUSQUEDA existeNodo NUMBER; --INDICA SI ENCUENTRA EL NODO ESPECIFICO cantidad_nodos NUMBER; --NUMERO DE NODOS ENCONTRADOS xpath_nodo_principal VARCHAR2(200); Lv_mensajeError VARCHAR2(200); NAME_SPACE_NODO VARCHAR2(50) := 'xmlns="http://tempuri.org/"'; --NOMBRE DEL ESPACIO CON FORMATO XML PARA NODOS NAME_SPACE_GENERAL VARCHAR2(300) := 'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"'; XPATH_ENCABEZADO VARCHAR2(100) := '/soap:Envelope/soap:Body/child::node()'; -- EL XPATH ES GENERALEMNTE EN TODOS LOS REPONSE XML IGUAL A ESTE BEGIN cantidad_nodos := 0; SELECT xmltype(xml_string) INTO sub_xml from dual; --EL XPATH ES GENERALEMNTE EN TODOS LOS REPONSE XML IGUAL A ESTE xpath_nodo_principal := '/' || tipo || 'Response/' || tipo || 'Result/child::node()'; --SE EXTRAE LA RESPUESTA ELIMINANDO LOS ENCABEZADOS PRINCIPALES sub_xml := sub_xml.EXTRACT(XPATH_ENCABEZADO, NAME_SPACE_GENERAL); --EXTRAE EL CONTENIDO DE LA RESPUESTA IF(sub_xml IS NOT NULL) THEN --EXTRAE EL CUERPO DEL MENSAJE sub_xml := sub_xml.EXTRACT(xpath_nodo_principal, NAME_SPACE_NODO); LOOP indice := cantidad_nodos + 1; path_buscar := path_arreglo || '[' || TO_CHAR(indice) || ']'; existeNodo := sub_xml.EXISTSNODE(path_buscar, NAME_SPACE_NODO); IF (existeNodo = 0) THEN EXIT; ELSE cantidad_nodos := cantidad_nodos + 1; END IF; END LOOP; ELSE RETURN NULL; END IF; RETURN cantidad_nodos; END BE_P_CONTAR_NODOS_XML;