Dovoljno sam dugo u front-end razvoju da vidim trend tijekom godina: mlađi programeri rade s novom paradigmom programiranja bez razumijevanja njezinog povijesnog konteksta. Naravno, sasvim je razumljivo nešto ne znati. Web je veliko mjesto s raznolikim skupom vještina i specijalnosti, a mi ne znamo uvijek što ne znamo. Učenje u ovom području je trajno putovanje, a ne nešto što se jednom dogodi i završi. Primjer: Netko iz mog tima pitao je može li se znati odlaze li korisnici s određene kartice u korisničkom sučelju. Istaknuo sam JavaScript-ov događaj beforeunload. Ali oni koji su se time već bavili znaju da je to moguće jer su bili pogođeni upozorenjima o nespremljenim podacima na drugim stranicama, za koje je beforeunload tipičan slučaj upotrebe. Također sam svom kolegi za dobru mjeru ukazao na događaje pageHide and visibilityChange. Kako sam znao za to? Zato što se pojavio u drugom projektu, a ne zato što sam proučavao to kad sam u početku učio JavaScript. Činjenica je da moderni front-end okviri stoje na ramenima tehnoloških divova koji su im prethodili. Oni apstrahiraju razvojne prakse, često za bolje razvojno iskustvo koje smanjuje, ili čak eliminira, potrebu da se zna ili dotakne ono što su tradicionalno bili ključni front-end koncepti koje bi svi vjerojatno trebali znati. Razmotrite CSS objektni model (CSSOM). Možete očekivati da svatko tko radi na CSS-u i JavaScriptu ima hrpu praktičnog iskustva s CSSOM-om, ali to neće uvijek biti slučaj. Postojao je React projekt za web-mjesto e-trgovine na kojemu sam trebao učitati stilsku tablicu za trenutno odabranog pružatelja usluga plaćanja. Problem je bio u tome što se lista stilova učitavala na svakoj stranici kada je stvarno bila potrebna samo na određenoj stranici. Razvojni programer zadužen za to da se to dogodi nikad nije dinamički učitao tablicu stilova. Opet, ovo je potpuno razumljivo kada React apstrahira tradicionalni pristup za kojim ste možda posegnuli. CSSOM vjerojatno nije nešto što vam treba u svakodnevnom radu. No vjerojatno ćete u nekom trenutku morati stupiti u interakciju s njim, čak i u jednom slučaju. Ta su me iskustva potaknula da napišem ovaj članak. Postoje mnoge postojeće web značajke i tehnologije u divljini koje možda nikada nećete dodirnuti izravno u svom svakodnevnom radu. Možda ste prilično novi u web razvoju i jednostavno ih niste svjesni jer ste ogrezli u apstrakciji specifičnog okvira koji ne zahtijeva da ga dublje poznajete ili ga uopće ne poznajete. Posebno govorim o XML-u, za koji mnogi od nas znaju da je drevni jezik koji nije potpuno različit od HTML-a. Pominjem ovo zbog nedavnih WHATWG rasprava koje sugeriraju da bi značajan dio XML hrpe poznatog kao XSLT programiranje trebalo ukloniti iz preglednika. Ovo je upravo ona vrsta starije, postojeće tehnologije koju imamo godinama i koja bi se mogla koristiti za nešto tako praktično kao što je CSSOM situacija u kojoj se nalazio moj tim. Jeste li prije radili s XSLT-om? Pogledajmo hoćemo li se snažno oslanjati na ovu stariju tehnologiju i iskoristiti njezine značajke izvan konteksta XML-a za rješavanje problema u stvarnom svijetu danas. XPath: središnji API Najvažnija XML tehnologija koja je možda najkorisnija izvan ravne XML perspektive je XPath, upitni jezik koji vam omogućuje da pronađete bilo koji čvor ili atribut u markup stablu s jednim korijenskim elementom. Imam osobnu naklonost prema XSLT-u, ali to se također oslanja na XPath, a osobnu naklonost treba ostaviti po strani pri rangiranju važnosti. Argument za uklanjanje XSLT-a ne spominje XPath, pa pretpostavljam da je još uvijek dopušten. To je dobro jer je XPath središnji i najvažniji API u ovom skupu tehnologija, posebno kada pokušavate pronaći nešto za korištenje izvan normalne upotrebe XML-a. Važno je jer, dok se CSS selektori mogu koristiti za pronalaženje većine elemenata na vašoj stranici, ne mogu ih pronaći sve. Nadalje, CSS selektori ne mogu se koristiti za pronalaženje elementa na temelju njegove trenutne pozicije u DOM-u. XPath može. Sada, neki od vas koji ovo čitate možda znaju XPath, a neki možda ne. XPath je prilično veliko područje tehnologije i ne mogu vas podučiti o svim osnovama i također vam pokazati zgodne stvari koje možete učiniti s njim u jednom ovakvom članku. Zapravo sam pokušao napisati taj članak, ali prosječna objava u Smashing Magazinu ne prelazi 5000 riječi. Već sam bio na više od2000 riječi, a tek na pola puta kroz osnove. Dakle, počet ću raditi cool stvari s XPathom i dat ću vam neke poveznice koje možete koristiti za osnove ako vam se te stvari čine zanimljivima. Kombinacija XPath & CSS XPath može učiniti puno stvari koje CSS selektori ne mogu prilikom postavljanja upita elementima. Ali CSS selektori također mogu učiniti nekoliko stvari koje XPath ne može, naime postavljati upite elementima prema nazivu klase.
CSS XPath .mojRazred /*[sadrži(@class, "myClass")]
U ovom primjeru CSS postavlja upite elementima koji sadrže naziv klase .myClass. U međuvremenu, XPath primjer ispituje elemente koji sadrže klasu atributa s nizom "myClass". Drugim riječima, odabire elemente s myClass u bilo kojem atributu, uključujući elemente s .myClass classname — kao i elemente s "myClass" u nizu, kao što je .myClass2. XPath je širi u tom smislu. Dakle, ne. Ne sugeriram da bismo trebali izbaciti CSS i početi odabirati sve elemente putem XPatha. To nije poanta. Poanta je da XPath može učiniti stvari koje CSS ne može i još uvijek bi mogao biti vrlo koristan, iako je to starija tehnologija u nizu preglednika i možda se ne čini očigledna na prvi pogled. Upotrijebimo dvije tehnologije zajedno ne samo zato što možemo, već zato što ćemo u tom procesu naučiti nešto o XPathu, čineći ga još jednim alatom u vašem nizu - alatom za koji možda niste znali da postoji cijelo vrijeme! Problem je u tome što JavaScriptova metoda document.evaluate i razne metode selektora upita koje koristimo s CSS API-jima za JavaScript nisu kompatibilne. Napravio sam kompatibilan API za upite kako bismo započeli, iako priznajem, nisam puno razmišljao o tome budući da je to odmak od onoga što ovdje radimo. Evo prilično jednostavnog radnog primjera višekratno upotrebljivog konstruktora upita: Pogledajte Pen queryXPath [forked] Bryana Rasmussena. Dodao sam dvije metode objektu dokumenta: queryCSSSelectors (što je u biti querySelectorAll) i queryXPaths. Oba vraćaju objekt queryResults:
{ Vrsta upita: čvorovi | niz | broj | Booleov, rezultati: bilo koji[] // html elementi, xml elementi, nizovi, brojevi, Booleovi, queryCSSSelectors: (upit: string, ispravi: boolean) => queryResults, queryXpaths: (upit: string, ispravi: boolean) => queryResults }
Funkcije queryCSSSelectors i queryXpaths pokreću upit koji im date preko elemenata u nizu rezultata, naravno sve dok je niz rezultata tipa čvorova. Inače će vratiti queryResult s praznim nizom i vrstom čvorova. Ako je svojstvo izmjene postavljeno na true, funkcije će promijeniti vlastite queryResults. Ni pod kojim uvjetima ovo se ne smije koristiti u proizvodnom okruženju. Činim to na ovaj način čisto da demonstriram različite učinke korištenja dva API-ja upita zajedno. Primjeri upita Želim pokazati nekoliko primjera različitih XPath upita koji pokazuju neke od moćnih stvari koje mogu učiniti i kako se mogu koristiti umjesto drugih pristupa. Prvi primjer je //li/text(). Time se ispituju svi li elementi i vraćaju se njihovi tekstualni čvorovi. Dakle, ako bismo tražili sljedeći HTML:
- jedan
- dva
- tri
...ovo je ono što se vraća:
{"queryType":"xpathEvaluate","results":["one","two","three"],"resultType":"string"}
Drugim riječima, dobivamo sljedeći niz: ["jedan","dva","tri"]. Uobičajeno biste postavili upit za li elemente da biste to dobili, pretvorili rezultat tog upita u niz, mapirali niz i vratili tekstualni čvor svakog elementa. Ali to možemo učiniti konciznije s XPathom: document.queryXPaths("//li/text()").rezultati.
Primijetite da je način da dobijete tekstualni čvor korištenje text(), koji izgleda kao potpis funkcije - i jest. Vraća tekstualni čvor elementa. U našem primjeru postoje tri elementa li u markupu, od kojih svaki sadrži tekst ("jedan", "dva" i "tri").
Pogledajmo još jedan primjer text() upita. Pretpostavimo da je ovo naša oznaka:
Napišimo upit koji vraća vrijednost atributa href: document.queryXPaths("//a[text() = 'Prijava']/@href").rezultati.
Ovo je XPath upit na trenutnom dokumentu, baš kao i prošli primjer, ali ovaj put vraćamo href atribut poveznice (elementa) koji sadrži tekst "Prijava". Stvarno se vratilorezultat je ["/login.html"]. Pregled XPath funkcija Postoji niz XPath funkcija i vjerojatno niste upoznati s njima. Postoji nekoliko, mislim, o kojima vrijedi znati, uključujući sljedeće:
starts-withAko tekst počinje određenim drugim primjerom teksta, starts-with(@href, 'http:') vraća true ako atribut href počinje s http:. sadrži Ako tekst sadrži određeni drugi primjer teksta, contains(text(), "Smashing Magazine") vraća true ako tekstualni čvor bilo gdje u sebi sadrži riječi "Smashing Magazine". countVraća broj podudaranja s upitom. Na primjer, count(//*[starts-with(@href, 'http:']) vraća broj poveznica u čvoru konteksta koji imaju elemente s atributom href koji sadrži tekst koji počinje s http:. substringRadi kao JavaScript substring, osim što prosljeđujete niz kao argument. Na primjer, substring("my text", 2, 4) vraća "y t". substring-beforeVraća dio niza prije drugog niza. Na primjer, substing-before("moj tekst", " ") vraća "moj". Slično, substring-before("hi","bye") vraća prazan niz. substring-afterVraća dio niza nakon drugog niza. Na primjer, substing-after("moj tekst", " ") vraća "tekst". Slično, substring-after("bok","bye") vraća prazan niz. normalize-space Vraća niz argumenata s razmacima normaliziranim uklanjanjem razmaka na početku i na kraju i zamjenom sekvenci znakova razmaka jednim razmakom. notVraća booleovu vrijednost true ako je argument false, inače false. trueVraća boolean true. falseVraća boolean false. concatIsta stvar kao JavaScript concat, samo što ga ne izvodite kao metodu na nizu. Umjesto toga, stavite sve nizove koje želite spojiti. string-lengthOvo nije isto što i JavaScript string-length, već vraća duljinu niza koji mu je dan kao argument. translateThis uzima niz i mijenja drugi argument u treći argument. Na primjer, translate("abcdef", "abc", "XYZ") ispisuje XYZdef.
Osim ovih specifičnih XPath funkcija, postoji niz drugih funkcija koje rade jednako kao i njihovi JavaScript parnjaci — ili parnjaci u gotovo bilo kojem programskom jeziku — koje bi vam vjerojatno također bile korisne, kao što su floor, strop, round, sum, i tako dalje. Sljedeća demonstracija ilustrira svaku od ovih funkcija: Pogledajte numeričke funkcije Pen XPath [forked] Bryana Rasmussena. Imajte na umu da, kao i većina funkcija za manipulaciju nizovima, mnoge numeričke imaju jedan unos. To je, naravno, zato što bi se trebali koristiti za postavljanje upita, kao u posljednjem XPath primjeru: //li[pod(tekst()) > 250]/@val
Ako ih koristite, kao što to čini većina primjera, na kraju ćete ga pokrenuti na prvom čvoru koji odgovara stazi. Postoje i neke funkcije za pretvorbu tipa koje biste vjerojatno trebali izbjegavati jer JavaScript već ima vlastitih problema s pretvorbom tipa. Ali ponekad možete pretvoriti niz u broj kako biste ga usporedili s nekim drugim brojem. Funkcije koje postavljaju vrstu nečega su booleov, broj, niz i čvor. Ovo su važni XPath tipovi podataka. I kao što možete zamisliti, većina ovih funkcija može se koristiti na tipovima podataka koji nisu DOM čvorovi. Na primjer, substring-after uzima niz kao što smo već opisali, ali to može biti niz iz atributa href. Također može biti samo niz:
const testSubstringAfter = document.queryXPaths("substring-after('hello world',' ')");
Očito, ovaj primjer će nam vratiti niz rezultata kao ["svijet"]. Kako bih to pokazao na djelu, napravio sam demo stranicu koristeći funkcije protiv stvari koje nisu DOM čvorovi: Pogledajte Pen queryXPath [forked] Bryana Rasmussena. Trebali biste primijetiti iznenađujući aspekt funkcije prevođenja, a to je da ako imate znak u drugom argumentu (tj., popis znakova koje želite prevesti) i nema odgovarajućeg znaka za prijevod, taj se znak uklanja iz izlaza. Dakle, ovo:
translate('Zdravo, moje ime je Inigo Montoya, ubio si mi oca, pripremi se za smrt','abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,','*')
...rezultati u nizu, uključujući razmake: [" * * ** "]
To znači da se slovo "a" prevodi u zvjezdicu (*), ali svaki drugi znak koji nema prijevod s obzirom na ciljni niz potpuno se uklanja. Praznina je sve što nam je ostaloizmeđu prevedenih znakova "a". Onda opet, ovaj upit:
translate('Hello, My Name is Inigo Montoya, you killed my father, prepare to die','abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,','**************************************************')")
...nema problema i daje rezultat koji izgleda ovako:
"***** ** **** ** ***** ******* *** ****** ** ****** ******* ** ***"
Moglo bi vam se učiniti da u JavaScriptu ne postoji jednostavan način da učinite točno ono što radi funkcija prevođenja XPath, iako za mnoge slučajeve upotrebe, replaceAll s regularnim izrazima to može podnijeti. Mogli biste upotrijebiti isti pristup koji sam ja pokazao, ali to je suboptimalno ako je sve što želite prevesti nizove. Sljedeći demo omotava XPathovu funkciju prevođenja kako bi pružio JavaScript verziju: Pogledajte funkciju prijevoda olovkom [forked] Bryana Rasmussena. Gdje biste mogli upotrijebiti ovako nešto? Razmotrite enkripciju Caesar Cipher s pomakom od tri mjesta (npr. vrhunska enkripcija iz 48. pr. Kr.):
translate("Cezar planira prijeći Rubikon!", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", "XYZABCDEFGHIJKLMNOPQRSTUVWxyzabcdefghijklmnopqrstuvw")
Ulazni tekst "Cezar planira prijeći Rubikon!" rezultira "Zxbpxo fp mixkkfkd ql zolpp qeb Oryfzlk!" Da dam još jedan brzi primjer različitih mogućnosti, napravio sam metalnu funkciju koja uzima unos niza i koristi funkciju prevođenja za vraćanje teksta, uključujući sve znakove koji imaju preglase. Pogledajte metalnu funkciju Pen [forked] Bryana Rasmussena.
const metal = (str) => { return translate(str, "AOUaou","ÄÖÜäöü"); }
I, ako je dan tekst "Motley Crue rules, rock on dudes!", vraća "Mötley Crüe rüles, röck ön düdes!" Očito, moguće je razne parodijske upotrebe ove funkcije. Ako ste to vi, onda bi vam ovaj TVTropes članak trebao pružiti obilje inspiracije. Korištenje CSS-a s XPathom Zapamtite naš glavni razlog za korištenje CSS selektora zajedno s XPathom: CSS prilično dobro razumije što je klasa, dok je najbolje što možete učiniti s XPathom usporedba nizova atributa klase. To će raditi u većini slučajeva. Ali ako biste ikada naišli na situaciju u kojoj je, recimo, netko kreirao klase pod nazivom .primaryLinks i .primaryLinks2, a vi ste koristili XPath za dobivanje klase .primaryLinks, tada biste vjerojatno naišli na probleme. Sve dok nema ništa takvo glupo, vjerojatno biste koristili XPath. Ali s tugom moram prijaviti da sam radio na mjestima gdje ljudi rade takve gluposti. Evo još jedne demonstracije koja koristi CSS i XPath zajedno. Pokazuje što se događa kada koristimo kod za pokretanje XPatha na kontekstualnom čvoru koji nije čvor dokumenta. Pogledajte Pen css i xpath zajedno [forked] Bryana Rasmussena. CSS upit je .relatedarticles a, koji dohvaća dva elementa a u divu kojem je dodijeljena klasa .relatedarticles. Nakon toga su tri "loša" upita, to jest, upiti koji ne rade ono što želimo da rade kada se izvode s ovim elementima kao čvorom konteksta. Mogu objasniti zašto se ponašaju drugačije nego što biste očekivali. Tri loša upita o kojima je riječ su:
//text(): Vraća sav tekst u dokumentu. //a/text(): Vraća sav tekst unutar poveznica u dokumentu. ./a/text(): Ne vraća rezultate.
Razlog za ove rezultate je taj što, iako je vaš kontekst elementi vraćeni iz CSS upita, // ide protiv cijelog dokumenta. Ovo je snaga XPatha; CSS ne može ići od čvora do pretka, a zatim do brata tog pretka, i spustiti se do potomka tog brata. Ali XPath može. U međuvremenu, ./ ispituje potomke trenutnog čvora, gdje točka (.) predstavlja trenutni čvor, a kosa crta naprijed (/) predstavlja odlazak na neki podređeni čvor — je li to atribut, element ili tekst određuje sljedeći dio staze. Ali nema podređenog elementa odabranog CSS upitom, stoga taj upit također ne vraća ništa. Postoje tri dobra upita u toj posljednjoj demonstraciji:
.//tekst(), ./tekst(), normaliziraj-razmak(./tekst()).
Upit za normaliziranje prostora pokazuje korištenje XPath funkcije, ali također popravlja problem uključen u druge upite. HTML je strukturiran ovako:
Automatiziranje testiranja vaših značajki pomoću Selenium WebDrivera
Upit vraća pomak retka na početku i kraju tekstualnog čvora,a normalize-space to uklanja. Korištenje bilo koje XPath funkcije koja vraća nešto što nije booleov s unosom XPath primjenjuje se na druge funkcije. Sljedeća demonstracija prikazuje nekoliko primjera: Pogledajte primjere funkcija Pen xpath [forked] Bryana Rasmussena. Prvi primjer pokazuje problem na koji biste trebali pripaziti. Konkretno, sljedeći kod:
document.queryXPaths("substring-after(//a/@href,'https://')");
... vraća jedan niz:
"www.smashingmagazine.com/2018/04/feature-testing-selenium-webdriver/"
Ima smisla, zar ne? Ove funkcije ne vraćaju nizove već pojedinačne nizove ili pojedinačne brojeve. Pokretanje funkcije bilo gdje s više rezultata vraća samo prvi rezultat. Drugi rezultat pokazuje što stvarno želimo:
document.queryCSSSelectors("a").queryXPaths("substring-after(./@href,'https://')");
Koji vraća niz od dva niza:
["www.smashingmagazine.com/2018/04/feature-testing-selenium-webdriver/","www.smashingmagazine.com/2022/11/automated-test-results-improve-accessibility/"]
XPath funkcije mogu se ugniježditi baš kao i funkcije u JavaScriptu. Dakle, ako znamo strukturu URL-a časopisa Smashing, mogli bismo učiniti sljedeće (preporuča se korištenje literala predloška): `prevedi( podniz ( substring-after(./@href, 'www.smashingmagazine.com/') ,9), '/','')`
Ovo postaje previše složeno do te mjere da su mu potrebni komentari koji opisuju što radi: uzmite cijeli URL iz atributa href nakon www.smashingmagazine.com/, uklonite prvih devet znakova, zatim prevedite znak kose crte (/) u ništa kako biste se riješili završne kose crte. Rezultirajući niz:
["feature-testing-selenium-webdriver","automated-test-results-improve-accessibility"]
Više slučajeva korištenja XPath-a XPath stvarno može zablistati u testiranju. Razlog nije teško vidjeti, jer se XPath može koristiti za dobivanje svakog elementa u DOM-u, s bilo koje pozicije u DOM-u, dok CSS ne može. Ne možete računati na to da će CSS klase ostati dosljedne u mnogim modernim sustavima izrade, ali s XPathom možemo napraviti robusnija podudaranja s tim što je tekstualni sadržaj elementa, bez obzira na promjenjivu DOM strukturu. Provedeno je istraživanje o tehnikama koje vam omogućuju izradu otpornih XPath testova. Ništa nije gore od toga da testovi propadnu i padnu samo zato što CSS selektor više ne radi jer je nešto preimenovano ili uklonjeno. XPath je također jako dobar u ekstrakciji više lokatora. Postoji više od jednog načina korištenja XPath upita za podudaranje elementa. Isto je i sa CSS-om. Ali XPath upiti mogu istražiti stvari na ciljaniji način koji ograničava ono što se vraća, omogućujući vam da pronađete određeno podudaranje gdje može postojati nekoliko mogućih podudaranja. Na primjer, možemo upotrijebiti XPath za vraćanje određenog h2 elementa koji se nalazi unutar diva koji odmah slijedi div sestru koji zauzvrat sadrži podređeni element slike s atributom data-testID="leader" na sebi:
nemojte dobiti ovaj naslov
Nemojte dobiti ni ovaj naslov
Zaglavlje za glavnu sliku
Ovo je upit: document.queryXPaths(` //div[ sljedeći-sibling::div[1] /img[@data-testID='lider'] ] /h2/ tekst() `);
Ubacimo demo da vidimo kako to sve izgleda zajedno: Pogledajte Pen Complex H2 Query [forked] Bryana Rasmussena. Dakle, da. Postoji mnogo mogućih putova do bilo kojeg elementa u testu koji koristi XPath. Zastarjeli XSLT 1.0 Rano sam spomenuo da Chromeov tim planira ukloniti podršku za XSLT 1.0 iz preglednika. To je važno jer XSLT 1.0 koristi programiranje usmjereno na XML za transformaciju dokumenta koji se pak oslanja na XPath 1.0, što je ono što se nalazi u većini preglednika. Kada se to dogodi, izgubit ćemo ključnu komponentu XPatha. Ali s obzirom na činjenicu da je XPath stvarno izvrstan za pisanje testova, smatram da je malo vjerojatno da će XPath kao cjelina uskoro nestati. Ipak, primijetio sam da se ljudi zainteresiraju za značajku kada je uklone. A to je svakako točno u slučaju da je XSLT 1.0 zastario. U Hacker Newsu vodi se cijela rasprava puna argumenata protiv odbacivanja. Sam post izvrstan je primjer stvaranja okvira za bloganje pomoću XSLT-a. Vasmožete sami pročitati raspravu, ali ulazi u to kako se JavaScript može koristiti kao podloška za XLST za rješavanje takvih slučajeva. Također sam vidio prijedloge da preglednici trebaju koristiti SaxonJS, koji je priključak za JavaScriptove Saxon XSLT, XQUERY i XPath motore. To je zanimljiva ideja, pogotovo jer Saxon-JS implementira trenutnu verziju ovih specifikacija, dok ne postoji preglednik koji implementira bilo koju verziju XPath-a ili XSLT-a iza 1.0, niti nijedan koji implementira XQuery. Došao sam do Norma Tovey-Walsha u Saxonici, tvrtki koja stoji iza SaxonJS i drugih verzija Saxon motora. rekao je: "Ako je bilo koji proizvođač preglednika zainteresiran uzeti SaxonJS kao početnu točku za integraciju modernih XML tehnologija u preglednik, bilo bi nam drago razgovarati s njima o tome."— Norm Tovey-Walsh
Ali također dodao: "Bio bih vrlo iznenađen kada bi itko pomislio da bi uzimanje SaxonJS-a u njegovom trenutnom obliku i njegovo ubacivanje u verziju preglednika nepromijenjeno bio idealan pristup. Dobavljač preglednika, po prirodi činjenice da izrađuje preglednik, mogao bi pristupiti integraciji na mnogo dubljoj razini nego što mi možemo 'izvana'."— Norm Tovey-Walsh
Vrijedno je napomenuti da su komentari Tovey-Walsha došli otprilike tjedan dana prije najave obustavljanja XSLT-a. Zaključak Mogla bih nabrajati unedogled. Ali nadam se da je ovo pokazalo snagu XPatha i dalo vam mnogo primjera koji pokazuju kako ga koristiti za postizanje velikih stvari. To je savršen primjer starije tehnologije u nizu preglednika koja i danas ima mnogo koristi, čak i ako nikada niste znali da postoji ili niste razmišljali o tome da je posegnete. Daljnje čitanje
“Poboljšanje otpornosti automatiziranih web testova s prirodnim jezikom” (ACM digitalna knjižnica) autora Maroun Ayli, Youssef Bakouny, Nader Jalloul i Rima Kilany Ovaj članak pruža mnogo XPath primjera za pisanje otpornih testova. XPath (MDN) Ovo je izvrsno mjesto za početak ako želite tehničko objašnjenje s detaljima kako radi XPath. Vodič za XPath (ZVON) Smatram da je ovaj vodič od najveće pomoći u mom vlastitom učenju, zahvaljujući mnoštvu primjera i jasnim objašnjenjima. XPather Ovaj interaktivni alat omogućuje vam izravan rad s kodom.