Návod na XPath¶
V tomto návode dostanete jemný úvod do XPath, jazyka dopytov, ktorý možno použiť na výber ľubovoľných častí dokumentov HTML v calibre. XPath je široko používaný štandard a jeho googlenie vám poskytne tony informácií. Tento návod sa však zameriava na používanie XPath pri úlohách súvisiacich s e-knihami, ako je hľadanie nadpisov kapitol v neštruktúrovanom HTML dokumente.
Výber podľa názvu značky¶
Najjednoduchšou formou výberu je výber značiek podľa názvu. Predpokladajme napríklad, že chcete vybrať všetky značky <h2> v dokumente. XPath dopyt na to je jednoducho:
//h:h2 (Selects all <h2> tags)
Predpona // znamená hľadať na ľubovoľnej úrovni dokumentu. Teraz predpokladajme, že chcete hľadať značky <span>, ktoré sú vnútri značiek <a>. To sa dá dosiahnuť takto:
//h:a/h:span (Selects <span> tags inside <a> tags)
Ak chcete hľadať značky na konkrétnej úrovni dokumentu, zmeňte predponu:
/h:body/h:div/h:p (Selects <p> tags that are children of <div> tags that are
children of the <body> tag)
Toto bude zodpovedať iba <p>Veľmi krátka e-kniha na demonštráciu použitia XPath.</p> v Vzorová e-kniha, ale žiadnym z ostatných značiek <p>. Predpona h: vo vyššie uvedených príkladoch je potrebná na zhody so značkami XHTML. Dôvodom je, že calibre interne reprezentuje všetok obsah ako XHTML. V XHTML majú značky mený priestor a h: je predpona menného priestoru pre značky HTML.
Teraz predpokladajme, že chcete vybrať značky <h1> aj <h2>. Na to potrebujeme konštrukt XPath s názvom predikát. Predikát je jednoducho test, ktorý sa používa na výber značiek. Testy môžu byť ľubovoľne výkonné a ako bude tento návod postupovať, uvidíte výkonnejšie príklady. Predikát sa vytvorí uzavretím testovacieho výrazu do hranatých zátvoriek:
//*[name()='h1' or name()='h2']
V tomto výraze XPath je niekoľko nových funkcií. Prvou je použitie zástupného znaku *. Znamená zhoda s ľubovoľnou značkou. Teraz sa pozrite na testovací výraz name()='h1' or name()='h2'. name() je príkladom vstavanej funkcie. Jednoducho sa vyhodnotí na názov značky. Takže pomocou nej môžeme vybrať značky, ktorých názvy sú buď h1, alebo h2. Všimnite si, že funkcia name() ignoruje menné priestory, takže nie je potrebná predpona h:. XPath má niekoľko užitočných vstavaných funkcií. Niekoľko ďalších bude predstavených v tomto návode.
Výber podľa atribútov¶
Na výber značiek na základe ich atribútov je potrebné použiť predikáty:
//*[@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")
Tu operátor @ odkazuje na atribúty značky. Na sofistikovanejšie porovnávanie hodnôt atribútov môžete použiť niektoré z vstavaných funkcií XPath.
Poznámka
Keď sa výrazy XPath používajú na možnosti konverzie, ako je detekcia kapitol alebo pozícia začiatku čítania, vyhodnocujú sa voči vstupnému dokumentu, predtým než calibre zploští CSS. Zploštenie CSS prepisuje názvy tried, takže názvy tried, ktoré vidíte vo výstupnom konvertovanom dokumente (napríklad calibre1), ešte neexistujú, keď sa váš výraz spustí. Kopírujte názvy tried zo vstupného dokumentu, nie z konvertovanej knihy. Ak máte pochybnosti, radšej použite zhodu podľa názvov značiek a textového obsahu, pretože tie sa konverziou nemenia.
Výber podľa obsahu značky¶
Pomocou XPath môžete vyberať značky dokonca na základe textu, ktorý obsahujú. Najlepším spôsobom, ako to urobiť, je využiť silu regulárnych výrazov prostredníctvom vstavanej funkcie re:test():
//h:h2[re:test(., 'chapter|section', 'i')] (Selects <h2> tags that contain the words chapter or
section)
Tu operátor . odkazuje na obsah značky, rovnako ako operátor @ odkazoval na jej atribúty.
Vzorová e-kniha¶
<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>
Vstavané funkcie XPath¶
- name()¶
Názov aktuálnej značky.
- contains()¶
contains(s1, s2)vráti true, ak s1 obsahuje s2.- re:test()¶
re:test(src, pattern, flags)vráti true, ak reťazec src zodpovedá regulárnemu výrazu pattern. Obzvlášť užitočný príznak jei, ktorý zabezpečí, že zhoda nerozlišuje veľkosť písmen. Dobrý úvod do syntaxe regulárnych výrazov nájdete na syntax regulárnych výrazov
