Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ZAJDAN 21. 10. 2022, 18:41:32

Název: xPath: porovnání hodnot dvou sousedních uzlů
Přispěvatel: ZAJDAN 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 (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   
Název: Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
Přispěvatel: Filip Jirsák 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.
Název: Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
Přispěvatel: Exceptions 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]
Název: Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
Přispěvatel: Martin Dimov 21. 10. 2022, 19:30:44
<edit> Beru zpět, tohle nebude fungovat.
Název: Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
Přispěvatel: ZAJDAN 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]
Název: Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
Přispěvatel: ZAJDAN 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.
Název: Re:xPath - podmínka pro porovnání hodnot dvou sousedních uzlů
Přispěvatel: Filip Jirsák 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 (https://www.saxonica.com/documentation11/index.html#!expressions/axissteps).