PHP: Šablonovací systém XSLT(1) - jednoduché čtení RSS

PHP Práce se soubory PHP: Šablonovací systém XSLT(1) - jednoduché čtení RSS

Většina začátečníků začne používat PHP tak, že nejprve vytvoří stránku v HTML a do ní začne vkládat kusy kódu v PHP. Asi takto:

<html>
<head>
<title><?php echo $titulek; ?></title>
</head>
<body>
<h1><?php echo $titulek; ?></h1>
<ul>
<?php
foreach($seznam as $polozka){
   echo "<li>",htmlspecialchars($polozka),"</li>\n";
}
?>
</ul>
</body>
</html>

Příklad je velmi zjednodušen, není v něm uvedeno naplnění hodnot proměnné $titulek a pole $seznam.

V této podobě bylo vytvořeno mnoho funkčních webů. Výhodou je jednoduchost, jazyk PHP byl původně určen k přesně takovému použití. Vkládání opakujících se bloků bylo vyřešeno funkcemi include() a require().

S rostoucí komplexností stránky a množstvím podstránek se však tato jednoduchost ztrácí. Autor designu stránky už často není schopen odpovědně volat potřebné proměnné, zejména pokud je potřebné vybírat data z databáze. Vývojáři volali po oddělení aplikace od dat.

Vzniklo mnoho lepších či horších šablonovacích systémů, které dokáží číst externí soubor, doplnit do něj potřebné řetězce a vypsat na výstup. Mezi takové patří například Smarty. V PHP data uložíte do speciálního pole, zavoláte Smarty a data se uloží na správné místo. Nevýhodou je, že se musíte naučit další jazyk. Vlastně používáte šablonovací jazyk napsaný v šablonovacím jazyku.

Psal jsem, že data pro šablonovací systém je nutné předem uložit do nějakého pole. Obecně to ani nemusí být pole, ale nějaká dobře známá datová strukura. Může to být CSV, JSON, XML, DOM nebo cokoli jiného, čemu šablonovací systém rozumí.

Mezi jinými vznikl i velmi komplexní šablonovací systém XSLT. Vývojáři si ho moc neoblíbili, protože není úplně jednoduché se ho naučit. Také proto, že je dost "upovídaný". Je to dáno tím, že šablony se píší v jazyku XML. Vstupní data jsou také ve formátu XML. Sloučením šablony a dat (transformací) vznikne nový soubor teoreticky libovolného typu, v našem případě HTML.

Pro jednoduchou ukázku jsem si vybral soubor RSS z webu devbook. Tento soubor chci převést do nějakého líbivějšího formátu a zobrazit v prohlížeči. Využiji skutečnosti, že RSS používá formát XML a použiji šablonu XSLT.

devbook.xsl

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

<xsl:template match="/rss/channel">
<html>
<head>
<meta http-equiv="refresh" content="300"/>
<title><xsl:value-of select="title"/></title>
</head>
<body>
<h1><xsl:value-of select="title"/></h1>
<ul>
<xsl:for-each select="item">
        <li>
        <xsl:element name="a">
                <xsl:attribute name="href"><xsl:value-of select="link"/></xsl:attribute>
                <xsl:attribute name="target">_blank</xsl:attribute>
                <xsl:value-of select="title"/>
        </xsl:element>
        <p><xsl:value-of select="description"/></p>
        </li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

Všechny příkazy pro XSLT začínají <xsl:... Deklarace na začátku jsou nutné k definici výstupu transformace.

V této podobě to však ještě nejde použít. Proč? Protože šablonu sice máme, ale nemáme data. Také nemáme virtuální stroj, který by data spojil se šablonou. Vlastně máme. Je součástí PHP na většině serverů. Stačí ho jen spustit:

<?php
$doc = new DOMDocument();
$xsl = new XSLTProcessor();

$doc->load('devbook.xsl');
$xsl->importStyleSheet($doc);

$doc->load('http://www.itnetwork.cz/rss_generator_all.php');
echo "<!DOCTYPE html>",$xsl->transformToXML($doc);

To je vše. Šablonu devbook.xsl a skript umístíte na svém oblíbeném webhostingu a můžete si začít užívat prohlížení RSS kanálu s pětiminutovou periodou. Pokud vás nějaký příspěvek zaujme, stačí kliknout.

Uvedená šablona je velmi primitivní, je napsána procedurálně a vůbec nevyužívá nejsilnějších stránek XSLT. O tom však až příště.


 

  Aktivity (2)

Článek pro vás napsal Kit
Avatar
Jsem spokojeným uživatelem operačních systémů založených na linuxovém jádře. Zejména openSUSE a Ubuntu. Pro psaní veškerých textů a programů používám vynikající textový editor Vim. Aplikace se snažím psát vždy v tom nejvhodnějším programovacím jazyk...

Jak se ti líbí článek?
Celkem (1 hlasů) :
4444 4


 


Miniatura
Předchozí článek
PHP: Databáze INIFILE
Miniatura
Všechny články v sekci
Práce se soubory v PHP
Miniatura
Následující článek
Diskuze v PHP bez použití databáze

 

 

Komentáře

Avatar
Kit
Redaktor
Avatar
Kit:

Obarvení syntaxe XSLT se sice moc nepovedlo, ale snad to tolik nevadí.

Odpovědět 1.8.2012 23:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
David Jančík [sczdavos]:

On ten FSHL highlighter je celkem na nic. Dívali jsme se i na jeho zdrojové kódy a to teda bylo počteníčko... Zamýšlíme, že si napíšeme vlastní, stejně tak přemýšlíme i nad Texy. Přijde nám, že vše má akorát moc zbytečného kódu a ve výsledku to nic neumí.

Odpovědět 1.8.2012 23:34
Čím více času dostaneš, tím méně ho máš.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
Kit:

Zkusil jsem GeSHi a zvládl to perfektně. Texy! samotné to neumí, využívá právě GeSHi.

Odpovědět 1.8.2012 23:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Velmi zajímavá metoda generování výstupu :)

S tím GeSHi nemám moc dobré zkušenosti, co se týče výkonu. Byl asi 50x pomalejší, než to FSHL co tam máme teď, zvýrazňování trvalo v řádech stovek ms. Osobně nechápu, jak to autor dokázal. FSH to zvládlo v řádu desítek ms.

S FSHL máme nyní problémy, protože již není ve vývoji a nedá se v tom vyznat, jestli se chceš pobavit, tak se mu koukni na zdrojáky, něco takového jsem dlouho neviděl a opět nechápu, jak se to autorovi mohlo podařit.

Dost vážně přemýšlím o tom, že si napíši vlastní highlighter, protože nabídka již hotových řešení je příšerná a navíc v tom nevidím nic složitého. Zavadil jsem o Hyperlight, ještě zkusím ten, třeba to napotřetí bude lepší :)

Odpovědět 3.8.2012 15:46
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Jak je uvedeno v posledním odstavci: Je to napsáno procedurálně. Psát by se to tak nemělo, protože složitější případy by se tím dělaly obtížně. Když se to napíše deklarativně, tak na celý portál vystačíš s jedinou šablonou.

ad highlighter: Je nutné použít cache. Ve svém nehotovém CMS ji mám a výkonově je to úplně někde jinde.

Odpovědět 3.8.2012 20:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

V tomto příkladu jsem využil skutečnosti, že RSS obsahuje hotové XML, které stačí natáhnout do DOMu a aplikovat XSLT. Při generování výstupu aplikace nejprve musíš vyrobit XML nebo ještě lépe přímo DOM. Tak dosáhneš maximálního výkonu.

Odpovědět 4.8.2012 9:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
martinkobelka
Redaktor
Avatar
martinkobelka:

Fatal error: Class 'XSLTProcessor' not found in C:\EasyPHP-5.3.9\www\index.php on line 3
co s tím

 
Odpovědět 25.8.2012 14:25
Avatar
Kit
Redaktor
Avatar
Odpovídá na martinkobelka
Kit:

Je potřeba doinstalovat modul XSLT do PHP.

Odpovědět 25.8.2012 18:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
martinkobelka
Redaktor
Avatar
martinkobelka:

Není někde článek, kde bych se dočetl o popisu těch objektů co v článku používáte? pochopil jsem, že se šablona uloží do souboru csl, a pak si ji načtu do těch objektů, ale už nic o tom, jak ji v php zpracovat atd.

 
Odpovědět 29.8.2012 12:16
Avatar
Kit
Redaktor
Avatar
Odpovídá na martinkobelka
Kit:

O článku nevím. Používám oficiální dokumentaci PHP, kde je vše včetně příkladů. Dobrý tutoriál o XSLT v češtině napsal Jiří Kosek.

Odpovědět 29.8.2012 12:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.