XML jako značkovací jazyk je již poměrně dobře zažitým pojmem a není třeba jej nijak představovat. S tímto značkovacím jazykem úzce souvisí transformační jazyk XSLT (eXtensible Stylesheet Language Transformations), který byl bohužel dosud poněkud opomíjen. Pojďme se mu tedy podívat na zoubek!

Základy XML již má za sebou snad každý čtenář Interval.cz, a pokud ne, měl by to rychle dohnat. Bez jeho znalosti se zde totiž neobejdeme. XSLT nám umožní teoretické přednosti formátu XML přenést trochu více do praxe. Na následujících řádcích se dozvíte, jak to myslím. Tento úvodní článek ovšem bude pouze rozehřívací, XSLT si představíme jako celek a ukážeme si jednoduchý příklad využití. Samotná výuka jazyka začne až v následujících článcích.

K čemu je XSLT?

Začneme tedy trochu zeširoka. Popisný značkovací jazyk XML má řadu vlastností, díky kterým se mohl uchytit. Je snadno zapisovatelný i čitelný, a to jak pro člověka tak i pro stroj, hlavně díky existenci nástrojů a knihoven snad na všech existujících platformách. Přesto je to jen formát pro zabalení nějakých (převážně textových) dat. S těmito daty je ale třeba dále nějak pracovat. XML parser nám umožní data z tohoto formátu vydolovat, ale další zpracování (například vygenerování HTML výstupu) je pro programátora poněkud nezáživné. Znamená totiž obvykle iterovat jednotlivými položkami a získaná data opět balit do jiných značek. Nebylo by lepší vymyslet nějaký efektivnější a flexibilnější přístup k tomuto problému?

Jádro problému spočívá vlastně v transformaci dat z XML dokumentu do podoby, kterou vyžadujeme. Běžné programovací jazyky jsou sice poměrně silné, avšak jednodušší by bylo využití jazyka určeného přímo na takovéto XML transformace. Ano, tušíte správně, tímto jazykem je právě XSLT. Princip využití XSLT lze velmi jednoduše vyjádřit následujícím diagramem:

Princip využití XSLT

Takže jak zpracování XML dat probíhá? Programátor ve svém kódu zavolá XSLT procesor a předá mu vstupní XML data a XSLT styl, což je vlastně předpis, podle kterého se XML data budou zpracovávat. XSLT procesor pak vygeneruje výstupní data. Jak takový procesor funguje uvnitř, to nás vůbec nemusí zajímat.

Tento postup je pro programátora mnohem jednodušší a přímočařejší, než „ruční“ zpracování. Pokud by musel řešit transformaci algoritmicky, bylo by to něco na způsob „najdi element A, vlož jej do elementu B, přidej element C, a takhle pokračuj dokola, dokud jsou nějaké elementy A k dispozici“. XSLT ale umožňuje zapsat „elementy A nahraď elementy B s doplněním C“. Je to sice řečeno velice volně, ale dáte mi za pravdu, až uvidíte příklady.

A na jakém základě postavit jazyk pro zpracování XML dat? Samozřejmě opět na XML. Dostáváme se tak do stavu, kdy lze v aplikaci snadno vytvářet různé kombinace toku dat, například transformací vstupních dat vytvořit styl, podle kterého se bude provádět transformace dalších XML dokumentů. Jestli něco takového využijete, záleží pouze na vás. Až do zpracování XML proniknete, jistě naleznete celou řadu možností, jak si XML a XSLT ochočit a dobře je zužitkovat.

Jednoduchý příklad

Abychom dlouho neteoretizovali, ukážeme si rovnou v úvodu nějakou jednoduchou ukázku. Je to zřejmě moje první (nebo jedno z mých prvních) využití XSLT v praxi. Měl jsem v databázi XHTML kód, který jsem potřeboval dostat do textového emailu. Zbavit se tagů zvládne každý XML parser, ovšem mně šlo o URL v odkazech, které jsem zahodit nechtěl. Jak je nejlépe zapsat do textu? Nejvhodnější mi připadlo transformovat odkaz do tvaru „popisek (odkaz)“, tedy přenést URL za popisek odkazu do závorky. (Cesty všech odkazů byly absolutní.) Přiznám se, že vymýšlet algoritmus na tohle by se mi opravdu nechtělo. Ovšem s XSLT je to hračka. Podívejme se tedy na XSLT styl, který řeší můj požadavek:

<?xml version=’1.0′?>
<xsl:stylesheet
  xmlns:xsl=’http://www.w3.org/1999/XSL/Transform‘
  version=’1.0′>
  <xsl:template match=’a‘>
    <xsl:value-of select=‘.’/> (<xsl:value-of
      select=’@href’/>) </xsl:template>
</xsl:stylesheet>

Všimněte si, že většinu kódu tvoří XML hlavičky a jádro stylu je vlastně popsáno v pouhých třech řádcích, ve třech XSLT elementech. Element xsl:template vymezuje šablonu, která bude nahrazovat element a ze vstupního dokumentu, a element xsl:value-of vytahuje ze vstupu požadované data, v prvním případě textový obsah zpracovávaného elementu, v druhém případě je to hodnota atributu href, tedy URL odkazu. Případné další atributy zůstanou nedotčeny.

Teď by to chtělo ukázku aplikace tohoto stylu na nějaké XML data. Takže zkusme něco opravdu jednoduchého:

<?xml version=“1.0″?>
<text>
  Toto je
  <a href=“http://interval.cz“>pokusny odkaz</a>
  na Interval.cz.
</text>

A výsledek:

  Toto je
  pokusny odkaz (http://interval.cz)
  na Interval.cz.

Jak vidíte, je to velice jednoduché a funguje to. Nedovedu si představit jednodušší způsob řešení mého problému. Nyní snad máte alespoň hrubou představu o principu a využití technologie XSLT. Podrobněji ji budu rozebírat v následujících článcích, zde si ještě ukážeme, jak volat XML procesor v různých serverových prostředích, abychom si mohli příklady ihned vyzkoušet a experimentovat s nimi.

XSLT na vlastní kůži!

Pro jednoduché experimentování si vytvoříme jednoduchou stránečku, která si převezme data i transformační styl ze souborů umístěných ve stejném adresáři. Soubory se budou jmenovat data.xml a styl.xsl. Můžete si ihned zkusit do těchto souborů uložit výše uvedené ukázky.

XSLT v ASP

K veškerému zpracování XML na platformě Windows pro nás Microsoft připravil MS XML Parser. Je to velice mocná komponenta a lze ji snadno používat i v prostředí ASP (Active Server Pages). Následující kód provede XML transformaci v souboru data.xml podle stylu v souboru styl.xsl a výsledek přímo vypíše na výstup bez jakýchkoli úprav.

<%
dim xsl, xml
set xsl = createobject(„Msxml2.DOMDocument“)
xsl.load(server.MapPath(„styl.xsl“))
set xml = createobject(„Msxml2.DOMDocument“)
xml.load(server.MapPath(„data.xml“))
response.write xml.transformNode(xsl)
%>

Je třeba si dávat pozor na chyták – v případě chyby totiž MS XML Parser nevyvolá výjimku, ale prostě vrátí prázdný řetězec. Pak se ovšem chyba hledá velice těžko. Údaje o chybě jsou uchovány ve vlastnosti parseError XML dokumentu, zde tedy například xml.parseError a xsl.parseError. Tato vlastnost je objektem třídy IXMLDOMParseError a vás budou asi nejvíce zajímat vlastnosti line, linepos, reason a srcText.

XSLT v ASP.NET

V tomto prostředí je nativní podpora XML včetně XSLT zabudovaná přímo v knihovně FCL (Framework Class Library), konkrétně ve jmenných prostorech začínajících System.Xml. Využití příslušných tříd je opět velice snadné:

<%@Import NameSpace=“System.Xml“ %>
<%@Import NameSpace=“System.Xml.Xsl“ %>
<script language=“C#“ runat=“server“>
void Page_Load (object sender, System.EventArgs e) {
  XmlDocument xml = new XmlDocument();
  xml.Load(MapPath(„data.xml“));
  XslTransform xsl = new XslTransform();
  xsl.Load(MapPath(„styl.xsl“));
  xsl.Transform(xml,null,Response.OutputStream);
}
</script>

XSLT v PHP

V PHP je XSLT podporováno díky české knihovně Sablotron. K provedení naší transformace by měl stačit následující kód:

<?php
$xh = xslt_create();
$result = xslt_process($xh, ‚data.xml‘, ‚styl.xsl‘);
echo $result;
xslt_free($xh);
?>

Protože použití XSLT v PHP není tak úplně triviální, doporučuji vám prostudovat doplňkové zdroje, které uvádím v seznamu na konci článku.

XSLT přímo v prohlížeči

Pokud chcete s XSLT experimentovat, a nemůžete nebo nechcete použít server-site prostředí, pomůže vám přímo prohlížeč. Stačí totiž k XML dokumentu přidat element indikující, že má být na dokument před zobrazením aplikována transformace podle daného stylu, a prohlížeč se o tento proces postará sám. V našem příkladě upravíme soubor data.xml takto:

<?xml version=“1.0″ ?>
<?xml-stylesheet type=“text/xsl“
  href=“styl.xsl“
  media=“screen“?>
<text>
  Toto je
  <a href=“http://interval.cz“>pokusny odkaz</a>
  na Interval.cz.
</text>

Pokud tento soubor zobrazíme v Microsoft Internet Exploreru nebo v Mozille, prohlížeč provede XSL transformaci podle daného stylu a zobrazí kýžený výsledek.

Odkazy, zdroje

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět