Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[XPATH + JavaScript]

Pagina: 1
Acties:

  • cspare
  • Registratie: Oktober 2006
  • Laatst online: 29-07 22:19

cspare

What the deuce?!

Topicstarter
Uit een (deel van) een XML bestand:
XML:
1
2
3
4
5
6
7
8
<players>
    <player state="Lost">61354</player>
    <player state="Lost">59896</player>
    <player state="Lost">76289</player>
    <player state="Won">16183</player>
    <player state="Lost">78109</player>
    <player state="Lost">71110</player>
</players>


Nu wil ik met behulp van een XPATH 1.0 query er achter komen op welke plaats in de lijst de player met ID 76289 staat. Dit zou in dit geval 3 zijn. Speler 61354 staat op de 1e plaats, en 59896 op de 2e plaats, etc.

Klinkt niet moeilijk en ik heb zelfs een werkende XPATH 2.0 query hiervoor, maar in 1.0 werkt deze niet:
code:
1
players/player[.=76289]/(count(preceding-sibling::*)+1)

Het moet echter in XPATH 1.0 werken omdat ik het in JavaScript wil gebruiken, die alleen 1.0 aan kan.

Probleem lijkt te maken te hebben dat in xpath 1.0 count(/players/player) wel werkt, maar /players/count(player) niet.

The one who says it cannot be done, should never interrupt the one who is doing it.


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ja, en eigenlijk zou je dit zelfs met position() willen doen.

Ik zou denken aan zoiets:
code:
1
count(//player[following-sibling::player|.=76289])

(0 bij niet gevonden)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • cspare
  • Registratie: Oktober 2006
  • Laatst online: 29-07 22:19

cspare

What the deuce?!

Topicstarter
pedorus schreef op maandag 06 oktober 2008 @ 15:49:
Ja, en eigenlijk zou je dit zelfs met position() willen doen.

Ik zou denken aan zoiets:
code:
1
count(//player[following-sibling::player|.=76289])

(0 bij niet gevonden)
Probleem daarbij is dat de query maar 1 resultaat terug kan geven (de count staat om de hele query heen). Dit is een probleem omdat er werkelijk meerdere <game> elementen in het XML bestand zitten met ieder een <players> elementen. Ik heb eigenlijk de plaats van de player nodig om deze in dezelfde XPATH query te gebruiken om weer andere gegevens te kunnen vinden.

Dit is overigens de hele query die in XPATH 2.0 wel werkt:
code:
1
/game_history/games/game/events/event[starts-with(., string(../../players/player[.=78109]/(count(preceding-sibling::*)+1)))]

The one who says it cannot be done, should never interrupt the one who is doing it.


  • pedorus
  • Registratie: Januari 2008
  • Niet online
cspare schreef op maandag 06 oktober 2008 @ 19:16:
Probleem daarbij is dat de query maar 1 resultaat terug kan geven (de count staat om de hele query heen).
Als je meer dan 1 berekend resultaat hebt, dan zou ik eens kijken naar Javascript+XSLT, want volgens mij lukt dat nog niet met Javascript+XPath (in IE is dat bij 1 berekend resultaat al zo dacht ik).
Dit is overigens de hele query die in XPATH 2.0 wel werkt:
code:
1
/game_history/games/game/events/event[starts-with(., string(../../players/player[.=78109]/(count(preceding-sibling::*)+1)))]
Enkel dan kun je het toch alsnog inpassen? Dus iets als:
code:
1
//event[starts-with(.,count(../../players/player[following-sibling::player|.=76289]))]

(9 players max..., als het meer wordt denk ik aan functies als substring/substring-before/string-length?)

Ik heb geen XPath 2.0, maar werkt trouwens iets als
code:
1
//event[starts-with(.,../../players/player[.=78109]/position())]

niet ook gewoon in 2.0?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Juup
  • Registratie: Februari 2000
  • Niet online
Waarom gebruik je geen position() ?
Edit: Pedorus is me voor.

[ Voor 27% gewijzigd door Juup op 07-10-2008 00:32 ]

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.