DOMNode オブジェクト (DOMNode::cloneNode) のクローンを作成しようとすると、さまざまな環境で実行すると矛盾が発生します。具体的には、クローンが nodeName プロパティを出力するときに名前空間をコピーできません。
$cloneNode = $origNode->cloneNode(true);
echo("old node name = " . $origNode->nodeName);
echo("new node name = " . $cloneNode->nodeName);
結果 (ローカル - Mac OS)
"古いノード名 = 名前空間:Hello"
"新しいノード名 = 名前空間:Hello"
結果 (local - centos) :
"古いノード名 = 名前空間:Hello"
"新しいノード名 = Hello"
ノードで何かを行う前に、名前空間を DOMXPath::registerNamespace に登録します。
アップデート
問題のある行 ($origNode->parentNode->removeChild( $origNode );) を見つけました。これを削除すると、クローンは関係なく期待どおりに動作します。ただし、この行を維持しても、環境によって異なる結果が得られます。例:
<?php
$string = '<?xml version="1.0" encoding="UTF-8"?>
<ns:Root xmlns:ns="http://google.com/">
<ns:Hello>
<ns:World/>
</ns:Hello>
</ns:Root>';
$dom = new \DOMDocument();
$dom->loadXML($string);
$xpath = new \DOMXPath($dom);
$rootNamespace = $dom->documentElement->lookupNamespaceUri('ns');
$xpath->registerNamespace('ns', $rootNamespace);
$parentNode = $xpath->query('//ns:Hello')->item( 0 );
$origNode = $xpath->query('//ns:World')->item( 0 );
$origNode->parentNode->removeChild($origNode);
$newNode = $origNode->cloneNode( true );
echo("old node name = " . $origNode->nodeName) . PHP_EOL;
echo("new node name = " . $newNode->nodeName) . PHP_EOL;
?>