xPath: porovnání hodnot dvou sousedních uzlů

ZAJDAN

  • *****
  • 2 092
    • Zobrazit profil
    • E-mail
xPath: porovnání hodnot dvou sousedních uzlů
« kdy: 21. 10. 2022, 18:41:32 »
Ahoj...
snažím se nastavit xPath kde se mají porovnat hodnoty ze dvou sousedních uzlů:
https://xsltfiddle.liberty-development.net/eiG7y3A/2
Pokud má následující dvojče 'Row' děti:
'Status' s hodnotou G 
'Order' s hodnotou stejnou jako v aktuálním Row/Order

ale nedaří se mi to. Díky za radu   
« Poslední změna: 21. 10. 2022, 20:14:41 od Petr Krčmář »
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.


Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
« Odpověď #1 kdy: 21. 10. 2022, 19:21:25 »
Neporozuměl jsem, co přesně chcete porovnávat, hledat nebo testovat. Ale:

Podmínky (v hranatých závorkách) se vyhodnocují vždy vzhledem k aktuálnímu uzlu. Takže

Kód: [Vybrat]
/ResultSets/ResultSet/Row[following-sibling::Status]
hledá od elementu Row sourozence typu Status, a takoví v tom XML určitě nejsou – Row má jako sourozence zase jen Row.

following-sibling neznamená „sourozenci“ a už vůbec ne „nejbližší sourozenec“, ale znamená to, že to, co je za dvojtečkou, se bude hledat na ose následujících sourozenců. Takže když jste na elementu Row, following-sibling::Row najde všechny následující elementy Row, které mají stejného rodiče. following-sibling::* najde všechny následující elementy (bez ohledu na typ), které mají stejného rodiče. following-sibling::*[1] najde nejbližší následující element, který má stejného rodiče. Atd.

Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
« Odpověď #2 kdy: 21. 10. 2022, 19:25:14 »
Chápu to tak, že chceš aktuální node se statusem F porovnat s následujícím a vypsat AHOJ, pokud ten má status=G a Order shodný s aktuálním. Výraz by pak tedy vypadal asi takhle:

Kód: [Vybrat]
/ResultSets/ResultSet/Row[Status='F'][following-sibling::Row[1]/Status='G' and Order=following-sibling::Row[1]/Order]
« Poslední změna: 21. 10. 2022, 19:28:28 od _Tomáš_ »

Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
« Odpověď #3 kdy: 21. 10. 2022, 19:30:44 »
<edit> Beru zpět, tohle nebude fungovat.
« Poslední změna: 21. 10. 2022, 19:34:22 od Martin Dimov »

ZAJDAN

  • *****
  • 2 092
    • Zobrazit profil
    • E-mail
Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
« Odpověď #4 kdy: 22. 10. 2022, 08:55:13 »
Pochopil jsi to správně. Jen upřesním, že cílem je vypsat AHOJ pro všechny řádky se statusem F za kterými nenásleduje řádek se statusem G a stejnou hodnotou v Order.

Kód: [Vybrat]
"/ResultSets/ResultSet/Row[Status='F'][not(following-sibling::Row[1]/Status='G' and Order=following-sibling::Row[1]/Order)]"funguje, děkuji
...
...
Chápu to tak, že chceš aktuální node se statusem F porovnat s následujícím a vypsat AHOJ, pokud ten má status=G a Order shodný s aktuálním. Výraz by pak tedy vypadal asi takhle:

Kód: [Vybrat]
/ResultSets/ResultSet/Row[Status='F'][following-sibling::Row[1]/Status='G' and Order=following-sibling::Row[1]/Order]
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.


ZAJDAN

  • *****
  • 2 092
    • Zobrazit profil
    • E-mail
Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
« Odpověď #5 kdy: 22. 10. 2022, 08:58:46 »
Já sibling chápu tak, že je to sousední element na stejné úrovni zanoření, tedy sourozenec(už ten název to přeci říká).
Každopádně děkuji.
...
...
following-sibling neznamená „sourozenci“ a už vůbec ne „nejbližší sourozenec“, ale znamená to, že to, co je za dvojtečkou, se bude hledat na ose následujících sourozenců. Takže když jste na elementu Row, following-sibling::Row najde všechny následující elementy Row, které mají stejného rodiče. following-sibling::* najde všechny následující elementy (bez ohledu na typ), které mají stejného rodiče. following-sibling::*[1] najde nejbližší následující element, který má stejného rodiče. Atd.
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
« Odpověď #6 kdy: 22. 10. 2022, 09:30:30 »
Já sibling chápu tak, že je to sousední element na stejné úrovni zanoření, tedy sourozenec(už ten název to přeci říká).
Ano, ale není to jen jeden sourozenec, jsou to všichni následující sourozenci. Teprve dalšími pravidly určíte, které z těch sourozenců chcete. To, co je v XPath následováno dvěma tečkami, je specifikace tzv. osy – je to množina uzlů v XML nějakým pravidlem odvozená od aktuálního prvku. A teprve z té množiny se pomocí dalších podmínek vybírají konkrétní prvky. To, co běžně používáte (hledání podle názvu elementu) je ve skutečnosti osa child::, akorát XPath umožňuje v takovém případě specifikaci osy vynechat. Podobně umožňuje vynechat osu attribute::. Všechny osy jsou popsané např. v dokumentaci Saxonu: Axis Steps.