Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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
-
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
/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.
-
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:
/ResultSets/ResultSet/Row[Status='F'][following-sibling::Row[1]/Status='G' and Order=following-sibling::Row[1]/Order]
-
<edit> Beru zpět, tohle nebude fungovat.
-
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.
"/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:
/ResultSets/ResultSet/Row[Status='F'][following-sibling::Row[1]/Status='G' and Order=following-sibling::Row[1]/Order]
-
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.
-
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).