Poniższy kod działa tak, jak się spodziewałem, tj. wyrzuca pspan: (czyli p, a zaraz za nim span)
  1. <?php
  2. $dom=new domdocument();
  3.  
  4. $f=$dom->createdocumentfragment();
  5.  
  6. $f->appendxml('<p id="a">test</p><span>test</span>');
  7.  
  8. $xpath = new DOMXPath($dom);
  9. $result=$xpath->query('.//*', $f);
  10.  
  11. foreach($result as $tag){
  12. echo $tag->nodeName;
  13. }
  14. ?>


Jednakże, gdy próbuję dobrać się do elementów, których id="a" spotyka mnie zawód:
  1. <?php
  2. $dom=new domdocument();
  3.  
  4. $f=$dom->createdocumentfragment();
  5.  
  6. $f->appendxml('<p id="a">test</p><span id="a">test</span>');
  7.  
  8. $xpath = new DOMXPath($dom);
  9. $result=$xpath->query('.//*[@id="a"]', $f);
  10.  
  11. foreach($result as $tag){
  12. echo $tag->nodeName;
  13. }
  14. ?>

Skrypt, pomimo moich oczekiwań nie wyświetla napisu p.

Czy jest to jakiś bug php, czy po prostu gdzieś popełniam błąd?

O dziwo, gdy obiekt o id równym a nie jest bezpośrednio dzieckiem #document-fragment - kod działa poprawnie:
  1. <?php
  2. $dom=new domdocument();
  3.  
  4. $f=$dom->createdocumentfragment();
  5.  
  6. $f->appendxml('<a><p id="a">test</p></a><span id="a">test</span>');
  7.  
  8. $xpath = new DOMXPath($dom);
  9. $result=$xpath->query('.//*[@id="a"]', $f);
  10.  
  11. foreach($result as $tag){
  12. echo $tag->nodeName;
  13. }
  14. ?>

Czyli wyświetla p.

Mój problem teoretycznie rozwiązuje takowe zapytanie, jednak nie jestem usatysfakcjonowany takim rozwiązaniem:
  1. <?php
  2. $result=$xpath->query('*[@id="a"]|*//*[@id="a"]', $f);
  3. ?>


Chciałem przeprosić osoby korzystające równocześnie z forumweb, czyli mojego forum domowego. Niestety na nim nie otrzymałem żadnej odpowiedzi.

Ps. dlaczego przed wszystkie cudzysłowy zostały wstawione znaki \ ? Bynajmniej nie ja jestem ich autorem.