Uvod u XPath¶
U ovom vodiču upoznaćete osnove jezika XPath, koji omogućava izbor bilo kog dela HTML dokumenta u programu calibre. XPath je široko prihvaćen standard o kojem možete pronaći mnogo dodatnih informacija. Ovde se usredsređujemo na njegovu upotrebu pri radu s e-knjigama, na primer na pronalaženje naslova poglavlja u HTML dokumentu bez jasne strukture.
Izbor po nazivu oznake¶
Najjednostavnije je izabrati oznake po nazivu. Pretpostavimo, na primer, da želite da izaberete sve oznake <h2> u dokumentu. XPath upit glasi:
//h:h2 (Selects all <h2> tags)
Prefiks // znači pretraži sve nivoe dokumenta. Ako želite da pronađete oznake <span> unutar oznaka <a>, upotrebite:
//h:a/h:span (Selects <span> tags inside <a> tags)
Ako želite da tražite oznake na određenom nivou dokumenta, promenite prefiks:
/h:body/h:div/h:p (Selects <p> tags that are children of <div> tags that are
children of the <body> tag)
Ovo će u Primer e-knjige pronaći samo <p>A very short e-book to demonstrate the use of XPath.</p>, a ne i ostale oznake <p>. Prefiks h: u gornjim primerima potreban je za prepoznavanje XHTML oznaka, jer calibre sav sadržaj interno predstavlja kao XHTML. U XHTML-u oznake imaju imenski prostor, a h: je njegov prefiks za HTML oznake.
Pretpostavimo da želite da izaberete i oznake <h1> i oznake <h2>. Za to nam je potreban XPath izraz koji se zove predikat. Predikat je uslov na osnovu kojeg se biraju oznake. Takvi uslovi mogu biti veoma složeni, a kasnije ćemo videti još primera. Predikat se piše tako što se uslov stavi između uglastih zagrada:
//*[name()='h1' or name()='h2']
U ovom XPath izrazu ima nekoliko novih elemenata. Prvi je džoker znak *, koji znači bilo koja oznaka. Zatim pogledajte uslov name()='h1' or name()='h2'. Funkcija name() je primer ugrađene funkcije: vraća naziv oznake. Pomoću nje biramo oznake čiji je naziv h1 ili h2. Pošto name() zanemaruje imenske prostore, prefiks h: ovde nije potreban. XPath ima i druge korisne ugrađene funkcije; neke ćemo upoznati u nastavku.
Izbor po atributima¶
Da biste birali oznake na osnovu njihovih atributa, koristite predikate:
//*[@style] (Select all tags that have a style attribute)
//*[@class="chapter"] (Select all tags that have class="chapter")
//h:h1[@class="bookTitle"] (Select all h1 tags that have class="bookTitle")
Ovde se operator @ odnosi na atribute oznake. Za složenije poređenje vrednosti atributa možete koristiti neke od XPath built-in functions.
Белешка
Kada se XPath izrazi koriste u podešavanjima konverzije, na primer za otkrivanje poglavlja ili određivanje mesta na kojem počinje čitanje, primenjuju se na ulazni dokument, pre nego što calibre objedini CSS. Pri tome se nazivi klasa menjaju, pa nazivi koje vidite u konvertovanoj knjizi (kao što je calibre1) još ne postoje kada se XPath izraz izvršava. Preuzimajte nazive klasa iz ulaznog dokumenta, a ne iz konvertovane knjige. Ako niste sigurni, birajte po nazivima oznaka i tekstu, jer se oni tokom konverzije ne menjaju.
Izbor po sadržaju oznake¶
Pomoću XPath-a možete birati oznake i na osnovu teksta koji sadrže. Najbolje je da za to upotrebite regularne izraze preko ugrađene funkcije re:test():
//h:h2[re:test(., 'chapter|section', 'i')] (Selects <h2> tags that contain the words chapter or
section)
Ovde se operator . odnosi na sadržaj oznake, kao što se operator @ odnosi na njene atribute.
Primer e-knjige¶
<html>
<head>
<title>A very short e-book</title>
<meta name="charset" value="utf-8" />
</head>
<body>
<h1 class="bookTitle">A very short e-book</h1>
<p style="text-align:right">Written by Kovid Goyal</p>
<div class="introduction">
<p>A very short e-book to demonstrate the use of XPath.</p>
</div>
<h2 class="chapter">Chapter One</h2>
<p>This is a truly fascinating chapter.</p>
<h2 class="chapter">Chapter Two</h2>
<p>A worthy continuation of a fine tradition.</p>
</body>
</html>
Ugrađene XPath funkcije¶
- name()¶
Naziv trenutne oznake.
- contains()¶
contains(s1, s2)vraća true ako s1 sadrži s2.- re:test()¶
re:test(src, pattern, flags)vraća true ako se tekst src poklapa s regularnim izrazom pattern. Naročito je korisna zastavicai, koja zanemaruje razliku između velikih i malih slova. Uvod u sintaksu regularnih izraza nalazi se u dokumentaciji.
