Potřebujete pomoci s XSLT?
Nabízím školení, konzultace, vývoj XSLT kódu na zakázku. Nevájte a kontaktujte mne.

Podpořte provoz stránek
Platba probíhá pomocí služby PayPal a je možné platit kartou nebo převodem z vašeho PayPal účtu.

Kapitola 2. XPath

2.1. Abstraktní model dokumentu
2.1.1. Typy uzlů
2.1.2. Vztahy mezi uzly – osy pro pohyb v dokumentu
2.2. Výrazy
2.2.1. Výrazy pro výběr části dokumentu pomocí cesty
2.2.2. Kontext pro vyhodnocování výrazů
2.2.3. Operátory
2.2.4. Funkce

Jazyk XPath umožňuje zapisovat výrazy, jejichž výsledkem je nejčastěji množina uzlů. Pro správné pochopení principu XPath výrazů musíme znát model dokumentu, nad kterým se operuje.

2.1 Abstraktní model dokumentu

XSLT procesor nepracuje přímo s fyzickou reprezentací XML dokumentu v souboru, ale operuje nad abstraktním modelem dokumentu, který si obvykle vytvoří v paměti. Model vychází se samostatné specifikace XML Infoset.

2.1.1 Typy uzlů

Celý dokument je reprezentován jako strom, který obsahuje uzly několika typů. Obrázek 2.1 – „Ukázka stromové reprezentace dokumentu XML“ zachycuje ukázkovou stromovou reprezantaci pro následující dokument.

<osoba>
  <jméno>Pepa</jméno>
  <syn>Pankrác</syn>
  <syn>Servác</syn>
</osoba>

Obrázek 2.1. Ukázka stromové reprezentace dokumentu XML

Ukázka stromové reprezentace dokumentu XML

Každý uzel ve stromové reprezentaci má kromě typu i svůj obsah. Ten se skládá z textu, který uzel obsahuje. Pro elementy, které nejsou listy, se text získá tak, že se spojí textové uzly, které jsou jeho potomky. Uzly, u kterých to má smysl, mají i svůj název.

kořenový uzel

Umělý kořen stromové reprezentace, neodpovídá žádnému elementu v dokumentu. Jeho dítětem je vždy kořenový element dokumentu a případně další uzly (komentáře, instrukce pro zpracování apod.).

elementy

Každý element tvoří samostatný uzel stromu. Hierarchie elementů v dokumentu přitom odpovídá hierarchii uzlů ve stromové reprezentaci.

  • jako děti uzlu mohou být další elementy, textové uzly, komentáře nebo instrukce pro zpracování

  • k uzlu mohou být připojeny atributy a jmenné prostory

  • název uzlu odpovídá názvu elementu

  • hodnota uzlu je spojení všech textových uzlů – potomků – v pořadí výskytu v dokumentu

atributy

Každý atribut je ve stromu připojen k odpovídajícímu elementu. Uzel je vytvořen jednak pro atributy přímo uvedené v dokumentu, a také pro atributy, které mají deklarovanou standardní hodnotu nebo jsou #FIXED.

  • uzel je pouze připojen k elementovému uzlu, není chápán jako jeho dítě

  • element, ke kterému je uzel připojený, se chápe jako jeho rodič

  • vždy se jedná o listový uzel

  • název uzlu odpovídá názvu atributu

  • hodnotou uzlu je hodnota atributu

textové uzly

Textové uzly odpovídají textovému obsahu elementů. Automaticky jsou v nich nahrazeny výskyty všech entit – jak znakových, tak i interních či externích textových, skutečným textem.

Jestliže máme ve vstupním textu odkaz na entitu &lt;, bude v textovém uzlu již přímo uložen znak `<'.

Sekce CDATA jsou přímo vloženy do textového uzlu, nemůžeme zjistit, kde v dokumentu byly, a kde ne.

  • uzel nemá název

  • uzel nemůže mít děti

  • vždy jde o listový uzel

  • všechny konce řádek jsou převedeny na jeden znak LF (&#xA;)

instrukce pro zpracování

Pro každou instrukci se ve stromu vytvoří samostatný uzel, který obsahuje jak cíl, tak i samotný obsah instrukce.

  • vždy jde o listový uzel

  • názvem uzlu je cíl instrukce

  • uzel nemá děti

  • obsahem uzlu je obsah instrukce uvedený za cílem instrukce a bílými znaky až do znaku pro konec instrukce (?>)

komentáře

Pro každý komentář se ve stromu vytvoří odpovídající uzel. To je užitečné, pokud komentáře obsahují nějaké instrukce ovlivňující zpracování. Elegantnější způsob je však zařazení těchto příkazů do dokumentu pomocí instrukcí pro zpracování.

  • vždy jde o listový uzel

  • uzel nemá název

  • uzel nemá děti

  • obsahem uzlu je komentář mezi znaky ohraničujícími komentář (<!-- a -->)

jmenné prostory

Uzel nese informaci o jmenném prostoru, který je deklarován. Deklarace jmenného prostoru se dědí a proto je i tento uzel přítomný na potomcích uzlu, který odpovídá elementu s deklarací jmenného prostoru.

  • uzel je pouze připojen k elementovému uzlu, není chápán jako jeho dítě

  • element, ke kterému je uzel připojený, se chápe jako jeho rodič

  • vždy se jedná o listový uzel

  • název uzlu odpovídá prefixu jmenného prostoru

  • hodnotou uzlu je URI adresa jmenného prostoru

Poznámka

Abstraktní model dokumentu je velice podobný modelu, který se používá v DOM. Modely však nejsou zcela shodné a v některých ohledech se liší.

2.1.2 Vztahy mezi uzly – osy pro pohyb v dokumentu

Mezi uzly můžeme přecházet po několika různých osách (axis). Na obrázku 2.2 – „Vztahy mezi uzly ve stromové reprezentaci XML dokumentu“ vidíme, jaké uzly jsou na jednotlivých osách dostupné vzhledem k vybranému aktuálnímu uzlu.

Obrázek 2.2. Vztahy mezi uzly ve stromové reprezentaci XML dokumentu

Vztahy mezi uzly ve stromové reprezentaci XML dokumentu

Abychom si názorně ukázali, jak se nějaký skutečný XML dokument převede na stromovou reprezentaci, máme zde jednoduchý dokument.

Příklad 2.1. Jednoduchý ukázkový dokument

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="styl.xsl" type="text/xsl"?>
<dokument autor="Pepa" datum="12.7.2000">
  <nazev>Ukázkový dokument</nazev>
  <autor xmlns:xlink="http://www.w3.org/1999/xlink">
    <odkaz xlink:type="simple" 
           xlink:href="http://www.kosek.cz">Jiří Kosek</odkaz>
  </autor>
  <odst zarovnej="doleva">
    Nějaký text,<?pub line-break?> aby se neřeklo</odst>
</dokument>

Pro zjištění struktury stromové reprezentace využijeme speciální styl showtree.xsl, který projde celý strom dokumentu a v textové podobě nám znázorní jeho strukturu. První výpis neobsahuje uzly vyhrazené jmenným prostorům.

SHOWTREE Stylesheet - http://www.CraneSoftwrights.com/resources/
Processor: SAXON 6.0 from Michael Kay of ICL
1  Proc. Inst. 'xml-stylesheet': {href="styl.xsl" type="text/xsl"}
2  Element 'dokument': 
2.A  Attribute 'autor': {Pepa}
2.B  Attribute 'datum': {12.7.2000}
2.1  Text (dokument): {
  }
2.2  Element 'nazev' (dokument): 
2.2.1  Text (dokument,nazev): {Ukázkový dokument}
2.3  Text (dokument): {
  }
2.4  Element 'autor' (dokument): 
2.4.1  Text (dokument,autor): {
    }
2.4.2  Element 'odkaz' (dokument,autor): 
2.4.2.A  Attribute '{http://www.w3.org/1999/xlink}xlink:type': {simple}
2.4.2.B  Attribute '{http://www.w3.org/1999/xlink}xlink:href': {http://www.kosek.cz}
2.4.2.1  Text (dokument,autor,odkaz): {Jiří Kosek}
2.4.3  Text (dokument,autor): {
  }
2.5  Text (dokument): {
  }
2.6  Element 'odst' (dokument): 
2.6.A  Attribute 'zarovnej': {doleva}
2.6.1  Text (dokument,odst): {
    Nějaký text,}
2.6.2  Proc. Inst. 'pub' (dokument,odst): {line-break}
2.6.3  Text (dokument,odst): { aby se neřeklo}
2.7  Text (dokument): {
}

Druhý výstup obsahuje kompletní strom včetně jmenných prostorů připojených k jednotlivým uzlům.

SHOWTREE Stylesheet - http://www.CraneSoftwrights.com/resources/
Processor: SAXON 6.0 from Michael Kay of ICL
1  Proc. Inst. 'xml-stylesheet': {href="styl.xsl" type="text/xsl"}
2  Element 'dokument': 
2.I  Namespace '{http://www.w3.org/XML/1998/namespace}xml': {http://www.w3.org/XML/1998/namespace}
2.A  Attribute 'autor': {Pepa}
2.B  Attribute 'datum': {12.7.2000}
2.1  Text (dokument): {
  }
2.2  Element 'nazev' (dokument): 
2.2.I  Namespace '{http://www.w3.org/XML/1998/namespace}xml': {http://www.w3.org/XML/1998/namespace}
2.2.1  Text (dokument,nazev): {Ukázkový dokument}
2.3  Text (dokument): {
  }
2.4  Element 'autor' (dokument): 
2.4.I  Namespace '{http://www.w3.org/XML/1998/namespace}xml': {http://www.w3.org/XML/1998/namespace}
2.4.II  Namespace '{http://www.w3.org/1999/xlink}xlink': {http://www.w3.org/1999/xlink}
2.4.1  Text (dokument,autor): {
    }
2.4.2  Element 'odkaz' (dokument,autor): 
2.4.2.I  Namespace '{http://www.w3.org/XML/1998/namespace}xml': {http://www.w3.org/XML/1998/namespace}
2.4.2.II  Namespace '{http://www.w3.org/1999/xlink}xlink': {http://www.w3.org/1999/xlink}
2.4.2.A  Attribute '{http://www.w3.org/1999/xlink}xlink:type': {simple}
2.4.2.B  Attribute '{http://www.w3.org/1999/xlink}xlink:href': {http://www.kosek.cz}
2.4.2.1  Text (dokument,autor,odkaz): {Jiří Kosek}
2.4.3  Text (dokument,autor): {
  }
2.5  Text (dokument): {
  }
2.6  Element 'odst' (dokument): 
2.6.I  Namespace '{http://www.w3.org/XML/1998/namespace}xml': {http://www.w3.org/XML/1998/namespace}
2.6.A  Attribute 'zarovnej': {doleva}
2.6.1  Text (dokument,odst): {
    Nějaký text,}
2.6.2  Proc. Inst. 'pub' (dokument,odst): {line-break}
2.6.3  Text (dokument,odst): { aby se neřeklo}
2.7  Text (dokument): {
}

Můžeme si všimnout, že stromová reprezentace obsahuje spoustu textových uzlů, které obsahují jen mezery a konce řádků. V další části školení si ukážeme, jak můžeme XSLT procesor instruovat k tomu, aby tyto nevýznamné mezery ignoroval.

© Jiří Kosek 2014

Tento dokument je určen výhradně pro osobní potřebu seznámení s jazykem XSLT. Jakékoliv jiné použití, včetně dalšího šíření, pořizování kopií, použití při školeních a výuce apod. je výslovně zakázáno a bude považováno za porušení autorských práv.


Copyright © 2000-2014 Jiří Kosek