Vysoká škola ekonomická v Praze Fakulta informatiky a statistiky Vyšší odborná škola informačních služeb v Praze Generování webových stránek z XML dokumentů pomocí jazyka XSL Vypracoval: Martin Burda Vedoucí práce: Ing. David Klimánek, Ph.D. Rok vypracování: 2009
Prohlášení Prohlašuji, že jsem bakalářskou práci na téma Generování webových stránek z XML dokumentů pomocí jazyka XSL zpracoval samostatně a použil pouze zdrojů, které cituji a uvádím v seznamu použité literatury. Nemám závažný důvod proti užití této práce ve smyslu 60 Zákona č. 121/2000 Sb. o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon). V Praze dne 12. května 2009
Poděkování Rád bych poděkoval všem, kteří se podíleli na zdárném dokončení této bakalářské práce svými připomínkami či radami.
Obsah 1 Úvod... 5 2 Oddělení obsahu a vzhledu dokumentu... 7 3 Dobře zformovaný XML dokument... 9 3.1 XML dokument se skládá z tagů a obsahu... 9 3.2 Validní dokument... 11 4 Průběh transformace... 16 4.1 Transformace na straně serveru (server-side)... 17 4.2 Transformace na straně klienta (client-side)... 18 5 Jazyk XSL... 20 5.1 XSL - transformační skripty (XSLT)... 21 6 XPath jazyk pro navigaci v XML dokumentech... 28 6.1 Vztahy mezi prvky XML dokumentu... 28 6.2 Struktura XPath dotazů... 30 6.3 Funkce jazyka XPath... 32 7 Realizace vlastního projektu... 35 7.1 Použité technologie... 35 7.2 Datová struktura zobrazovaných informací... 37 7.3 Struktura XSLT skriptů zpracujících XML... 43 7.4 Volání transformační funkce z PHP... 44 8 Závěrečné zhodnocení... 46 9 Literatura... 48 5
ABSTRAKT Jazyk XML je řešením pro definování struktury dokumentů, která je nezávislá na platformě případně proprietární technologii. Využívá znakovou sadu ISO 10646, která dokáže obsáhnout všechny dnes používané znaky všech jazyků. Tyto dvě vlastnosti jsou dostatečně pádnými důvody, proč jazyk XML využívat ve větší míře než dosud a to zvláště u dokumentů, v nichž je potřeba vyhledávat informace. Pomocí XML tagů dokážeme jednotlivým částem textu přiřadit význam, který je čitelný nejen pro člověka, ale i pro stroj. Dokumenty označkované jazykem XML jsou informačně bohatší, přinášejí přehlednější strukturu a možnost správnost této struktury automaticky kontrolovat. Klíčová slova: XML, XPath, XSL, XSLT, DTD, datový typ, XML schéma ABSTRACT XML language is a solution for structure of documents definition which is platform or proprietary technology nondependent. As a character set ISO 10646 is used which is able to contain all characters of all languages used worldwide. These two characteristics are cogent arguments to use XML language more than usual, especially with documents with high need of search-through. Using XML tags we re able to give a meaning to text parts which is intelligible to both human and computer. XML tagged documents are richer with information, bring more transparent structure and the possibility to automatically control the structure correctness. Keywords: XML, XPath, XSL, XSLT, DTD, data type, XML schema 6
Úvod 1 Úvod Dnešní stav sítě Internet je z dlouhodobého hlediska neudržitelný. Je to obrovská změť dokumentů, která nemá logické uspořádání a s neustále se zvětšujícím množstvím obsahu v síti Internet se stává vyhledávání informací stále obtížnější procedurou, k níž jsou potřeba stále sofistikovanější a výpočetně náročnější metody. Tento stav vychází ze dvou faktorů: síť Internet byla navržena pro početně "malou" akademickou komunitu a pro snadné publikování a sdílení výsledků vědeckých prací. Využití technologie hypertextu je pak druhým faktorem, který přináší chaos v síti, protože umožňuje propojit jakékoliv dokumenty nehledě na jejich obsah nebo strukturu. Tím je vytvářen decentralizovaný systém uspořádání dokumentů, který sám o sobě vyhledávání činí náročnějším. Tuto náročnost ještě zvyšuje fakt, že drtivá většina dokumentů v síti Internet je tvořena pomocí jazyka (X)HTML, který popisuje pouze logickou strukturu dokumentu, nikoli však význam jeho jednotlivých částí. Jazyk XML je řešením pro definování struktury dokumentů, která je nezávislá na platformě případně proprietární technologii. Využívá znakovou sadu ISO 10646, která dokáže obsáhnout všechny dnes používané znaky všech jazyků. Tyto dvě vlastnosti jsou dostatečně pádnými důvody, proč jazyk XML využívat ve větší míře než dosud a to zvláště u dokumentů, v nichž je potřeba vyhledávat informace. Pomocí XML tagů dokážeme jednotlivým částem textu přiřadit význam, který je čitelný nejen pro člověka, ale i pro stroj. 5
Úvod Dokumenty označkované jazykem XML jsou informačně bohatší, přinášejí přehlednější strukturu a možnost správnost této struktury automaticky kontrolovat. Jazyk XML může přinést do chaotického světa Internetu skutečnou revoluci. Stejně jako jsme schopni pomocí jazyka SQL velmi rychle a efektivně získat přesné informace z databáze, je možné s využitím jazyka XML se stejnou rychlostí a efektivitou získat přesné informace z Internetu, což nám při práci s tímto médiem ušetří mnoho času, protože velkou část posouzení přesnosti nalezených informací může vykonávat přímo vyhledávací systém nikoli uživatel. 6
Oddělení obsahu a vzhledu dokumentu 2 Oddělení obsahu a vzhledu dokumentu Každý dokument se dá posoudit ze dvou úhlů pohledu. Jednak z hlediska obsahu dokumentu a jednak z hlediska jeho vzhledu. Dokumenty, které jsou závislé na obsahu a nikoliv na vzhledu, mají hned několik výhod. První výhodou je vyhledávání. Dokument, který se skládá ze dvou na sobě nezávislých částí, může být snadněji prohledáván, protože vyhledávací systém může procházet pouze tu část dokumentu, která obsahuje informace, o které má uživatel nebo aplikace, která data potřebuje ke svému běhu, zájem. To se odrazí jednak v rychlosti vyhledávání, jednak v relevanci nalezených výsledků. Druhou výhodou je možnost přiřadit jednotlivým částem dokumentu odpovídající sémantiku. Sémantika velice úzce souvisí opět s vyhledáváním. V dokumentech, které mají sémanticky definovanou strukturu je totiž vyhledávání skutečně snadné. Podle schématu dokumentu (pro XML a SGML dokumenty tzv. Document type definition, bude zmiňováno dále) známe, jaké části s jakým významem dokument obsahuje, což proces vyhledávání usnadní a zrychlí. Další výhodou dokumentů, které mají oddělený obsah a formu je možnost propojit jeden dokument s různými předpisy pro vzhled, které pak udávají, jakým způsobem se dokument bude prezentovat. To je velmi důležité právě dnes, kdy se k dokumentům (obzvlášť v síti Internet) přistupuje z různých zařízení. Prohlížení webových dokumentů již dávno není doménou pouze osobních počítačů, ale nejrůznějších přenosných 7
Oddělení obsahu a vzhledu dokumentu zařízení jako PDA, mobilních telefonů, komunikátorů apod. Jeden dokument tak může být korektně zobrazen na libovolném zařízení aniž by musel obsahovat speciální definice, které zařízení pro zobrazení dokumentu potřebuje. Ty jsou uloženy zvlášť. Takto získané dokumenty mají jeden datový základ, který je tedy nezávislý na platformě nebo softwaru, kterým data interpretujeme. Změny obsahu v takto postavených dokumentech se pak provádějí velmi snadno. Stačí upravit pouze obsahovou část dokumentu, přičemž způsobu zobrazení na jakémkoliv zařízení se změna vůbec nedotkne. Změny týkající se vzhledu pak fungují na stejném principu. Pokud chceme upravit zobrazení pouze pro některé zařízení, stačí upravit pouze příslušný předpis pro formátování dokumentu. Datová část tak zůstane beze změn, což nám garantuje, že se dokument zobrazí korektně i na ostatních zařízeních. 8
Dobře zformovaný XML dokument 3 Dobře zformovaný XML dokument Přestože jazyk XML umožňuje použít nekonečné množství tagů a jejich atributů, je potřeba následovat určitá pravidla, aby dokument byl dobře zformován. Pokud dokument není dobře zformován, jakýkoliv XML parser při čtení dokumentu vrátí chybové hlášení. XML specifikace přísně zakazuje, aby se parser pokusil chybu opravit nebo přeskočit. Jediné, co je XML parseru povoleno, je vrátit hlášení o chybě[1]. Pravidel, která je nutno dodržet k dosažení napsání dobře zformovaného dokumentu je více než 100. Naštěstí drtivá většina těchto pravidel zakazuje používání syntaxe, kterou by nepoužil ani XML začátečník. Uvedu proto pět základních (a nejčastěji porušovaných) pravidel. 3.1 XML dokument se skládá z tagů a obsahu V XML (na rozdíl od HTML) jsou všechny elementy párové, což znamená, že neexistuje neukončený tag. Názvy tagů mohou být voleny libovolně a nesmí obsahovat mezery a jsou citlivé na velká a malá písmena. 3.1.1 Použití atributů Informace, která se objevuje pouze jednou, může být v počátečním tagu zapsána formou atributu. 9
Dobře zformovaný XML dokument V následujícím případě je jako atribut zapsán název produktu: <?xml version= 1.1?> <produkt nazev= Preventan > <hmotnost>5,8g</hmotnost> <typ>tablety</typ> <mnozstvi>30ks</mnozstvi> <expirace>2011-11-27</expirace> <vyrobce>svus Pharma a.s.</vyrobce> </produkt> 3.1.2 Dokument obsahuje jeden a pouze jeden kořenový element Předchozí ukázka kódu obsahuje šest elementů. Element <produkt> je v tomto případě kořenovým tagem, protože je ve stromové struktuře dokumentu postaven nejníže a celý dokument je v tomto tagu uzavřen. 3.1.3 Elementy mají stromovou strukturu Dokument začíná kořenovým elementem a ostatní jsou jeho potomky. V ukázce č. 1 jsou potomky kořenového elementu <produkt> všechny ostatní elementy. Každý z nich může obsahovat libovolný počet potomků a tím se nám tvoří ona stromová struktura, která může být rekurzivně procházena až na úroveň nejvýše postavených elementů, které již neobsahují žádné potomky. 10
Dobře zformovaný XML dokument 3.1.4 Elementy mohou být prázdné Prázdné elementy se nemusí skládat z počátečního a uzavíracího tagu, ale mohou být tvořeny pouze jedním tagem, který je uvnitř ukončen lomítkem: <produkt nazev= Preventan /> V této ukázce je element <produkt> prázdný, nicméně obsahuje v atributu svůj název. Dá se na něj tedy nahlížet tak, že známe produkt Preventan, ale nemáme o něm žádné informace. 3.1.5 Dokument může (a měl by) být uvozen deklarací jazyka XML Deklarace jazyka XML je vždy v prvním řádku dokumentu a minimálně by měla obsahovat toto: <?xml version= 1.1?> Název tagu (xml) a atribut (version= ) jsou rezervovanými slovy jazyka. Deklarace dále může obsahovat instrukce pro zpracování dokumentu, které jsou předávány aplikaci, která dokument zpracovává[2]. 3.2 Validní dokument Hlavním argumentem, proč vytvářet validní dokumenty, je možnost automatické kontroly jejich obsahu. To je výhodné 11
Dobře zformovaný XML dokument převážně u dokumentů, které jsou používány opakovaně. Dokumentu, který je navržen pro opakovanou distribuci, jeho validita zaručuje, že nebude nikdy obsahovat jiná data, než ta, která jsou popsána v tzv. Document type definition (DTD). 3.2.1 Document type definition Validní dokument je takový, který vyhovuje své DTD, kterou má definovánu v hlavičce[3]. DTD je sada pravidel, která určují strukturu XML dokumentu. Pomocí tohoto nástroje je možné přesně definovat, jaké elementy a atributy dokument může obsahovat. DTD se zabývá i jejich potomky a atributy, případně počtem jejich výskytů. Deklaraci typu dokumentu je možné zadávat dvěma způsoby. 12
Dobře zformovaný XML dokument První možností, je deklaraci uvést uvnitř dokumentu, na jeho začátku: <?xml version= 1.1?> <!DOCTYPE produkt (hmotnost, typ, mnozstvi, expirace, vyrobce) [ <!ATTLIST produkt nazev CDATA #REQUIRED> <!ELEMENT hmotnost (#PCDATA)> <!ELEMENT typ (#PCDATA)> <!ELEMENT mnozstvi (#PCDATA)> <!ELEMENT expirace (#PCDATA)> <!ELEMENT vyrobce (#PCDATA)> ]> <leciva> <produkt nazev= Preventan > <hmotnost>5,8g</hmotnost> <typ>tablety</typ> <mnozstvi>30ks</mnozstvi> <expirace>2011-11-27</expirace> <vyrobce>svus Pharma a.s.</vyrobce> </produkt> </leciva>!doctype produkt definuje název kořenového elementu XML dokumentu a v kulaté závorce jsou uvedeny elementy, které může obsahovat.!attlist definuje elementu produkt atribut záznam, který obsahuje textovou informaci, která nebude vyhodnocována parserem (CDATA) a položka #REQUIRED vyjadřuje, že hodnota musí být zadána. 13
Dobře zformovaný XML dokument!element pak definuje názvy jednotlivých elementů. Uvnitř každého elementu se můžou nacházet 2 druhy obsahu, což můžeme také ovlivnit pomocí DTD: elementový obsah element obsahuje další elementy a žádný text. Znamená to, že má potomky s libovolným obsahem (smíšeným nebo elementovým), ale on sám textová data neobsahuje. Pouze elementy. Deklarace takového elementu by pak vypadala například takto: <!ELEMENT osoba (jmeno, prijmeni, vek, vaha, vyska)> smíšený obsah element obsahuje znaková data (text), případně znaková data a další elementy. V obou případech hovoříme o smíšeném obsahu. Klíčové slovo #PCDATA vzniklo z pojmu parsed character data a udává, že se jedná o text, který bude vyhodnocován XML parserem. Takto vypadá deklarace pro element, který obsahuje pouze znaková data: <!ELEMENT osoba (#PCDATA)> Element, který obsahuje znaková data i další elementy, je deklarován takto: <!ELEMENT osoba (#PCDATA jmeno prijmeni vek vaha vyska)*> V tomto případě musí být názvy jednotlivých potomků odděleny svislou čárou a musí být udán libovolný počet výskytů těchto elementů. V případě elementu se smíšeným obsahem tedy není možné řídit počet výskytů potomků. 14
Dobře zformovaný XML dokument Druhou možností, jak vložit do XML dokumentu deklaraci jeho typu, je použít odkaz na externí soubor. Ten se ukládá s příponou *.dtd a je výhodné, umisťovat jej do stejného adresáře, ve kterém se nachází XML soubor, na který má být toto DTD aplikováno[4]. Tento způsob deklarace vypadá takto: <!DOCTYPE produkt SYSTEM "produkt.dtd"> Je možné využít i absolutní cestu a *.dtd soubor načítat http protokolem z webového serveru. Pak by cesta k souboru vypadala např. takto: http://www.nejakyserver.cz/dtd/produkt.dtd Proces validace dokumentu pak spočívá v tom, že parser prochází XML dokument a porovnává ho oproti uvedenému DTD. V případě, že XML dokument obsahuje pouze povolené výskyty povolených elementů a jejich atributů, zobrazí jej a případně ho předá na další zpracování. Pokud však XML dokument nevyhovuje svému DTD, parser vrátí chybu a ukončí svoji činnost. Dokument pak není dále zpracováván[5]. XML dokumenty s uvedením DTD tedy obsahují jakýsi automatický kontrolní mechanismus. U dokumentů, které mají pevně danou strukturu a je obměňován pouze jejich obsah, je DTD mocným nástrojem k zachování integrity dokumentů po celou dobu jejich používání. 15
Průběh transformace 4 Průběh transformace Základní podmínkou pro provedení transformace XML do jiného formátu je přítomnost XLST procesoru na stroji, kde se má transformace provést. XSLT procesor je program, který na vstupu přijímá dva soubory. XML dokument jako zdroj dat a XSL styl jako předpis pro transformaci dat[6]. Základní schéma popisující proces transformace XML dokumentu do jiných formátů je naznačeno na obr. 1: Obr.1: Schéma XSLT transformace 16
Průběh transformace 4.1 Transformace na straně serveru (server-side) XSLT procesor může být nainstalován na serveru, kde se provede zpracování dokumentu ještě před jeho odesláním uživateli. Je nezávislý na použité serverové technologii. Většina XSLT procesorů je napsaná v jazycích Java nebo C++ (Saxon, XT, Sablotron). Pomocí serverové skriptovací technologie (nejčastěji PHP, ASP nebo ColdFusion) je pak volán pro zpracování instrukcí obsažených v XSL dokumentu a jejich aplikace na vstupní dokument XML[7]. Uživateli je pak odeslán dokument, který je výsledkem transformačního procesu. Toto řešení má nespornou výhodu v nezávislosti na technologiích, které používá koncový uživatel, protože celý proces probíhá na serveru. Uživatel tedy nevidí, co se s daty děje, před jejich doručením. 17
Průběh transformace Schéma takovéto architektury je naznačeno na obr. 2: schéma server-side transformace: Obr. 2: Schéma server-side transformace 4.2 Transformace na straně klienta (client-side) Tento způsob transformace XML dokumentů je mnohem pohodlnější, protože nevyžaduje žádné speciální serverové moduly a jejich nastavení. Je ovšem závislý na podpoře XSLT na straně klientského zařízení. Tato nevýhoda v dnešní době ustupuje víceméně do pozadí, protože drtivá většina dnes používaných prohlížečů podporu XSLT obsahuje. 18
Průběh transformace Nejjednodušším způsobem provedení transformace pomocí klientského softwaru je definovat použitý styl a jeho umístění přímo v hlavičce XML souboru: <?xml version= 1.1?> <?xml-stylesheet type="text/xsl" href="produkty.xsl"?> <leciva> <produkt nazev= Preventan > <hmotnost>5,8g</hmotnost> <typ>tablety</typ> <mnozstvi>30ks</mnozstvi> <expirace>2011-11-27</expirace> <vyrobce>svus Pharma a.s.</vyrobce> </produkt> </leciva> Druhý způsob transformace spočívá ve využití Javascriptu. Toto řešení je závislé na implementaci Javascriptu v použitém prohlížeči. Nelze ho proto doporučit pro generování obsahu, který má za cíl být zobrazován na nejrůznějších zobrazovacích zařízeních. Dnes používané webové prohlížeče Javascript plně podporují. Za poslední tři roky je však trendem přistupovat k informacím na webu pomocí nejrůznějších mobilních zařízení. Tato zařízení většinou podporu Javascriptu (popřípadě XSLT) nemají. Obsah by tudíž zůstal uživatelům těchto přístrojů nepřístupný. Z tohoto důvodu lze striktně doporučit nasazení XSLT na straně serveru, protože odesílá obsah v XHTML, které je podporováno téměř všemi přístroji přistupujícími na web. 19
Jazyk XSL 5 Jazyk XSL Jazyk XSL byl původně vyvíjen jako prostředek pro definici vzhledu XML dokumentů, které samy o sobě svůj vzhled nedefinují. Je jak- ousi paralelou kaskádových stylů (CSS) a jejich aplikací na XHTML dokumenty. Jako standard konsorcia W3C byl přijat v roce 1999. V jazyce XML jsou pro popis dat používány tagy, které si uživatel jazyka vytváří sám. XML dokument bez definice stylů v jazyce XSL je tedy prohlížečem zobrazen ve své stromové struktuře. Pro přehlednost zobrazovaných dat bývá zpravidla použito základní formátování, které je definováno v použitém prohlížeči. Jazyk XSL obsahuje formátovací část a transformační část. Každá z těchto částí je aplikací jazyka XML. Vycházejí z jeho syntaxe a samozřejmě ji striktně dodržují. Znamená to, že XSL styl je vlastně taktéž dobře zformátovaný dokument, stejně jako dokument v XML[3]. Obě tyto části mohou fungovat samostatně a jsou na sobě nezávislé. Například transformační skript může XML dokument převést do validního XHTML dokumentu a při tom naprosto ignorovat XSL formátovací objekty. 20
Jazyk XSL 5.1 XSL - transformační skripty (XSLT) 5.1.1 XSLT šablony XSLT šablona obsahuje pravidlo, podle kterého rozpoznává uzly v dokumentu, na které má aplikovat definovanou akci. Když XSLT procesor transformuje dokument pomocí XSL stylopisu, prochází zdrojový XML dokument od kořene, po jednotlivých uzlech až k uzlům nejvyšší úrovně. Ve chvíli, kdy jsou všechny uzly dokumentu přečteny a XSLT procesor má v paměti načtenou stromovou strukturu dokumentu, porovná každý uzel se všemi šablonami v XSL stylopisu[6]. V případě, že najde odpovídající šablonu, aplikuje na uzel akci, která je v šabloně definována. Akcí je myšlen zpravidla popis dat, která uzel obsahuje, XHTML kódem. 5.1.2 Struktura XSL dokumentu Kořenovým elementem XSL šablony je rezervované slovo stylesheet náležící do jmenného prostoru http://www.w3.org/1999/xsl/transform[8]. Tomuto jmennému prostoru náleží prefix xsl. Struktura XSL dokumentu pak vypadá takto: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> místo pro šablony a zpracující instrukce </xsl:stylesheet> 21
Jazyk XSL První řádek kódu podává důkaz o tom, že se jedná o XML dokument. Platí pro něj tedy také to, že musí být dobře zformován a všechna další pravidla pro vytváření dokumentů v XML formátu. Druhý řádek je kořenovým tagem dokumentu obsahující kromě názvu kořenového tagu stylesheet i deklaraci jmenného prostoru. 5.1.3 Struktura XSL šablony Šablona je uzavřena v tagu <xsl:template>. Tento tag má povinný atribut match, jehož obsahem je název uzlu v XML dokumentu, na který bude aplikován obsah šablony. Šablona pro aplikaci instrukce na kořenový element tedy vypadá takto: <xsl:template match="/"> <html> <head> </head> <body> </body> </html> </xsl:template> Prvním uzlem v XML dokumentu, na který XSLT procesor narazí je kořenový element. V XSL šabloně je označen lomítkem, takže atribut match obsahuje pouze toto lomítko[3]. Na základě této šablony tedy XSLT procesor vrátí html kód, který je uzavřen uvnitř. Stejně jako kořenový element obaluje všechny ostatní potomky v XML dokumentu, tak bude 22
Jazyk XSL vrácený html kód obalovat další obsah uvnitř výstupu. Tímto jednoduchým zápisem tak získáme kostru HTML dokumentu. 5.1.4 Zpracování potomků elementu Pro zpracování zdrojového dokumentu do celé jeho hloubky je využíván element xsl:apply-templates. Jeho umístění do místa výstupu jiného elementu způsobuje, že XSLT procesor porovnává všechny jeho potomky se šablonami ve stylopisu. Použití tohoto elementu vypadá takto: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/"> <html> <xsl:apply-templates/> <!-- prochází potomky / --> </html> </xsl:template> <xsl:template match="leciva"> <!-- nalezne-li mezi potomky tag leciva --> <body> <xsl:apply-templates/> </body> </xsl:template> <xsl:template match="preventan"> <!-- nalezne-li mezi potomky tag Preventan --> Preventan <! vypise slovo Preventan na vystup --> </xsl:template> </xsl:stylesheet> 23
Jazyk XSL 5.1.5 Výběr konkrétního potomka uzlu (atribut select) K výběru pouze některého potomka, který má být porovnáván se šablonami ve stylopisu slouží atributu select. Použití atributu select vypadá následovně: <xsl:template match="produkt"> <xsl:apply-templates select="expirace"/> </xsl:template> Tento zápis tedy způsobí, že po zpracování uzlu <produkt>, se jako další uzel pro porovnávání se šablonami v XSLT stylopisu, použije potomek uzlu <produkt> s názvem <expirace>. 5.1.6 Výpis hodnoty uzlu do výstupního dokumentu Tato instrukce přečte a zkopíruje obsah uzlu do výstupního dokumentu. Je kombinována s atributem select. Pro příklad uvádím jednoduchou instrukci, která vypíše z každého uzlu <produkt> pouze jeho výrobce: <xsl:template match="produkt"> <xsl:value-of select= vyrobce /> </xsl:template> Hodnota uzlu v XML je vždy textový řetězec (string), může být i prázdná (empty string). Pokud má uzel další potomky a je na něj aplikována instrukce <xsl:value-of select= />, na výstup budou vráceny všechny obsahy všech jeho potomků. Nikoliv kód. 24
Jazyk XSL Pro jednoduchý výpis všech informací o produktu lze tedy využít tento zápis: <xsl:template match="produkt"> <xsl:value-of select="."/> </xsl:template> Tečková maska způsobuje výpis obsahu elementu, který se shoduje s výběrem. 5.1.7 Podmíněné zpracování více uzlů V XSLT existuje for - cyklus, který umožňuje zpracovávat více uzlů. Pro jeho provedení se používá instrukce <xsl:for-each select= > a šablona, která je v tomto cyklu zapsána se provede na všechny uzly, které vyhovují dotazu v atributu select. 25
Jazyk XSL Zápis této instrukce je uveden v následujícím příkladu: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/"> <html> <body> <ul> <xsl:for-each select= produkt > <li><xsl:value-of select= vyrobce ></li> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet> Tento jednoduchý zápis vrátí na výstup nečíslovaný (odrážkový) seznam všech výrobců, vyskytujících se ve zdrojovém XML dokumentu. 5.1.8 Seřazení výstupu Používáme-li for cyklus, můžeme data na výstupu řadit pomocí instrukce <xsl:sort select= >. Instrukce musí být zapsána uvnitř for cyklu a to na prvním místě, ještě před instrukcemi pro zpracování dat. Řazení se dá samozřejmě ovládat co do pořadí, řazení podle více kritérií i datových typů. Pořadí řazení (vzestupně nebo sestupně) je prováděno pomocí atributu order. Pro řazení podle více kritérií je potřeba zadat 26
Jazyk XSL více instrukcí za sebou. Znamená to, že za sebe píšeme celé instrukce <xsl:sort> a do atributu select zadáváme kritéria pro řazení. Jako tato kritéria slouží názvy elementů a řadí se podle dat, která elementy obsahují. V následujícím příkladu je kód, řadící produkty podle názvu a výrobce: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/"> <html> <body> <ul> <xsl:for-each select= produkt > </ul> <xsl:sort select= nazev > <xsl:sort select= vyrobce > <li><xsl:value-of select= vyrobce ></li> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> Takovýto zápis instrukcí po sobě vrátí požadovaná data, příslušně seřazena. 27
XPath jazyk pro navigaci v XML dokumentech 6 XPath jazyk pro navigaci v XML dokumentech Jazyk XPath je od roku 1999 standardem konsorcia W3C, nyní ve verzi 2.0. Patří do rodiny dotazovacích jazyků pro XML, nicméně nejedná se o plnohodnotný dotazovací jazyk[11]. Jeho hlavní funkcí je adresování částí XML dokumentu na základě dotazů (výrazů) zadaných uživatelem. Sám o sobě se tento jazyk nepoužívá, byl vytvořen pro spolupráci s jinými technologiemi pracujícími s XML dokumenty jako XSLT nebo XPointer. 6.1 Vztahy mezi prvky XML dokumentu Pokud je XML dokument dobře zformován, je logicky možné, pohybovat se stromovou strukturou po jednotlivých uzlech. V tuto chvíli přichází jazyk XPath, který poskytuje standardní řešení pro procházení XML dokumentu[12]. V XML dokumentech existují čtyři možné vztahy mezi uzly. Názvy jsou používány i z jiných stromových struktur, nejen z XML. Rodič (parent) Uzel označovaný jako rodič je nadřazeným uzlem pro skupinu jiných uzlů. Skupina uzlů, která je uzavřena uvnitř nadřazeného uzlu má tak jednoho rodiče, kterým je onen nadřazený uzel. 28
XPath jazyk pro navigaci v XML dokumentech Sourozenec (sibling) Toto označení platí pro uzly, které mají stejného rodiče. Ve stromové struktuře dokumentu jsou tedy na stejné úrovni. Potomek (descendant) Potomci jsou uzly, které mají alespoň jeden nadřazený uzel. Jediný uzel v každém XML dokumentu, který není potomkem žádného uzlu, je kořenový uzel. Nemá žádný nadřazený uzel. Naopak všechny ostatní uzly v dokumentu jsou potomky kořenového uzlu, protože je možné od kořenového uzlu rekurzivně projít celý dokument a přečíst všechny ostatní uzly. Předek (ancestor) Označení předek je používáno pro všechny nadřazené uzly jinému uzlu. Stejně jako je možné od rodiče procházet rekurzivně všechny potomky, stejně tak můžeme rekurzivně procházet všechny jeho předky. 29
XPath jazyk pro navigaci v XML dokumentech Tyto vztahy mezi uzly jsou naznačeny na obr. 3: Vztahy mezi XML uzly. Obr. 3: Vztahy mezi uzly XML dokumentu 6.2 Struktura XPath dotazů Dotazy v jazyce XPath do jisté míry připomínají syntaxi cesty v souborovém systému unix-like operačních systémů[12]. Dotaz přesně popisuje cestu k dané části dokumentu, přičemž zmiňuje všechny uzly, přes které cesta vede. Nelze žádný vynechat. 6.2.1 Lomítko (/) Jako oddělovač jednotlivých kroků se používá lomítko (/). Pokud chceme kdekoliv v dokumentu začít prohledávat jeho začátek, je nutné, aby XPath výraz lomítkem začínal. Tímto sdělujeme XSLT procesoru, že má začít od kořenového elementu. 30
XPath jazyk pro navigaci v XML dokumentech Pokud bychom tedy chtěli k dalšímu zpracování vybrat obsah všech tagů hmotnost, které jsou potomky tagu produkt, který je potomkem tagu leciva, zápis výrazu by vypadal takto: leciva/produkt/hmotnost 6.2.2 Výběr podle potomka Pro výběr konkrétního elementu podle toho, zda obsahuje konkrétního potomka, se používá zápis názvu potomka do XPath výrazu. Název požadovaného potomka musí být uzavřen v hranatých závorkách. Výběr pouze těch elementů, které obsahují potomka s názvem vyrobce se zapisuje takto: leciva/produkt[vyrobce] Detailnějším výběrem pak může být definice obsahu potomka. Následující výraz vybere pouze všechny elementy produkt, které obsahují potomka s názvem výrobce, který obsahuje text Ratiopharm : leciva/produkt[vyrobce= Ratiopharm ] 6.2.3 Výběr elementu podle atributu a jeho hodnoty Používáme-li v XML elementech atributy, je možné jejich hodnoty použít pro XPath dotaz. Pro označení výběru podle atributu se používá znak zavináč (@). Pro výběr elementu produkt, který obsahuje atribut název, zapisujeme výraz takto: 31
XPath jazyk pro navigaci v XML dokumentech /leciva/produkt[@nazev] Stejně jako v předchozím případě je možné dotazovat se pouze na elementy s atributy s konkrétním obsahem: leciva/produkt/[@nazev= Preventan ] Výše uvedené dotazy jazyka XPath demonstrují základní techniky dotazování se na konkrétní části XML dokumentů. Jazyk XPath samozřejmě obsahuje mnohem širší možnosti dotazování podle nejrůznějších kritérií. Pro základní pohyb stromovou strukturou XML dokumentů však výše uvedené příklady postačí a detailní popis ostatních možností jazyka XPath je nad rámec této práce. 6.3 Funkce jazyka XPath Ve specifikaci jazyka XPath je zahrnuto nejen adresování částí dokumentu, ale i manipulace s daty[11]. Jazyk XPath obsahuje čtyři sady funkcí, které umožňují manipulovat s daty před jejich předáním pro další zpracování. 6.3.1 Funkce pro práci s uzly Tato sada neumí pracovat s obsahem uzlů, ale pouze s uzly samotnými. Umožňuje vracet např: počet uzlů ve vybrané sadě uzlů (počet uzlů vyhovujících dotazu) (funkce count) vybírat uzly podle atributů (funkce id) 32
XPath jazyk pro navigaci v XML dokumentech vracet pozici uzlu vůči rodičovskému uzlu (funkce position) a další. 6.3.2 Funkce pro práci s textovým obsahem uzlů Pro manipulaci s textem, který je obsažen uvnitř uzlů v XML dokumentu, je možné využít funkce z této sady. Funkce umožňují např.: vrátit text uzlů, které obsahují určitý text (funkce contains) vrátit text uzlů, které začínají definovaným znakem (funkce starts-with) vrátit obsah vyhovujících uzlů, spojený do jediného textového řetězce (funkce concatenate) 6.3.3 Booleovské funkce Booleovské funkce mají v jazyce XPath stejné vlastnosti jako v jakémkoliv jiném. 6.3.4 Funkce pro práci s čísly Jazyk XPath umožňuje též práci s číselnými hodnotami. Používá standardní operátory (+, -, *, div, mod). Před vrácením výsledku je možné vyhovující argumenty: zaokrouhlit na celé číslo nahoru nebo dolů (funkce ceiling, floor) zaokrouhlit argument na nejbližší celočíselnou hodnotu (funkce round) 33