XSLT – jazyk budoucnosti

Protože je dnes stále více dat dostupných v XML, vznikla potřeba jazyka, který umožní jednoduše popsat způsob převodu mezi různými formáty založenými na XML. Právě XSLT je jazyk, který umí jednoduše popsat, jak se má dokument XML převést na dokument XML s jinou strukturou, případně do podoby stránky HTML nebo dokonce do čistého textu.

Seriál: Přehled podpory XML v PHP5 (6 dílů)

  1. Přehled podpory XML v PHP5 5.10.2009
  2. PHP a XML: SAX – čteme pěkně popořádku 12.10.2009
  3. XMLReader – když se zamotáme do SAX 19.10.2009
  4. DOM – načteme to do paměti 26.10.2009
  5. XPath – rychle to najdeme 2.11.2009
  6. XSLT – jazyk budoucnosti 9.11.2009

XSLT lze použít i pro naší úlohu, protože potřebujeme převést RSS (což je jen specifický případ dokumentu XML) do formátu HTML.

Příklad 7. XSLT styl pro převod RSS do HTML – rss2html.xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

<xsl:output method="html" encoding="utf-8"
            doctype-public="-//W3C//DTD HTML 4.01//EN"/>

<xsl:template match="channel">
  <html lang="cs">
    <head>
      <title>Přehled zpráv</title>
    </head>
    <body>
      <h1>Přehled aktuálních zpráv ze serveru
          <a href="{link}"><xsl:value-of select="title"/></a></h1>

      <dl>
        <xsl:for-each select="item">
          <dt><a href="{link}"><xsl:value-of select="title"/></a></dt>
          <dd><xsl:value-of select="description"/></dd>
        </xsl:for-each>
      </dl>

    </body>
  </html>
</xsl:template>

</xsl:stylesheet>

XSLT pro svůj zápis používá syntaxi XML, proto musí začínat deklarací XML. Výkonné instrukce XSLT patří do jmenného prostoru http://www.w3.org/1999/XSL/Transform, pro který se obvykle používá prefix xsl. Celý styl se zapisuje dovnitř elementu xsl:stylesheet. Uvnitř stylu lze používat další instrukce. My například pomocí instrukce xsl:output nastavujeme parametry výstupu – v jakém bude kódování, jaký se použije formát (HTML/XML) a jak bude vypadat deklarace typu dokumentu:

<xsl:output method="html" encoding="utf-8"
            doctype-public="-//W3C//DTD HTML 4.01//EN"/>

Nejdůležitější částí každého stylu jsou šablony ( xsl:template). Každá šablona definuje, jak se bude zpracovávat určitá část vstupního dokumentu (nejčastěji nějaký konkrétní element). Náš styl obsahuje jen jednu šablonu, která definuje způsob zpracování elementu  channel:

<xsl:template match="channel">
  …
</xsl:template>

Šablona se pak chová tak, že v ní obsažené texty a elementy nepatřící do jmenného prostoru XSLT kopíruje na svůj výstup. Elementy patřící do jmenného prostoru XSLT jsou chápány jako instrukce, které XSLT procesor provádí. V naší šabloně jsou použity jen dvě instrukce xsl:value-ofxsl:for-each.

Instrukce xsl:value-of slouží k vypsání výsledku XPath výrazu do výstupu. Takže například instrukce:

<xsl:value-of select="title"/>

vypíše obsah elementu title, který je dítětem aktuálního uzlu. No a uvnitř šablony je aktuální ten uzel, který šablona právě obsluhuje, tedy element  channel.

Instrukce xsl:for-each je naopak příkaz cyklu. Pro všechny uzly, které vybere XPath výraz uvedený v atributu select, se provede kód uvedený uvnitř této instrukce. Uvnitř cyklu se navíc aktuálním uzlem stává uzel, pro který se právě provádí tělo cyklu, takže XPath výraz title nyní vybírá název položky, ne kanálu v RSS dokumentu.

Potřebujeme-li nějakou hodnotu vložit do atributu, nemůžeme použít instrukci xsl:value-of, protože syntaxe XML neumožňuje používat elementy uvnitř hodnot atributů a XSLT musí této syntaxi vyhovět. Uvnitř atributů proto můžeme výrazy jazyka XPath zapisovat do složených závorek ( {…}).

Aby bylo naše řešení kompletní, musíme samozřejmě umět na dokument XML aplikovat transformaci popsanou pomocí XSLT a její výsledek poslat do prohlížeče. V PHP je tento úkol velmi jednoduchý, protože obsahuje i knihovnu pro práci s XSLT. Stačí dokument i styl načíst jako DOM objekty do paměti, poté si vytvořit nový procesor XSLT (třída XSLTProcessor), načíst do něj styl z DOM stromu a spustit transformaci.

Příklad 8. Transformace dokumentu XML – xslt.php

<?php

// načtení dokumentu XML
$xml = new DomDocument();
$xml->load("../data/luparss.xml");

// načtení stylu XSLT
$xsl = new DomDocument();
$xsl->load("rss2html.xsl");

// vytvoření procesoru XSLT
$proc = new xsltprocessor();
$proc->importStylesheet($xsl);

// provedení transformace a vypsání výsledku
echo $proc->transformToXML($xml);
?>

Závěr

Viděli jsme, že PHP nabízí několik různých metod pro čtení dokumentů XML. Pro zpracování rozsáhlých dokumentů (větších než jednotky megabajtů) jsou vhodná jen rozhraní SAX a XMLReader. Tato rozhraní jsou navíc velmi rychlá.

Můžeme-li si dovolit načíst celý dokument XML do paměti, máme na výběr mezi rozhraními SimpleXML a DOM. Pro dokumenty s jednoduchou strukturou je použití SimpleXML většinou jednodušší než použití DOMu. Nicméně DOM rozhraní na rozdíl od SimpleXML umožňuje přístup ke všem informacím uloženým v dokumentu XML. Navíc rozhraní DOM umožňuje dokument XML v paměti i modifikovat.

Máme-li již však dokument načtený celý do paměti pomocí DOM, je v mnoha případech vhodnější využít nějaký nástroj vyšší úrovně, jako je XPath nebo XSLT. Přístup k datům uloženým v XML a jejich zpracování je mnohem efektivnější než při použití nízkoúrovňových metod DOM.

Více informací o knize naleznete na stránkách nadavatelství Grada a na stránkách autora.

Komentáře: 65

Přehled komentářů

Peter XPath 2.0 / XSLT 2.0
fos4 Re: XPath 2.0 / XSLT 2.0
Jiří Kosek Re: XPath 2.0 / XSLT 2.0
pepazdepa lehce offtopis - TEI/Docbook
Jiří Kosek Re: lehce offtopis - TEI/Docbook
josef XSLT :-/
Jiří Kosek Re: XSLT :-/
josef Re: XSLT :-/
fos4 Re: XSLT :-/
Jiří Kosek Re: XSLT :-/
T.oo.M Re: XSLT :-/
Jiří Kosek Re: XSLT :-/
josef Re: XSLT :-/
Jiří Kosek Re: XSLT :-/
V.Novák Re: XSLT :-/
Jiří Kosek Re: XSLT :-/
Kit Re: XSLT :-/
Jakub Vrána SimpleXML
Jiří Kosek Re: SimpleXML
Jakub Vrána Re: SimpleXML
David Grudl Re: SimpleXML
Jakub Vrána Re: SimpleXML
Pavel temna budoucnost
Stefan Re: temna budoucnost
Jiří Kosek Re: temna budoucnost
Pavel Re: temna budoucnost
Jiří Kosek Re: temna budoucnost
Pavel Re: temna budoucnost
Jiří Kosek Re: temna budoucnost
Pavel Re: temna budoucnost
Pavel Re: temna budoucnost
Jiří Kosek Re: temna budoucnost
Pavel Re: temna budoucnost
Borek Bernard E4X (titulek musí být minimálně 4 znaky dlouhý)
Jiří Kosek Re: E4X (titulek musí být minimálně 4 znaky dlouhý)
DDT xslt je hrozna sracka
Trm XSLT = jazyk pro zoufalce
Jiří Kosek Re: XSLT = jazyk pro zoufalce
xy xml moderni
Inkvizitor Zajímavou alternativu podle mě představuje Scala
Inkvizitor Ten pattern matching jsem trochu přepísknul
Jiří Kosek Re: Zajímavou alternativu podle mě představuje Scala
Inkvizitor Re: Zajímavou alternativu podle mě představuje Scala
pravdokop moje zkušenost
Jiří Kosek Re: moje zkušenost
Jan Tichý Re: moje zkušenost
Jiří Kosek Re: moje zkušenost
Pavel Re: moje zkušenost
Jiří Kosek Re: moje zkušenost
Pavel Re: moje zkušenost
Jiří Kosek Re: moje zkušenost
Pavel Re: moje zkušenost
Jiří Kosek Re: moje zkušenost
Pavel Re: moje zkušenost
Pavel Re: moje zkušenost
Jiří Kosek Re: moje zkušenost
Pavel Re: moje zkušenost
Inkvizitor Re: moje zkušenost
Pavel Re: moje zkušenost
Jiří Kosek Re: moje zkušenost
Pavel Re: moje zkušenost
abrakadabra Re: moje zkušenost
Jiří Kosek Re: moje zkušenost
Jakub Vrána Hlavní problém
Jiří Kosek Re: Hlavní problém
Zdroj: https://www.zdrojak.cz/?p=3116