Mi sono letto la documentazione on-line di importNode() e non sono sicuro di comprenderne perfettamente il funzionamento.

So per certo che attachNode non funziona su nodi prelevati da xml diversi dal corrente, in questo caso bisogna usare importNode.

Da solo però non influisce sull'xml e quindi bisogna provvedere con attachNode.
In un'altro forum ho visto però che qualcuno eliminava il nodo importato, io ho tentato ma mi restituisce un'errore così l'ho eliminato.

Ho anche creato un metodo e sembra girare bene, anche se si inceppa di tanto in tanto.
Per ora la faccio girare solo su nodi importati visto che la uso per attaccare nodi "prototipo" che tengo in un'altro xml ma la dovrò anche far funzionare più tardi per nodi provenienti dallo stesso xml.

Me la sto ricontrollando potrebbe essere un po di tutto, ma a parte questa incerteza di funzionamento resta comunque il dubbio sul funzionamento di importNode.

Codice PHP:
    //metodo della classe xmlsource
    //accetta una xpath $query che indica il nodo dentro cui aggiungere figli, il nodo $newnode da aggiungere 
    //ed eventualmente il contesto $contextnode a cui riferire la ricerca xpath
    
function addnodes($query$newnode$contextnode=false){
        
//se $contextnode non è fornito viene settato di default a _root
        
if(!$contextnode){$contextnode=$this->root;}
            
//findnodes restituisce la nodelist dei nodi a cui aggiungere figli
            //generalmente poichè la xpath passata ricerca i nodi secondo un'attributo univoco viebne restituito uns olo nodo
            
$nodes $this->findnodes($query$contextnode);
            foreach(
$nodes as $node){
                
//importo il nodo
                
$impnode=$this->doc->importNode($newnodetrue);
                
//aggiungo il nodo alla struttura
                
$attcnode=$node->appendChild($impnode);
                
//se la classe è stata costruita indicando una proprietà come identificativo univo altero gli id della sorgente
                //per essere sicuro che non ce ne siano di doppi
                
if($this->uniid){
                    
$this->alterid('descendant-or-self::*[@'.$this->uniid.'] '$attcnode);
                }
                
//stampo l'id per controllare
                //se uso ripetutamente lo stesso metodo quando si inceppa mi restituisce lo stesso id dell'ultima operazione
                
print($attcnode->->getAttribute("id"));
            }
            
file_put_contents($this->xml$this->doc->saveXML());
    }