Nie rozumiem jaka jest roznica w XPath miedzy ancestor a preceding. Moze
mi ktos wytlumaczyc?
Pozdr,
Ancestor to kolejne parenty (parent, parent parenta, az do documentElement).
Prececing, to wezly ktore wystapily w dokumencie "wczesniej" (patrzac
"liniowo", np. jak SAX'em) ale *bez* ancestorow.
sz.
Hm..
$ancestor = $xpath->query('//ancestor::*');
for($i=0; $i<$ancestor->length; $i++){
echo $ancestor->item($i)->nodeName."<br>";
}
i to samo dla:
$preceding = $xpath->query('//preceding::*');
Zwraca cale drzewo XML, niemal to samo, z tą różnicą, że $ancestor łapie
nazwe korzenia i nie drukuje pustych elementów.
przy: query('//ancestor::miejsce');
gdzie 'miejsce' jest zagniezdzone: korzen/adres/miasto/miejsce drukuje
tylko: miejsce.
Sadzilem, ze dostane wszystkie parenty, czyli wspomniane korzen, adres,
miasto..
Dalej nie rozumiem..
> Dalej nie rozumiem..
Bo pytasz o //ancestor::*
Co "uniewaznia" kontekst zapytania. Mozna powiedzec, ze ustawia go w
*kazdym* miejscu dokumentu. Mniej wiecej o cos takiego tymi dwoma slaszami
pytasz:
/descendant-or-self::*/ancestor::*
/descendant-or-self::*/preceding::*
sz.
> "klapek" <klap...@o2.pl> wrote in message
> news:huoerl$dq7$1...@inews.gazeta.pl...
>
>> Dalej nie rozumiem..
>
> Bo pytasz o //ancestor::*
>
> Co "uniewaznia" kontekst zapytania.
Tak też rozumiem, że // oznacza 'z dowolnego miejca', zwróciłem uwagę na
różnice między ancestor a preceding w kontekście takiego wywołania.
Natomiast zastanawia mnie dlaczego query('//ancestor::miejsce') nie wyłapuje
wszystkich rodziców. W moim rozumieniu w query wstawiłem: wybierz wszystkich
rodziców elementu 'miejsce', który znajduje się 'gdzieś tam' w dokumencie.
powinno być: query('//miejsce/ancestor::*')
Dzięki za pomoc!
Pozdrawiam,
klapek
> powinno być: query('//miejsce/ancestor::*')
Niekoniecznie. Nic nie wiadomo o wezle do ktorego wykonujesz zapytanie. W
implementacjach zapytanie xPath, to metoda *wezla*.
Jezeli do wezla "miejsce", to wystarczy po prostu "ancestor::*".
Jezeli pytasz wezla document/documentElement wtedy mozna w ten sposob, ale
przy regularnym i duzym pliku dla wszyskich //miejsce moze byc sprawdzane
czy nie ma jakiegos innego ancestora ;)
Obejrzyj dokladnie pliki, bo moze wystarczyc mniej mulace
"//miejsce[1]/ancestor::*"
sz.
Pozdrawiam,
klapek