public static function toPO($xmlstr, XSLTProcessor $xslt = NULL) { if ($xslt != NULL) { //$doc = DOMDocument::loadXML($xmlstr); $doc = new DOMDocument(); $doc->loadXML($xmlstr, LIBXML_NOCDATA); // TEST: hay 252 $xpath = new DOMXPath($doc); $nodelist = $xpath->query('//cuerpo/personas/persona'); echo 'Hay ' . $nodelist->length . ' nodos persona<br/>'; $xmlstr = $xslt->transformToXML($doc); } if ($xmlstr === NULL) { echo 'la transformacion retorna NULL<br/>'; return null; } // DEBUG //FileSystem::write('archivo_transformado_alta_pac.xml', $xmlstr); // Tengo que cargar todas las clases de la aplicacion actual porque // se como se llaman, pero no se donde estan. YuppLoader::forceReload(); YuppLoader::loadModel(); // FIXME: no carga las clases del imp! //print_r(YuppLoader::getLoadedClasses()); // Parseo el XML (deberia tener el formato de toXML) $xml = simplexml_load_string($xmlstr); // TEST: hay 252! $arr = $xml->xpath('//IMPPersona '); echo "En el transformado hay " . count($arr) . " personas<br/>"; // Referencias a paths con objetos para resolver referencias por loops $pathObj = new ArrayObject(); // *** // TODO: ver si el nodo raiz es un objeto simple o una coleccion. // <personas type="collection" of="IMPPersona"> if (!empty($xml['type']) && $xml['type'] == 'collection') { // TEST: // 252 nodos! echo count($xml->children()) . "<br/>"; // nodes, parentAttr, path, pathObj $list_po = self::toPOCollection($xml->children(), '/' . $xml->getName(), $pathObj); // TEST: error hay 381 personas! echo "Hay " . count($list_po) . " en la lista de PO<br/>"; return $list_po; } // Para el primer nodo, la clase es el nombre del elemento $class = $xml->getName(); $po = self::toPOSingle($class, $xml, '', -1, $pathObj); // TODO: no necesito loop detection para no entrar en loops infinitos, // lo necesito para resolver referencias a nodos, y reflejarlo en el PO que estoy creando. //$loopDetection = new ArrayObject(); //self::toXMLSingle( $po, $xml_dom, $xml_dom, $recursive, $loopDetection ); /* if ($xslt === NULL) return $xml_dom->saveXML(); else return $xslt->transformToXML( $xml_dom ); */ //print_r($pathObj); return $po; }