Странное поведение DOMXPath::query

GRIG

Новичок
Подфорум про XML-технологии какой-то дохлый. Поэтому спрошу здесь.
Написал я вот такой тестовый скриптик:
PHP:
// Тестовый XML-документ в виде строки
$xml = '<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">'
       . '<S:Body>'
         . '<ns3:GetMessagesRs xmlns:ns3="http://www.some.my.host/my/path">'
           . '<messages>'
             . '<message>'
               . '<ns3:Query>'
                 . '<InternalKey>11111</InternalKey>'
               . '</ns3:Query>'
             .'</message>'
           . '</messages>'
         . '</ns3:GetMessagesRs>'
       . '</S:Body>'
     . '</S:Envelope>';
// Преобразуем эту строку в структуры DOM
  $xml_doc = new DOMDocument();
  $xml_doc->preserveWhiteSpace = false;
  $xml_doc->loadXML( $xml );
  $root = $xml_doc->documentElement;
// Готовим поиск по созданному документу
  $xpath = new DOMXPath( $xml_doc );
  $xpath->registerNamespace( "S", "http://schemas.xmlsoap.org/soap/envelope/" );
  $xpath->registerNamespace( "ns", "http://www.some.my.host/my/path" );
// Ищем первое, что нужно
  $answer = $xpath->query( "/S:Envelope/S:Body/ns:GetMessagesRs[1]" ); // - находит нормально
  $answer = $answer->Item( 0 );
// Ищем дальше вглубь
  $message = $xpath->query( "messages/message", $answer ); // находит нормально
  $message = $message->Item( 0 );
// Еще дальше вглубь - вариант 1
  $query1 = $xpath->query( "Query", $message ); // облом - ничего не найдено
// вариант 2
  $query2 = $xpath->query( "ns:Query", $message ); // вот теперь найдено
Почему обломался вариант 1? По идее, тег Query в исходном документе хоть и снабжен указанием на пространство имен, но это то же самое пространство, которое в этом месте документа принимается по умолчанию. Т.е. (по идее) влиять не должно.
 
Поведение как раз такое, какое и должно быть. Элемент принадлежит пространству имен http://www.some.my.host/my/path, которое в XPath присвоено префиксу ns. Теперь для доступа к элементу нужно его и указывать.
 

GRIG

Новичок
Поведение как раз такое, какое и должно быть. Элемент принадлежит пространству имен http://www.some.my.host/my/path, которое в XPath присвоено префиксу ns. Теперь для доступа к элементу нужно его и указывать.
Странно... По идее, элементы messages и message принадлежат тому же самому пространству имен, но при этом прекрасно ищутся без всякого префикса.
 
В xml-коде выше элементы messages и message не относятся ни к какому пространству имен. Поэтому в DOMXPath для них не нужно регистрировать пр. им.
Элемент относится к пространству имен, если ему присвоен префикс или если было объявлено пространство имен по умолчанию: <messages xmlns="http://some.ns">. Пространство имен по умолчанию распространяется на этот и все элементы ниже, кроме тех, которые имеют префикс.
 
Сверху