Kurz XPath

V tomto kurzu vám bude poskytnut mírný úvod do XPath, dotazovací jazyk, který může být použit pro výběr libovolných částí dokumentů HTML v Calibre. XPath je široce používaný standard a jeho vyhledání na Google vám poskytne mnoho informací. Tento kurz se však zaměřuje na používání XPath pro úkoly spojené s e-knihami, jako je hledání nadpisů kapitol v nestrukturovaném dokumentu HTML.

Výběr podle názvu značky

Nejjednodušší forma výběru je vybrat značky podle názvu. Například předpokládejme, že chcete vybrat v dokumentu všechny značky <h2>. Dotaz XPath pro toto je jednoduše:

//h:h2        (Selects all <h2> tags)

Předpona // znamená hledat na jakékoliv úrovni dokumentu. Nyní předpokládejme, že chcete hledat značky <span>, které jsou uvnitř značek <a>. Toho může být dosaženo pomocí:

//h:a/h:span    (Selects <span> tags inside <a> tags)

Pokud chcete hledat značky na určité úrovni v dokumentu, změňte předponu:

/h:body/h:div/h:p (Selects <p> tags that are children of <div> tags that are
             children of the <body> tag)

Toto porovná pouze <p>Velice krátká e-kniha pro ukázání použití XPath.</p> v Ukázková e-kniha, ale ne žádné další značky <p>. Předpona h: ve výše uvedených příkladech je zapotřebí pro porovnání značek XHTML. To je proto, že Calibre vnitřně představuje celý obsah jako XHTML. V XHTML mají značky obor názvů a h: je předpona oboru názvů pro značky HTML.

Nyní předpokládejme, že chcete vybrat jak značky <h1>, tak <h2>. K tomu potřebujeme konstrukci XPath zvanou predikát. Predikát je jednoduše test, který je použitý pro výběr značek. Testy mohou být libovolně výkonné, a jak bude tento kurz postupovat, uvidíte výkonnější příklady. Predikát je vytvořen uzavřením testovacího výrazu do hranatých závorek:

//*[name()='h1' or name()='h2']

V tomto výrazu XPath je několik nových funkcí. První je použití zástupného znaku *. Ten znamená porovnat jakoukoliv značku. Nyní se podívejte na testovací výraz name()='h1' or name()='h2'. name() je příklad vestavěné funkce. Jednoduše vyhodnocuje podle názvu značky. Takže jejím použitím můžeme vybrat značky, jejichž názvy jsou buď h1 nebo h2. Pamatujte, že funkce name() ignoruje obory názvů, takže není potřeba předpona h:. XPath má několik užitečných vestavěných funkcí. V tomto kurzu bude představeno několik dalších.

Výběr podle atributů

Pro výběr značek na základě jejich atributů je požadováno použití predikátů:

//*[@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")

Operátor @ zde odkazuje na atributy značky. Můžete použít některé z vestavěných funkcí XPath pro provedení propracovanějšího porovnání hodnot atributů.

Výběr podle obsahu značky

Pomocí XPath můžete dokonce vybrat značky na základě textu, který obsahují. Nejlepší způsob, jak to udělat, je použít sílu regulárních výrazů pomocí vestavěné funkce re:test():

//h:h2[re:test(., 'chapter|section', 'i')] (Selects <h2> tags that contain the words chapter or
                                          section)

Operátor . zde odkazuje na obsah značky, stejně jako operátor @ odkazoval na její atributy.

Ukázková 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>

Vestavěné funkce XPath

name()
Název aktuální značky.
contains()
contains(s1, s2) vrací true, pokud s1 obsahuje s2.
re:test()
re:test(zdroj, vzor, příznaky) vrací true, pokud řetězec zdroj odpovídá regulárnímu výrazu vzor. Obzvlášť užitečný příznak je i, porovnání je pak bez rozlišení malých a velkých písmen. Dobré základy syntaxe pro regulární výrazy můžete nalézt na syntaxe regexp