V sprednjem razvoju sem bil dovolj dolgo, da sem opazil trend v preteklih letih: mlajši razvijalci delajo z novo paradigmo programiranja, ne da bi razumeli njen zgodovinski kontekst. Seveda je povsem razumljivo, da česa ne vemo. Splet je zelo veliko mesto z raznolikim naborom spretnosti in posebnosti in ne vemo vedno, česa ne vemo. Učenje na tem področju je nenehna pot in ne nekaj, kar se enkrat zgodi in konča. Primer: nekdo v moji ekipi je vprašal, ali je mogoče ugotoviti, ali uporabniki zapustijo določen zavihek v uporabniškem vmesniku. Opozoril sem na dogodek JavaScript beforeunload. Toda tisti, ki so se tega že lotili, vedo, da je to mogoče, ker so bili deležni opozoril o neshranjenih podatkih na drugih mestih, za katera je beforeunload tipičen primer uporabe. Kolegu sem za dobro mero opozoril tudi na dogodke pageHide in visibilityChange. Kako sem vedel za to? Ker se je pojavilo v drugem projektu, ne zato, ker sem se o tem učil, ko sem se najprej učil JavaScript. Dejstvo je, da sodobna front-end ogrodja stojijo na ramenih tehnoloških velikanov pred njimi. Abstrahirajo razvojne prakse, pogosto za boljšo izkušnjo razvijalcev, ki zmanjšajo ali celo odpravijo potrebo po poznavanju ali dotikanju tega, kar so bili tradicionalno bistveni koncepti sprednjega dela, ki bi jih vsi verjetno morali poznati. Razmislite o objektnem modelu CSS (CSSOM). Morda bi pričakovali, da ima vsak, ki dela s CSS in JavaScript, kup praktičnih izkušenj s CSSOM, vendar temu ne bo vedno tako. Obstajal je projekt React za spletno mesto e-trgovine, na katerem sem delal, kjer smo morali naložiti slogovno tabelo za trenutno izbranega ponudnika plačil. Težava je bila v tem, da se je slogovna tabela nalagala na vsaki strani, ko je bila zares potrebna samo na določeni strani. Razvijalec, ki je bil zadolžen za to, ni nikoli dinamično naložil slogovne tabele. Še enkrat, to je povsem razumljivo, ko React abstrahira tradicionalni pristop, po katerem ste morda posegli. CSSOM verjetno ni nekaj, kar potrebujete pri vsakdanjem delu. Vendar je verjetno, da boste morali na neki točki komunicirati z njim, tudi v enkratnem primeru. Te izkušnje so me spodbudile k pisanju tega članka. Obstaja veliko obstoječih spletnih funkcij in tehnologij, ki se jih morda nikoli ne boste neposredno dotaknili pri vsakodnevnem delu. Morda ste dokaj novi v spletnem razvoju in se jih preprosto ne zavedate, ker ste potopljeni v abstrakcijo specifičnega okvira, ki ne zahteva, da ga poznate poglobljeno ali celo sploh. Govorim posebej o XML-ju, za katerega mnogi od nas vemo, da je starodavni jezik, ki ni popolnoma drugačen od HTML-ja. To omenjam zaradi nedavnih razprav WHATWG, ki kažejo, da bi bilo treba iz brskalnikov odstraniti precejšen del sklada XML, znanega kot programiranje XSLT. To je točno tista starejša, obstoječa tehnologija, ki jo imamo že leta in bi jo lahko uporabili za nekaj tako praktičnega, kot je situacija CSSOM, v kateri je bila moja ekipa. Ali ste že delali z XSLT? Poglejmo, ali se močno naslanjamo na to starejšo tehnologijo in izkoriščamo njene funkcije zunaj konteksta XML za reševanje problemov v resničnem svetu danes. XPath: osrednji API Najpomembnejša tehnologija XML, ki je morda najbolj uporabna zunaj čiste perspektive XML, je XPath, jezik poizvedb, ki vam omogoča, da poiščete katero koli vozlišče ali atribut v označevalnem drevesu z enim korenskim elementom. Imam osebno naklonjenost do XSLT, vendar je to odvisno tudi od XPath, in osebno naklonjenost je treba dati ob stran pri razvrščanju pomembnosti. Argument za odstranitev XSLT ne omenja XPath, zato predvidevam, da je še vedno dovoljen. To je dobro, ker je XPath osrednji in najpomembnejši API v tem naboru tehnologij, zlasti ko poskušate najti nekaj za uporabo zunaj običajne uporabe XML. Pomembno je, ker se izbirniki CSS sicer lahko uporabljajo za iskanje večine elementov na vaši strani, ne morejo najti vseh. Poleg tega izbirnikov CSS ni mogoče uporabiti za iskanje elementa na podlagi njegovega trenutnega položaja v DOM. XPath lahko. Nekateri od vas, ki to berete, morda poznajo XPath, nekateri pa ne. XPath je precej veliko področje tehnologije in v enem samem članku, kot je ta, ne morem zares naučiti vseh osnov in vam tudi pokazati kul stvari, ki jih lahko počnete z njim. Pravzaprav sem poskušal napisati ta članek, vendar povprečna objava v reviji Smashing Magazine ne obsega več kot 5000 besed. Bil sem že pri več kot2000 besed in le na polovici osnov. Torej, začel bom delati kul stvari z XPathom in vam dal nekaj povezav, ki jih lahko uporabite za osnove, če se vam zdijo te stvari zanimive. Kombinacija XPath & CSS XPath lahko naredi veliko stvari, ki jih izbirniki CSS ne morejo pri poizvedovanju elementov. Toda izbirniki CSS lahko naredijo tudi nekaj stvari, ki jih XPath ne more, in sicer poizvedovanje elementov po imenu razreda.
CSS XPath .myClass /*[vsebuje(@razred, "mojRazred")]
V tem primeru CSS poizveduje po elementih, ki vsebujejo ime razreda .myClass. Medtem primer XPath poizveduje po elementih, ki vsebujejo razred atributov z nizom »myClass«. Z drugimi besedami, izbere elemente z myClass v katerem koli atributu, vključno z elementi z imenom razreda .myClass - kot tudi elemente z "myClass" v nizu, kot je .myClass2. XPath je v tem smislu širši. Torej, ne. Ne predlagam, da bi morali vreči CSS in začeti izbirati vse elemente prek XPath. To ni bistvo. Bistvo je, da lahko XPath naredi stvari, ki jih CSS ne more in bi lahko bil še vedno zelo uporaben, čeprav je starejša tehnologija v nizu brskalnika in se na prvi pogled morda ne zdi očitna. Uporabimo ti dve tehnologiji skupaj, ne le zato, ker lahko, temveč zato, ker se bomo med tem nekaj naučili o XPathu, zaradi česar bo to še eno orodje v vašem naboru – za katerega morda niste vedeli, da obstaja ves čas! Težava je v tem, da JavaScriptova metoda document.evaluate in različne metode izbirnika poizvedb, ki jih uporabljamo z API-ji CSS za JavaScript, niso združljive. Naredil sem združljiv API za poizvedovanje, da bi lahko začeli, čeprav resda o njem nisem veliko razmišljal, saj je odstopanje od tega, kar počnemo tukaj. Tukaj je dokaj preprost delujoč primer konstruktorja poizvedb za večkratno uporabo: Oglejte si Pen queryXPath [forked] Bryana Rasmussena. Objektu dokumenta sem dodal dve metodi: queryCSSSelectors (ki je v bistvu querySelectorAll) in queryXPaths. Oba vrneta objekt queryResults:
{ Vrsta poizvedbe: vozlišča | niz | številka | logična vrednost, rezultati: kateri koli[] // elementi html, elementi xml, nizi, številke, logične vrednosti, queryCSSSelectors: (poizvedba: niz, spremeni: logično) => rezultati poizvedbe, queryXpaths: (poizvedba: niz, popravek: boolean) => rezultati poizvedbe }
Funkciji queryCSSSelectors in queryXpaths zaženeta poizvedbo, ki jima jo podate, nad elementi v matriki rezultatov, če je matrika rezultatov vrste vozlišč, seveda. V nasprotnem primeru bo vrnil queryResult s prazno matriko in vrsto vozlišč. Če je lastnost spremembe nastavljena na true, bodo funkcije spremenile lastne queryResults. Tega v nobenem primeru ne smete uporabljati v proizvodnem okolju. To počnem zgolj zato, da pokažem različne učinke skupne uporabe dveh API-jev za poizvedbe. Primeri poizvedb Želim pokazati nekaj primerov različnih poizvedb XPath, ki prikazujejo nekatere zmogljive stvari, ki jih lahko naredijo, in kako jih je mogoče uporabiti namesto drugih pristopov. Prvi primer je //li/text(). To poizveduje po vseh elementih li in vrne njihova besedilna vozlišča. Torej, če bi poizvedovali po naslednjem HTML-ju:
- ena
- dva
- tri
… to je tisto, kar je vrnjeno:
{"queryType":"xpathEvaluate","results":["one","two","three"],"resultType":"string"}
Z drugimi besedami, dobimo naslednjo matriko: ["one","two","three"]. Običajno bi zahtevali elemente li, da bi to dobili, rezultat te poizvedbe spremenili v matriko, preslikali matriko in vrnili besedilno vozlišče vsakega elementa. Toda to lahko naredimo bolj jedrnato z XPathom: document.queryXPaths("//li/text()").results.
Opazite, da besedilno vozlišče dobite tako, da uporabite text(), ki je videti kot podpis funkcije - in tudi je. Vrne besedilno vozlišče elementa. V našem primeru so v oznaki trije elementi li, od katerih vsak vsebuje besedilo ("ena", "dva" in "tri").
Oglejmo si še en primer poizvedbe text(). Predpostavimo, da je to naša oznaka:
Napišimo poizvedbo, ki vrne vrednost atributa href: document.queryXPaths("//a[text() = 'Prijava']/@href").results.
To je poizvedba XPath v trenutnem dokumentu, tako kot zadnji primer, vendar tokrat vrnemo atribut href povezave (elementa), ki vsebuje besedilo »Prijava«. Dejansko vrnjenorezultat je ["/login.html"]. Pregled funkcij XPath Obstaja več funkcij XPath in verjetno jih ne poznate. Mislim, da jih je vredno vedeti več, vključno z naslednjim:
starts-withČe se besedilo začne z določenim drugim primerom besedila, starts-with(@href, 'http:') vrne true, če se atribut href začne s http:. containsČe besedilo vsebuje določen drug primer besedila, content(text(), "Smashing Magazine") vrne true, če besedilno vozlišče kjer koli vsebuje besede "Smashing Magazine". count Vrne število ujemanj s poizvedbo. Na primer, count(//*[starts-with(@href, 'http:']) vrne štetje, koliko povezav v vozlišču konteksta ima elemente z atributom href, ki vsebuje besedilo, ki se začne s http:. substringDeluje kot podniz JavaScript, le da niz posredujete kot argument. Na primer, substring("my text", 2, 4) vrne "y t". substring-before Vrne del niza pred drugim nizom. Na primer, substing-before("my text", " ") vrne "my". Podobno substring-before("hi","bye") vrne prazen niz. substring-after Vrne del niza za drugim nizom. Na primer, substing-after("moje besedilo", " ") vrne "besedilo". Podobno substring-after("hi","bye") vrne prazen niz. normalize-space Vrne argumentni niz s presledki, normaliziranimi z odstranjevanjem začetnih in končnih presledkov ter zamenjavo zaporedij presledkov z enim presledkom. notVrne logično vrednost true, če je argument false, sicer pa false. true Vrne logično vrednost true. false Vrne logično vrednost false. concatEnako kot JavaScript concat, le da ga ne izvajate kot metodo na nizu. Namesto tega vstavite vse nize, ki jih želite združiti. string-lengthTo ni isto kot JavaScript string-length, temveč vrne dolžino niza, ki je podan kot argument. translateThis sprejme niz in spremeni drugi argument v tretji argument. Na primer, translate("abcdef", "abc", "XYZ") izpiše XYZdef.
Poleg teh določenih funkcij XPath obstajajo številne druge funkcije, ki delujejo enako kot njihovi primerki v JavaScriptu – ali primerki v skoraj katerem koli programskem jeziku –, ki bi se vam verjetno prav tako zdele uporabne, kot so floor, strop, round, sum in tako naprej. Naslednja predstavitev prikazuje vsako od teh funkcij: Oglejte si številske funkcije Pen XPath [razcepljene] Bryana Rasmussena. Upoštevajte, da tako kot večina funkcij za manipulacijo z nizi tudi mnoge številske sprejmejo en sam vnos. To je seveda zato, ker naj bi se uporabljali za poizvedovanje, kot v zadnjem primeru XPath: //li[nadstropje(besedilo()) > 250]/@val
Če jih uporabite, kot večina primerov, ga boste na koncu zagnali na prvem vozlišču, ki se ujema s potjo. Obstaja tudi nekaj funkcij za pretvorbo vrst, ki bi se jim verjetno morali izogibati, ker ima JavaScript že svoje težave s pretvorbo vrst. Lahko pa pride do trenutkov, ko želite pretvoriti niz v število, da ga primerjate z drugim številom. Funkcije, ki nastavijo vrsto nečesa, so logična vrednost, število, niz in vozlišče. To so pomembni podatkovni tipi XPath. In kot si lahko predstavljate, je večino teh funkcij mogoče uporabiti na podatkovnih tipih, ki niso vozlišča DOM. Na primer, substring-after vzame niz, kot smo že opisali, lahko pa je to niz iz atributa href. Lahko je tudi samo niz:
const testSubstringAfter = document.queryXPaths("substring-after('zdravo svet',' ')");
Očitno nam bo ta primer vrnil niz rezultatov kot ["svet"]. Da bi to prikazal v akciji, sem naredil predstavitveno stran z uporabo funkcij proti stvarem, ki niso vozlišča DOM: Oglejte si Pen queryXPath [forked] Bryana Rasmussena. Upoštevati morate presenetljiv vidik funkcije prevajanja, ki je, da če imate znak v drugem argumentu (tj. seznam znakov, ki jih želite prevesti) in nobenega ujemajočega se znaka, v katerega bi ga prevedli, se ta znak odstrani iz izpisa. Torej, to:
translate('Pozdravljeni, ime mi je Inigo Montoya, ubil si mojega očeta, pripravi se na smrt','abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,','*')
... rezultati v nizu, vključno s presledki: [" * * ** "]
To pomeni, da se črka »a« prevede v zvezdico (*), vendar so vsi drugi znaki, ki nimajo prevoda glede na ciljni niz, popolnoma odstranjeni. Prazen prostor je vse, kar nam ostanemed prevedenimi znaki »a«. Potem spet ta poizvedba:
translate('Pozdravljeni, ime mi je Inigo Montoya, ubil si mojega očeta, pripravi se na smrt','abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,','************************************************************')")
... nima težave in prikaže rezultat, ki je videti takole:
"***** ** **** ** ***** ******* *** ****** ** ****** ******* ** ***"
Morda se vam bo zdelo, da v JavaScriptu ni enostavnega načina, da bi naredili točno to, kar počne funkcija prevajanja XPath, čeprav za mnoge primere uporabe to lahko obvlada replaceAll z regularnimi izrazi. Lahko bi uporabili isti pristop, ki sem ga pokazal, vendar je to neoptimalno, če je vse, kar želite, prevesti nize. Naslednja predstavitev ovije funkcijo prevajanja XPath, da zagotovi različico JavaScript: Oglejte si funkcijo prevajanja Pen [forked] Bryana Rasmussena. Kje bi lahko uporabili kaj takega? Razmislite o šifriranju Caesar Cipher s trimestno zamikom (npr. šifriranje na vrhu vrstice iz leta 48 pr. n. št.):
translate("Cezar namerava prečkati Rubikon!", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", "XYZABCDEFGHIJKLMNOPQRSTUVWxyzabcdefghijklmnopqrstuvw")
Vhodno besedilo "Cezar namerava prečkati Rubikon!" rezultat v "Zxbpxo fp mixkkfkd ql zolpp qeb Oryfzlk!" Da bi dal še en hiter primer različnih možnosti, sem naredil kovinsko funkcijo, ki sprejme vnos niza in uporabi funkcijo prevajanja, da vrne besedilo, vključno z vsemi znaki, ki imajo preglase. Oglejte si kovinsko funkcijo Pen [forked] Bryana Rasmussena.
const metal = (str) => { return translate(str, "AOUaou","ÄÖÜäöü"); }
In če je navedeno besedilo »Motley Crue rules, rock on dudes!«, vrne »Mötley Crüe rüles, röck ön düdes!« Očitno je, da bi lahko imeli vse vrste parodičnih uporab te funkcije. Če ste to vi, potem bi vam moral ta članek TVTropes dati veliko navdiha. Uporaba CSS z XPath Zapomnite si naš glavni razlog za uporabo izbirnikov CSS skupaj z XPathom: CSS precej razume, kaj je razred, medtem ko je najboljše, kar lahko naredite z XPath, primerjave nizov atributa razreda. To bo delovalo v večini primerov. Toda če bi kdaj naleteli na situacijo, ko bi recimo nekdo ustvaril razreda z imenom .primaryLinks in .primaryLinks2, vi pa bi uporabljali XPath za pridobitev razreda .primaryLinks, bi verjetno naleteli na težave. Dokler ni nič takega neumnega, bi verjetno uporabili XPath. Ampak z žalostjo moram poročati, da sem delal na mestih, kjer ljudje počnejo takšne neumnosti. Tukaj je še en demo z uporabo CSS in XPath skupaj. Prikazuje, kaj se zgodi, ko uporabimo kodo za zagon XPath na kontekstnem vozlišču, ki ni vozlišče dokumenta. Oglejte si Pen css in xpath skupaj [forked] Bryan Rasmussen. Poizvedba CSS je .relatedarticles a, ki pridobi dva elementa a v divu, ki mu je dodeljen razred .relatedarticles. Za tem so tri "slabe" poizvedbe, to je poizvedbe, ki ne delajo tistega, kar želimo, ko se izvajajo s temi elementi kot kontekstnim vozliščem. Lahko razložim, zakaj se obnašajo drugače, kot bi morda pričakovali. Zadevne tri slabe poizvedbe so:
//text(): Vrne celotno besedilo v dokumentu. //a/text(): Vrne celotno besedilo znotraj povezav v dokumentu. ./a/text(): ne vrne rezultatov.
Razlog za te rezultate je, da medtem ko je vaš kontekst element, vrnjen iz poizvedbe CSS, // nasprotuje celotnemu dokumentu. To je moč XPatha; CSS ne more iti od vozlišča do prednika in nato do sorodnika tega prednika ter se spustiti do potomca tega sorodnika. Toda XPath lahko. Medtem ./ poizveduje po podrejenih vozliščih trenutnega vozlišča, kjer pika (.) predstavlja trenutno vozlišče, poševnica naprej (/) pa prehod na neko podrejeno vozlišče - ali gre za atribut, element ali besedilo, je določeno z naslednjim delom poti. Vendar ni nobenega podrejenega elementa, izbranega s poizvedbo CSS, zato ta poizvedba tudi ne vrne ničesar. V zadnji predstavitvi so tri dobre poizvedbe:
.//besedilo(), ./besedilo(), normalize-space(./text()).
Poizvedba normalize-space prikazuje uporabo funkcije XPath, vendar tudi odpravlja težavo, vključeno v druge poizvedbe. HTML je strukturiran takole:
Avtomatizacija testiranja vaših funkcij s Selenium WebDriver
Poizvedba vrne pomik vrstice na začetku in koncu besedilnega vozlišča,in normalize-space to odstrani. Uporaba katere koli funkcije XPath, ki z vhodnim XPath vrne nekaj drugega kot logično vrednost, velja za druge funkcije. Naslednja predstavitev prikazuje številne primere: Oglejte si primere funkcij Pen xpath [forked] Bryana Rasmussena. Prvi primer prikazuje težavo, na katero morate biti pozorni. Natančneje, naslednja koda:
document.queryXPaths("substring-after(//a/@href,'https://')");
... vrne en niz:
"www.smashingmagazine.com/2018/04/feature-testing-selenium-webdriver/"
Je smiselno, kajne? Te funkcije ne vrnejo nizov, temveč posamezne nize ali posamezne številke. Izvajanje funkcije kjer koli z več rezultati vrne samo prvi rezultat. Drugi rezultat kaže, kaj si resnično želimo:
document.queryCSSSelectors("a").queryXPaths("substring-after(./@href,'https://')");
Ki vrne niz dveh nizov:
["www.smashingmagazine.com/2018/04/feature-testing-selenium-webdriver/","www.smashingmagazine.com/2022/11/automated-test-results-improve-accessibility/"]
Funkcije XPath je mogoče ugnezditi tako kot funkcije v JavaScriptu. Torej, če poznamo strukturo URL-ja revije Smashing Magazine, bi lahko naredili naslednje (priporočljiva je uporaba literalov predloge): `prevedi( podniz( substring-after(./@href, 'www.smashingmagazine.com/') ,9), '/','')`
To postaja nekoliko preveč zapleteno do te mere, da potrebuje komentarje, ki opisujejo, kaj počne: vzemite celoten URL iz atributa href za www.smashingmagazine.com/, odstranite prvih devet znakov, nato prevedite znak poševnice (/) v nič, da se znebite končne poševnice. Nastala matrika:
["feature-testing-selenium-webdriver","automated-test-results-improve-accessibility"]
Več primerov uporabe XPath XPath lahko res blesti pri testiranju. Razloga ni težko razumeti, saj je mogoče XPath uporabiti za pridobitev vsakega elementa v DOM s katerega koli položaja v DOM, medtem ko CSS ne more. Ne morete računati na to, da bodo razredi CSS ostali konsistentni v številnih sodobnih gradbenih sistemih, toda z XPath lahko naredimo bolj zanesljiva ujemanja glede besedilne vsebine elementa, ne glede na spreminjajočo se strukturo DOM. Obstajajo raziskave o tehnikah, ki vam omogočajo izdelavo prožnih testov XPath. Nič ni hujšega, kot če se testi pokvarijo in ne uspejo samo zato, ker izbirnik CSS ne deluje več, ker je bilo nekaj preimenovano ali odstranjeno. XPath je prav tako odličen pri pridobivanju več lokatorjev. Obstaja več načinov za uporabo poizvedb XPath za ujemanje elementa. Enako velja za CSS. Toda poizvedbe XPath lahko vrtajo v stvari na bolj ciljno usmerjen način, ki omejuje, kaj se vrne, kar vam omogoča, da najdete določeno ujemanje, kjer je lahko več možnih ujemanja. XPath lahko na primer uporabimo za vrnitev določenega elementa h2, ki je vsebovan v divu, ki takoj sledi sorodnemu divu, ki nato vsebuje podrejeni slikovni element z atributom data-testID="leader":
ne dobi tega naslova
Tudi tega naslova ne dobite
Glava glavne slike
To je poizvedba: document.queryXPaths(` //div[ naslednji-sibling::div[1] /img[@data-testID='leader'] ] /h2/ besedilo() `);
Oglejmo si predstavitev, da vidimo, kako je vse skupaj: Oglejte si poizvedbo Pen Complex H2 [razcepljena] Bryana Rasmussena. Torej, da. Obstaja veliko možnih poti do katerega koli elementa v testu z uporabo XPath. Zastarel XSLT 1.0 Na začetku sem omenil, da namerava skupina za Chrome odstraniti podporo za XSLT 1.0 iz brskalnika. To je pomembno, ker XSLT 1.0 uporablja programiranje, osredotočeno na XML, za transformacijo dokumentov, ki se nato zanaša na XPath 1.0, kar je v večini brskalnikov. Ko se to zgodi, bomo izgubili ključno komponento XPath. Toda glede na dejstvo, da je XPath res odličen za pisanje testov, se mi zdi malo verjetno, da bo XPath kot celota kmalu izginil. Kljub temu sem opazil, da se ljudje zanimajo za funkcijo, ko je odvzeta. In to zagotovo drži v primeru, da je XSLT 1.0 opuščen. V Hacker News poteka cela razprava, polna argumentov proti opustitvi. Sama objava je odličen primer ustvarjanja ogrodja za bloganje z XSLT. Tirazpravo lahko preberete sami, vendar se poglobite v to, kako bi lahko JavaScript uporabili kot podlogo za XLST za obravnavanje takšnih primerov. Videl sem tudi predloge, da naj brskalniki uporabljajo SaxonJS, ki je vrata za motorje Saxon XSLT, XQUERY in XPath JavaScripta. To je zanimiva ideja, zlasti ker Saxon-JS izvaja trenutno različico teh specifikacij, medtem ko ni brskalnika, ki bi implementiral katero koli različico XPath ali XSLT nad 1.0, in nobenega, ki bi implementiral XQuery. Obrnil sem se na Norma Tovey-Walsha pri Saxonici, podjetju, ki stoji za SaxonJS in drugimi različicami motorja Saxon. Rekel je: »Če bi bil kateri koli prodajalec brskalnika zainteresiran za SaxonJS kot izhodišče za integracijo sodobnih tehnologij XML v brskalnik, bi z veseljem razpravljali o tem z njim.« – Norm Tovey-Walsh
Dodal pa je tudi: "Zelo bi me presenetilo, če bi kdo pomislil, da bi bil idealen pristop uporaba SaxonJS v njegovi trenutni obliki in spuščanje v gradnjo brskalnika v nespremenjeni obliki. Prodajalec brskalnika bi lahko zaradi dejstva, da izdela brskalnik, pristopil k integraciji na veliko globlji ravni, kot jo lahko mi 'od zunaj'."— Norm Tovey-Walsh
Omeniti velja, da so komentarji Tovey-Walsha prišli približno teden dni pred objavo opustitve XSLT. Zaključek Še bi lahko našteval. Vendar upam, da je to pokazalo moč XPatha in vam dalo veliko primerov, ki prikazujejo, kako ga uporabljati za doseganje velikih stvari. To je odličen primer starejše tehnologije v nizu brskalnikov, ki ima še danes veliko uporabnosti, tudi če nikoli niste vedeli, da obstaja ali nikoli niste pomislili, da bi posegli po njej. Nadaljnje branje
»Izboljšanje odpornosti avtomatiziranih spletnih testov z naravnim jezikom« (Digitalna knjižnica ACM), avtorji Maroun Ayli, Youssef Bakouny, Nader Jalloul in Rima Kilany. Ta članek ponuja številne primere XPath za pisanje prožnih testov. XPath (MDN) To je odličen kraj za začetek, če želite tehnično razlago, ki podrobno opisuje delovanje XPath. Vadnica XPath (ZVON) Ugotovil sem, da je ta vadnica najbolj koristna pri mojem učenju, zahvaljujoč številnim primerom in jasnim razlagam. XPather To interaktivno orodje vam omogoča neposredno delo s kodo.