DOMXpath básico, pode estar errado? (re: verifique o espaço de nome de input sempre)

Estou usando um domDocument interno em uma class, $this->doc->dom , e eu acho que está ok porque $this->doc->dom->saveXML() funciona e mostra meu XML, algo como

      04   ... 

E quando eu uso

  $xpath = new DOMXpath($this->doc->dom); $elements = $xpath->query('//link'); 

nenhum erro relatado … Mas, sem elementos (!),

  print $elements->length; 

mostre 0 (zero). Esse é o problema , e para mim é um DomDocument BUG: o elemento está lá!


Edite para adicionar mais pistas …

Quando eu faço algo semelhante com getElementsByTagName() ele funciona (!), Portanto, não é um problema com o $this->doc->dom .

  $test = $this->doc->dom->getElementsByTagName('link'); print $test->length; // OK, not zero, returns 1! 

Não é um “bug do DomDocument”.

Soluções simples

Consolidando os comentários postados.

Registre o namespace

(Resposta @PaulT) A raiz (tag html ) tem um espaço para nome declarado, xmlns="http://www.w3.org/1999/xhtml" . Com registerNamespace() você pode registrá-lo, com um apelido arbitrário (xx), então faça uma consulta correta

 $xpath->registerNamespace('xx', "http://www.w3.org/1999/xhtml"); $xpath->query('//xx:link'); 

Remover o atributo namespace da raiz

Eu filtrai minha input, então mudou para

     04   ...  

agora está funcionando como eu esperava, sem necessidade de “malditos namespaces”.

Depuração do XPath

(Resposta @RolandoIsidoro) Quando em dificuldade em casos como esses, experimente uma ferramenta como freeformatter.com/xpath-tester.html . No seu exemplo, ele lança um erro que o levaria à solução:

O URI do namespace padrão (sem prefixo) para XPath é sempre ” e não pode ser redefinido para ‘ http://www.w3.org/1999/xhtml