Nßstroj XSL slou₧φ pro prezentaci dokument∙ zapsan²ch v XML. Lze jej vÜak vyu₧φt i pro °adu jin²ch ·Φel∙à
ProΦ XML pot°ebuje XSL?
Formßt XML (eXtensible Markup Language) byl nav₧en konsorciem W3C (World Wide Web Consortium) pro reprezentaci obecn²ch dokument∙. Je nav₧en tak, aby dokumenty zapsanΘ v XML byly jednoduÜe zpracovatelnΘ programem û elementy dokumentu musφ b²t snadno rozpoznatelnΘ. XML je znaΦkovacφ jazyk, a proto pou₧φvß pro vyznaΦenφ element∙ znaΦky (markups). ZnaΦky p°edstavujφ zobecn∞nΘ zßvorky, nap°.:
<blok> à obsah elementu typu blok à </blok>
kde <blok> je otevφracφ zßvorka (start tag) a </blok> je zavφracφ zßvorka (end tag). Pou₧itelnß sada zßvorek nenφ formßtem XML definovßna û je pouze definovßn zp∙sob zßpisu zßvorek. Uva₧me nap°. fragment XML-dokumentu typu faxovß zprßva:
<fax> FAX Message
<odesilatel>Karel</odesilatel>
<adresat>Jana</adresat>
<text> ... </text>
</fax>
XML umo₧≥uje, aby popis pou₧itelnΘ sady zßvorek byl souΦßstφ dokumentu û k dokumentu lze p°ipojit tzv. definici typu dokumentu (DTD û Document Type Definition). Tato "metadata" stanovφ p°edepsan² obsah dokumentu. Nap°. DTD pro faxovΘ zprßvy by mohla vypadat nßsledovn∞:
<?xml version="1.0" encoding="iso-8859-2" ?>
<!DOCTYPE fax [
<!ELEMENT fax (odesilatel,adresat,text)>
<!ELEMENT odesilatel #PCDATA >
<!ELEMENT adresat #PCDATA >
<!ELEMENT text #PCDATA >
]>
<fax> à </fax>
VyznaΦenφm zajφmav²ch polo₧ek v obsahu zprßvy jsme zφskali mo₧nost jednoduchΘ extrakce informacφ o odesilateli, adresßtovi a vlastnφm textu zprßvy. V XML vÜak nenφ nijak urΦeno, jak se majφ odesilatelΘ, adresßti a text zobrazovat. Nenφ tedy zcela z°ejmΘ, jak se mß dokument typu "fax" naformßtovat p°i prezentaci. To je problΘm, kter² se sna₧φ vy°eÜit XSL.
Co to je XSL?
XSL (eXtensible Stylesheet Language) je doporuΦenφ vytvo°enΘ konsorciem W3C jako nßstroj pro prezentaci dokument∙ zapsan²ch v XML. XSL je tedy sv²m p∙vodnφm urΦenφm nßstroj pro popis "stylesheets" û formßtovanΘ (zobrazenΘ nebo tiÜt∞nΘ) verze XML-dokument∙. Je ovÜem mo₧nΘ jej vyu₧φt i pro °adu jin²ch ·Φel∙.
Definice XSL mß dv∞ Φßsti:
jazyk pro popis transformace XML-dokument∙, definici sv∞ta formßtovan²ch objekt∙ (flow objects), ve kterΘm se vyjßd°φ naformßtovan² dokument (flow object tree) û XML-slovnφk popisujφcφ sΘmantiku formßtovßnφ (v²stupu).
Jeden XSL-dokument (XSL stylesheet) specifikuje prezentaci celΘ t°φdy XML-dokument∙ û popisuje, jak se libovolnß instance tΘto t°φdy transformuje do v²stupnφho formßtovanΘho dokumentu. Naformßtovan² dokument pat°φ do sv∞ta formßtovan²ch objekt∙. Formßtovan² sv∞t mß svΘ typy objekt∙ û mß sv∙j slovnφk element∙. Pro jeho vyjßd°enφ je op∞t pou₧it formßt XML û formßtovanΘ dokumenty majφ svΘ DTD. XSL popisuje transformaci vstupnφho XML-dokumentu (nap°. libovolnΘ faxovΘ zprßvy) do v²stupnφho XML-dokumentu, kter² pou₧φvß urΦit² formßtovacφ slovnφk [nap°. do formßtovanΘ posloupnosti strßnek û pou₧φvß se XML "namespace" fo (flow objects), tj. standardn∞ se pou₧ije znaΦka <fo:page-sequence>].
Transformace je v XSL popsßna pomocφ sady pravidel. Libovoln² vstupnφ XML-dokument danΘ t°φdy je podle t∞chto pravidel zpracovßn a prezentovßn. Proces prezentace mß dva kroky:
zdrojov² XML-dokument (source tree) je transformovßn na v²sledn² document (result tree);
v²sledn² dokument je interpretovßn a v²sledkem je formßtovan² v²stup (na obrazovce, papφru atd.).
Nap°. pravidlo pro transformaci faxovΘ zprßvy na posloupnost strßnek by mohlo vypadat nßsledovn∞:
<xsl:template match="fax">
<fo:page-sequence
font-family="times new roman,serif"
font-size="12pt">
<xsl:process-children/>
</fo:page-sequence>
</xsl:template>
Jak to °eÜφ HTML a SGML?
XSL je navr₧en pro XML. Formßt XML vychßzφ ze starÜφho a obecn∞jÜφho standardu SGML (Standard Generalized Markup Language û ISO 8879). Pro definici zobrazenφ SGML-dokument∙ byl rovn∞₧ vytvo°en standard û DSSSL (Document Style Sematics and Specification Language). AvÜak podobn∞ jako je SGML slo₧it∞jÜφ ne₧ XML, je DSSSL slo₧it∞jÜφ a komplikovan∞jÜφ ne₧ XSL, co₧ je pravd∞podobn∞ p°φΦina, proΦ zatφm nedoÜlo k jeho ÜirÜφmu u₧itφ.
DSSSL, podobn∞ jako XSL, definuje sv∞t formßtovan²ch objekt∙ (flow objects), ve kterΘm se vyjßd°φ naformßtovan² dokument (flow object tree). SouΦasn∞ zavßdφ transformaΦnφ prost°edky pro p°evod SGML-dokumentu do tohoto vyjßd°enφ. Pro vyjßd°enφ formßtovanΘho dokumentu a pro popis transformace pou₧φvß DSSSL syntaxi podobnou jazyku Lisp. Naproti tomu XSL vyu₧φvß syntaxe XML. Pro ukßzku jenom fragment obdobnΘho stylu zapsanΘho v DSSSL:
(element (FAX)
(make page-sequence
font-size: 12pt
font-family: 'times new roman,serif
(process-children)))
Podle standardu SGML byl navr₧en i formßt HTML (Hyper-Text Markup Language). HTML je jazyk pou₧φvajφcφ pevnou sadu znaΦek. Sada znaΦek HTML slou₧φ k vyjßd°enφ p°ibli₧nΘ prezentaΦnφ podoby dokumentu. Nap°. znaΦka <H1> à </H1> slou₧φ pro oznaΦenφ nadpisu na nejvyÜÜφ ·rovni. Tento nadpis pak vÜechny prohlφ₧eΦe HTML zobrazφ (a vytisknou se) p°ibli₧n∞ stejn²m zp∙sobem. P°esnß v²stupnφ forma dokumentu vÜak prost°ednictvφm HTML urΦena nenφ.
Pro mo₧nost p°esnΘho vyjßd°enφ stylistickΘ podoby dokumentu byl konsorciem W3C vytvo°en nßstroj CSS (Cascading Style Sheets) û nßstroj umo₧≥ujφcφ p°ipojit k HTML-dokumentu i p°esnou definici jeho podoby. Pokud bychom nap°. po₧adovali, aby elementy typu "H1" byly zobrazeny modr²m pφsmem "times new roman,serif" o velikosti 14 bod∙, definujeme pravidlo CSS:
H1 { color: blue; font-size: 14pt; font-family: times new roman,serif }
Takovß pravidla ulo₧φme do samostatnΘho souboru a p°ipojφme k HTML-dokumentu vazbou, nebo je p°φmo vlo₧φme do HTML-dokumentu. Nßsledujφcφ p°φklad ilustruje r∙znΘ mo₧nosti û vazbu na externφ soubor (element LINK), pomocφ elementu STYLE v hlaviΦce nebo jako atribut STYLE odstavce v t∞le HTML:
<HTML>
<HEAD>
<TITLE>title</TITLE>
<LINK REL=STYLESHEET TYPE="text/css"
HREF="http://style.com/cool" TITLE="Cool">
<STYLE TYPE="text/css">
H1 { color: blue }
</STYLE>
</HEAD>
<BODY>
<H1>Nadpis je modr²</H1>
<P STYLE="color: green">Paragraf je zobrazen zelen∞.</P>
</BODY>
</HTML>
Poznamenejme, ₧e definice XSL je z hlediska formßtovan²ch objekt∙ do znaΦnΘ mφry konformnφ s CSS a s DSSSL.
Formßt XSL-dokumentu
XSL-dokument se sklßdß ze sady pravidel, kterß popisujφ transformaci vstupnφho dokumentu na v²stupnφ. Pravidla obsahujφ vzorek (pattern) a akci (template). Vzorek se porovnßvß se zdrojov²m dokumentem, p°i srovnßnφ se modifikuje akce pravidla a aplikuje se na v²stupnφ strom (zdrojov² a v²stupnφ strom jsou dva r∙znΘ dokumenty). Struktura v²stupnφho dokumentu m∙₧e b²t zcela jinß ne₧ struktura zdrojovΘho dokumentu (lze p°idßvat elementy, p°euspo°ßdat po°adφ, opakovat atd.).
Jak ji₧ bylo °eΦeno, XSL-dokument se reprezentuje jako XML-dokument. Lze jej tedy zpracovßvat pomocφ XML-procesoru. Pou₧φvajφ se p°itom nßsledujφcφ konvence:
XSL-znaΦky se pφÜφ mal²mi pφsmeny (nap°. <xsl> ).
ZnaΦky pro v²stup v HTML (HTML "Flow Object") se pφÜφ VELK▌MI P═SMENY.
XSL-dokument je dob°e vytvo°en² XML-dokument.
Hodnoty atribut∙ se pφÜφ v uvozovkßch:
<TABLE BORDER = "1">
<OL COMPACT = "YES PLEASE">
Syntaxe prßzdn²ch element∙ je <HR/>.
Skripty se do dokumentu vklßdajφ pomocφ datovΘ sekce CDATA.
Proto₧e je XSL-dokument dob°e vytvo°en² XML-dokument, musφ b²t ko°en uzav°en v zßvorkßch (pou₧φvß se dvojice <xsl:stylesheet> a </xsl:stylesheet>) a vÜechny ostatnφ elementy musφ b²t do n∞j vno°eny a zßvorky musφ b²t sprßvn∞ spßrovßny.
Specifikace XSL pln∞ vyu₧φvß tzv. prostor∙ jmen (name spaces). Pro seznßmenφ s XSL nenφ nutno porozum∞t tomuto mechanismu do vÜech podrobnostφ, postaΦφ nßm jednoduch² p°φklad. Podrobn² popis lze nalΘzt v literatu°e. VÜechny dokumenty odpovφdajφcφ specifikaci XSL jsou vlo₧eny do ko°ene XSL-dokumentu, kter² mß znaΦku:
<xsl:stylesheet> à </xsl:stylesheet>
P°φklad:
<xsl:stylesheet
xmlns:xsl="http//www.w3.org/TR/WD-xsl"
xmlns:fo="http//www.w3.org/TR/WD-xsl/FO"
result-ns="fo">
àààààààà
</xsl:stylesheet>
Ko°en dokumentu mß v tomto p°φpad∞ atributy: xmlns:xsl (prostor jmen XSL-dokumentu jako XML-dokumentu), xmlns:fo (formßtovacφ slovnφk) a result-ns= "fo" (v²stupnφ prostor jmen). Prv² atribut je povinn² a jeho hodnota musφ b²t:
xmlns:xsl="http//www.w3.org/TR/WD-xsl".
Tento atribut slou₧φ pro procesor XSL, kter² tak poznß, ₧e vÜechny elementy s prefixem 'xsl:' majφ b²t interpretovßny dle specifikace XSL (jsou v prostoru 'xsl'). Druh² atribut je teoreticky voliteln², ale ve skuteΦnosti b²vß v∞tÜinou uveden v naznaΦenΘm tvaru. ╪φkß XSL-procesoru, ₧e elementy s prefixem 'fo:' (zkratka pro flow objects) jsou v prostoru 'fo' a ₧e formßtovßnφ vyu₧φvß formßtovacφ slovnφk dle specifikace XSL.
Narazφ-li pak procesor na <fo:block font-size= "12pt">, °φdφ se syntaxφ specifikovanou v prostoru 'fo'. Je samoz°ejm∞ mo₧nΘ pou₧φvat jin² slovnφk (viz nap°. www.mystyle.org), je pak ale t°eba p°esv∞dΦit tv∙rce aplikacφ, aby tento formßt respektovali. T°etφ atribut result-ns="fo" °φkß XSL-procesoru, ₧e konstruovan² v²stupnφ strom (result tree) pou₧φvß slovnφk 'fo'.
Pravidla XSL-dokumentu
Ka₧dΘ pravidlo XSL obsahuje vzorek a akci. Vzorek pravidla slou₧φ pro selekci uzlu (elementu) vstupnφho stromu. Selekci je mo₧no p°edepsat podle: jmΘna elementu, p°edch∙dce elementu, ID-elementu, lze vyu₧φt zßstupnΘ znaky, lze odkazovat na atributy elementu, relativnφ pozici elementu ve strom∞ nebo na unikßtnost elementu. P°esn∞jÜφ vysv∞tlenφ by vy₧adovalo popis jazyka XPath, ve kterΘm se dajφ zapisovat vzorky a akce pravidel.
Akce pravidla obsahujφ p°edevÜφm elementy konstruovanΘho (formßtovanΘho) objektu, nap°. <fo:block></fo:block> vytvo°φ ve formßtovanΘm objektu blok. Lze nastavit i atributy formßtovanΘho objektu, nap°. <fo:block font-size= "16pt"> indikuje, ₧e ve v²stupnφm bloku mß b²t pou₧ito pφsmo velikosti 16 bod∙. Zp∙sob zpracovßnφ vstupnφho stromu je vyjßd°en formou specißlnφho prßzdnΘho elementu; nap°. <xsl:apply-templates/> zp∙sobφ, ₧e procesor XSL aplikuje v tomto mφst∞ vÜechna pravidla a zpracuje vÜechny potomky.
Procesor XSL prochßzφ vstupnφ dokument (vstupnφ strom) a pokouÜφ se hledat vzorky pravidel XSL-dokumentu. Pokud se poda°φ nalΘzt shodu, aplikuje akci pravidla na v²stupnφ dokument (v²stupnφ strom). Pokud je aplikovateln²ch pravidel vφce, vybere se pravidlo dle stanovenΘho postupu. Pravidla XSL majφ nßsledujφcφ obecn² formßt:
<xsl:stylesheet>
<!-- zde je vzorek -->
<xsl:template ...
<!-- zde je akce -->
...
</xsl:template>
</xsl:stylesheet>
P°φklad pravidla pro element typu "fax":
<xsl:stylesheet>
<xsl:template match= "fax"> <!-- to je vzorek -->
<!-- a zde je akce -->
<fo:page-sequence color="red" font-size="16pt">
<apply-templates/>
</fo:page-sequence>
</xsl:template>
</xsl:stylesheet>
Pokud podle tohoto pravidla zpracujeme d°φve uvedenou faxovou zprßvu, vznikne v²stupnφ dokument:
<fo:page-squence color= "red" font-size="16pt">
FAX Message
<!-- zde bude v²stup podle ostatnφch pravidel -->
</fo:page-sequence>
P°evod XML do HTML pomocφ XSL
Jednou z mo₧nostφ, jak popsat zobrazenφ XML-dokument∙, je popsat pomocφ XSL jejich p°evod do HTML. P°edpoklßdejme, ₧e vstupnφ XML-dokument musφ mφt strukturu dle DTD pro faxovΘ zprßvy. P°edpis pro transformaci do HTML v XSL (XSL stylesheet) m∙₧e vypadat nßsledovn∞: