Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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

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

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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

itnetwork.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('itnetwork.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 itnetwork.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ě.


 

 

Článek pro vás napsal Kit
Avatar
Jak se ti líbí článek?
1 hlasů
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...
Aktivity (3)

 

 

Komentáře

Avatar
Kit
Redaktor
Avatar
Kit:1.8.2012 23:16

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
David Jančík [sczdavos]
Tým ITnetwork
Avatar
Odpovídá na Kit
David Jančík [sczdavos]:1.8.2012 23:34

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:1.8.2012 23:49

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:3.8.2012 15:46

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:3.8.2012 20:35

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:4.8.2012 9:23

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:25.8.2012 14:25

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:25.8.2012 18:25

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:29.8.2012 12:16

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:29.8.2012 12:30

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.