XSLT, svět transformací II
Roman Pichlík, vydáno/aktualizováno: 9.9.2003/09.09.2003
V druhém pokračování našeho povídaní pronikneme do tajů XSLT transformace, ukážeme si jak transformovat jednoduchý XML dokument a podíváme se pod pokličku jazyku XPath.
Základní struktura
Každý styl, nebo chcete-li stylový předpis, je sám o sobě pouze XML dokumentem. Platí pro něj tedy základní pravidla, která musí splňovat jakýkoliv jiný XML dokument. Tato pravidla jsou notoricky známá a nebudeme se jich dotýkat.
Všechny XSL elementy jsou uvozeny jmenným prostorem xsl, aby bylo možné ve stylu kombinovat různé sady elementů. Například XSL elementy s HTML elementy nebo vlastními XML elementy.
Vstupním bodem každého stylu a jeho kořenovým elementem je <xsl:stylesheet>
, který následuje hned po XML hlavičce. Styl se skládá z jednotlivých šablon, které určují, jak se budou části XML dat transformovat do zvoleného výstupního formátu. Pokud otevřeme soubor stylů (obvykle má příponou xsl) uvidíme následující zápis:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
.
.
. zápis stylů
.
</xsl:stylesheet>
URL identifikující jednoznačně jmenný prostor XSL je velice důležitá informace pro zpracování XSLT procesorem. Proto si na její přesný zápis dejte pozor.
<xsl:stylesheet
id = id
extension-element-prefixes = hodnota
exclude-result-prefixes = hodnota
version = číslo
>
- id
- (nepovinný) jedná se o identifikátor XSLT stylu
- version
- (povinný) verze jazyka XSLT
- extension-element-prefixes
- (nepovinný) definuje prefix elementů rozšiřujících XSL
- exclude-result-prefixes
- (nepovinný) definuje jmenný prostor XSLT stylů nekopírovaných na výstup
Verze určená atributem version
by měla v současnosti nabývat pouze hodnotu 1.0, neboť jedině tato specifikace má status doporučení W3C. XSLT 1.1 zůstalo ve stádiu rozpracování a nic nenasvědčuje tomu, že by se pokračovalo v jeho dalším vývoji. K finálnímu vydání se blíží verze 2.0, ale na tu si budeme muset ještě počkat.
Atribut extension-element-prefixes
slouží pro rozšíření jednotlivých XSLT procesorů. Skoro každý procesor nabízí nadstandardní funkce, které lze pro transformaci využít. Takové rozšíření je uvozeno jmenným prostorem, který zpracuje pouze daný XSLT procesor. Ostatní XSLT procesory tyto elementy ignorují.
SQL pro XML aneb XPath v akci
Než si ukážeme volbu výstupní metody, stručně se seznámíme s jazykem XPath. Nebojte se bude to pouze lehounké nakouknutí nezbytné k prvním krůčkům.
XPath je samotný standard W3C, který slouží pro práci s XML daty. Umožňuje vybírat jednotlivé části XML dat pomocí jednoduchých výrazu. Každý XML dokument si můžeme představit jako strom, jehož uzly tvoří jednotlivé elementy, jejich atributy a textový obsah.
Řekněme, že máme XML data s následují strukturou:
<?xml version="1.0"?>
<seznam-prispevku>
<prispevek id="xsl_uvod">
<autor>Roman Pichlík</autor>
<datum-vydani>23.08.2003</datum-vydani>
<abstract>Vstupní brána do světa XSL, který skrýva neuvěřitelné množství možností pro prezentaci XML dat.</abstract>
<nadpis>XSLT, svět transformací</nadpis>
<text>
Když jsem přemýšlel o tomto, článku napadaly mě nejrůznější představy...
...
</text>
</prispevek>
<prispevek id="xsl_prvni_krucky">
<autor>Roman Pichlík</autor>
<datum-vydani>28.08.2003</datum-vydani>
<abstract>Úvod do problematiky XSLT, základní struktura stylu, Xpath a výstupní metody transformace.</abstract>
<nadpis>XSLT, svět transformací II</nadpis>
<text>
V druhém pokračování našeho povídaní...
...
</text>
</prispevek>
</seznam-prispevku>
Stromovou reprezentaci těchto XML dat si můžeme představit takto:
/
|-kořen stromu
|
|-seznam-prispevku - kořenový element
|
|-prispevek
| |- @id
| | |-TO
| |
| |- autor
| | |-TO
| |
| |- datum-vydani
| | |-TO
| |
| |- abstract
| | |-TO
| |
| |- nadpis
| | |-TO
| |
| |_ text
| |-TO
|
|-prispevek
|- @id
| |-TO
|
|- autor
| |-TO
|
|- datum-vydani
| |-TO
|
|- abstract
| |-TO
|
|- nadpis
| |-TO
|
|_ text
|-TO
Tata struktura obsahuje uzly čtyř typů:
- kořen stromu zapsný znakem /
- elementy zapsané jejich názvy
- atributy označené znakem @ a jeich názvem
- textový obsah označen zkratkou TO
Povšimněte si, že textový obsah tvoří další úroveň stromu, stejně jako kořen stromu. Samotný jazyk XPath, nebo lépe řečeno jeho výrazy, které umožňují vybrat jednotlivé části XML, se podobají zápisu adresářové struktury. Toto přirovnání použil ve svém seriálu o XML i Jiří Kosek a mě se zdá nejvýstižnější. Proto jsem ho použil a budu se ho držet.
Pro výběr elementu prispevek má výraz XPath podobu:
/seznam-prispevku/prispevek
pro vybrání prvního prispevku použijeme:
/seznam-prispevku/prispevek[1]
a pro výběr jeho atributu:
/seznam-prispevku/prispevek[1]/@id
Pokud chcete vybrat všechny nadpisy, použijte zápis:
//nadpis
Pro tyto výrazy se používají daále popsané vzory
Základní vzory XPath
- jméno elementu
- vzoru vyhovují všechny elementy odpovídajícího jména.
- x/y
- vzoru odpovídají všechny elementy, jež jsou přímými potomky elementu x a jmenují se y.
- //x
- vzoru vyhovují všechny elementy se jménem x.
- vzor[podmínka]
- vzoru vyhovuje pokud je splněna podmínka.
- @x
- vzoru vyhovuje pouze atribut se jménem x.
Tyto základní vzory postačují pro většinu požadavků, na které může normální smrtelník narazit. Pokud se cítíte trochu zmateni, nic si z toho nedělejte. S praktickou ukázkou bude vše jasnější.
První transformace
Se základní znalostí XPath se můžeme pustit do první transformace, ve které si ukážeme základní stavební kameny každé šablony a použijeme XPath v praxi. Současně si ukážeme jak zvolit výstupní metodu pro transformaci.
První šablona
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" encoding="utf-8" doctype-public="-//W3C/DTD HTML 4.01 Transitional//EN"/>
<xsl:template match="/">
<html>
<head>
<meta http-equiv="Content-language" content="cs" />
<title>První stránka vytvořená XSLT transformaci - souhrn příspěvků</title>
</head>
<body>
<h1>Seznam všech aktuálních příspěvků</h1>
<xsl:apply-templates select="/seznam-prispevku/prispevek" />
</body>
</html>
</xsl:template>
<xsl:template match="prispevek">
<h2>
<a>
<xsl:attribute name="name">
<xsl:value-of select="@id" />
</xsl:attribute>
<xsl:value-of select="nadpis" />
</a>
</h2>
<p>
<xsl:value-of select="text" />
</p>
<p>
<span>
Zapsal <xsl:value-of select="autor" />, dne <xsl:value-of select="datum-vydani" />
</span>
<xsl:text> </xsl:text>
<a>
<xsl:attribute name="href">
<xsl:text>http://example.com/foo.html#</xsl:text>
<xsl:value-of select="@id" />
</xsl:attribute>
<xsl:text>Trvalý odkaz</xsl:text>
</a>
</p>
</xsl:template>
</xsl:stylesheet>
Nyní s připraveným stylem můžeme provést transformaci předešlých XML dat (na konci článku najdete ukázkové příklady v PHP, Jave a Mozille). Výsledkem transformace je následující kód.
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta content="cs" http-equiv="Content-language">
<title>První stránka vytvořená XSLT transformaci - souhrn příspěvků</title>
</head>
<body>
<h1>Seznam všech aktuálních příspěvků</h1>
<h2><a name="xsl_uvod">XSLT, svět transformací</a></h2>
<p>
Když jsem přemýšlel o tomto článku napadali mě nejrůznější představy...
</p>
<p>
<span>Zapsal Roman Pichlík, dne 23.08.2003</span> <a href="http://example.com/foo.html#xsl_uvod">Trvalý odkaz</a>
</p>
<h2><a name="xsl_prvni_krucky">XSLT, svět transformací II</a></h2>
<p>
V druhém pokračování našeho povídaní...
</p>
<p>
<span>Zapsal Roman Pichlík, dne 28.08.2003</span> <a href="http://example.com/foo.html#xsl_prvni_krucky">Trvalý odkaz</a>
</p>
</body>
</html>
Povšimněte si deklarace DTD, meta tagu určujícího typ dokumentu a kódování, které přidá XSLT procesor automaticky. To je způsobeno xsl elementem output, na který se podíváme v příštím pokračování.
Příklady transformace v PHP, Jave, Mozille
Přílohu článku tvoří soubory source.xml a stylesheet.xsl, ve kterých jsou dnešní probírané příklady. Mnohem typičtějším případem je tvorba XML dat tzv. on the fly tedy za běhu aplikace, kdy je výstup tvořen například z výsledku SQL dotazu. My ale zvolíme statické uložení do souboru, které se pro naše ukázky hodí lépe.
Java
Pokud soubory transformer.jar, source.xml a stylesheet.xsl uložíte do adresáře temp, můžete transformaci spustit v příkazovém řádku takto:
c:\temp>java -jar transformer.jar source.xml stylesheet.xsl output.html 1
Parametry:
- jméno zdrojového xml souboru
- jméno šablony stylu
- jméno souboru, do kterého bude uložen výstup
- výstup transformace (1 - do souboru, 0 - výpis na konsolu)
Pokud jar rozbalíte například zipem, najdete vedle binárních souborů .class i zdrojové soubory .java, kterými se můžete inspirovat. Pro bezproblémový chod doporučuji JRE 1.4, které má v sobě již XSLT procesor. Pokud použijete starší JDK musíte nastavit CLASSPATH
na zvolený XSLTC procesor.
PHP
Předem upozorňuji, že nejsem nijak zdatný odborník na PHP.
<?php
$xmlPath = "file://c:/temp/source.xml" $xslPath = "file://c:/temp/stylesheet.xsl"
$xh = xslt_create();
$result = xslt_process($xh,$xmlPath,$xslPath);
if (!$result) {
die(sprintf("Cannot process XSLT document [%d]: %s",
xslt_errno($xh), xslt_error($xh)));
}
print($result);
xslt_free($xh);
?>
Kód jsem testoval na PHP 4.3, kde bylo XSLT přidáno jako experimentální podpora a jako XSLTC procesor se používal Sablotron. Rozkopírování příslušných extensions a nastavení PHP je dokumentováno v distribuci.
Mozilla
Transformovat umí i Mozilla, což dokládá soubor mozilla.html, který provede transformaci. Opět stačí mít mozilla.html ve stejném adresáři jako soubory source.xml a stylesheet.xsl. Zkoušeno v Mozille 1.4.
Více informací o transformaci v prohlížečích založených na jádře Gecko naleznete na adrese
http://devedge.netscape.com/viewsource/2003/xslt-js/
Transformaci můžeme provádět v jakémkoliv XSLT procesoru. Hodně zábavy.
© 2003 Roman Pichlík, [email protected]
Úvodní díl seriálu o XSLT: XSLT, svět transformací I
O autorovi
Roman „Dagi“ Pichlík se specializuje na na webové skriptování. Od konce roku 2002 vydává vlastní weblog pro kodéry Dagblog.