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.
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.
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>
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.
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.).
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
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 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 <
, 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 (

)
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 (?>
)
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 -->
)
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
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ší.
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.
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.