Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ancestor vs preceding

5 views
Skip to first unread message

klapek

unread,
Jun 8, 2010, 10:03:14 PM6/8/10
to
Witam,

Nie rozumiem jaka jest roznica w XPath miedzy ancestor a preceding. Moze
mi ktos wytlumaczyc?

Pozdr,

szomiz

unread,
Jun 9, 2010, 2:56:49 AM6/9/10
to
"klapek" <klap...@o2.pl> wrote in message
news:humsp3$b1l$1...@inews.gazeta.pl...

> Witam,
>
> Nie rozumiem jaka jest roznica w XPath miedzy ancestor a preceding. Moze
> mi ktos wytlumaczyc?

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.


klapek

unread,
Jun 9, 2010, 12:17:55 PM6/9/10
to

> 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..

szomiz

unread,
Jun 9, 2010, 12:28:52 PM6/9/10
to
"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. 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

unread,
Jun 9, 2010, 1:52:22 PM6/9/10
to
szomiz wrote:

> "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.

klapek

unread,
Jun 9, 2010, 1:56:43 PM6/9/10
to
ok, już rozumiem:)

powinno być: query('//miejsce/ancestor::*')

Dzięki za pomoc!

Pozdrawiam,
klapek

szomiz

unread,
Jun 9, 2010, 4:09:21 PM6/9/10
to
"klapek" <klap...@o2.pl> wrote in message
news:huokkr$3e1$1...@inews.gazeta.pl...

> 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.


klapek

unread,
Jun 12, 2010, 11:29:10 AM6/12/10
to

W pliku miałem jeden węzeł 'miejsce' dlatego tak napisałem. Z tego co
próbowałem, jedynym sposobem żeby dostać rodziców to właśnie
'//miejsce/ancestor::*' natomiast nie wiem jak miałbym wywołać samo
'ancestor::*'.. chyba, że przez getElementsByTagName, a później z kontekstu
wywołać to query, zgaduję, nie próbowałem.

Pozdrawiam,
klapek

0 new messages