Hi,
in deinem zweiten Bespiel ist der Namespace mit dem Prefix "X" der Default-Namespace des Dokuments (da er im Root-Element definiert wurde).
Richtig, und?
Im ersten Beispiel gehört das Element "test" dem Namensraum ="http://foo" mit dem Prefix "x" an. Demnach sollte es mit /root/x:test anzusprechen sein.
Folgendes funktioniert auch wunderbar:
<?
$xml = '<?xml version="1.0" encoding="utf-8"?>
<root xmlns:x="http://foo">
<x:test/>
</root>';
$dom = new DOMDocument;
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
echo $xpath->query("/root/x:test")->length;
?>
So wie es aussieht verarbeitet PHP nur solche Namensräume, welche im root-Element definiert werden. So weit mir bekannt ist, darf man das aber in allen Elementen, zumindest habe ich in den W3C-Specs nichts Gegenteiliges gefunden, lasse mich aber gerne eines Besseren belehren.
Grüße
Thomas