Přeskoč navigaci

Zde hledá Jyxo.

Jyxo

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ů:

  1. kořen stromu zapsný znakem /
  2. elementy zapsané jejich názvy
  3. atributy označené znakem @ a jeich názvem
  4. 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.xmlstylesheet.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.xmlstylesheet.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.xmlstylesheet.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, roman.pichlik@asei.cz


Ú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.

Tato stránka je přístupná libovolným prohlížečem, nejlépe však vypadá v prohlížeči, který podporuje HTML 4.0 a CSS 2 (Internet Explorer od verze 5, Mozilla, Opera a další). Pokud čtete tuto zprávu, váš prohlížeč zřejmě dostatečně nepodporuje CSS. Stránku sice vidíte bez pokročilejšího formátování, avšak veškerý obsah je plně přístupný i pro vás.