XML + XSL + PHP
Monday, March 31st, 2008XML plus XSL
Najlepiej się uczy na przykładach. Dlatego na przykładzie pokażę o co chodzi w XSL. Przygotuje plik XML z danymi i dołączę do niego plik XSL. W wyniku chcę mieć tabelkę z danymi z XMLa. Zaczynam od XMLa.
<?xml version=”1.0″ encoding=”utf-8″?>
<?xml-stylesheet type=”text/xsl” href=”samochody-style.xsl”?>
<samochody>
<auto>
<marka>Audi</marka>
<model>A6</model>
<rok_prod>2006</rok_prod>
<cena>110000</cena>
</auto>
<auto>
<marka>Toyota</marka>
<model>Avensis</model>
<rok_prod>2008</rok_prod>
<cena>130000</cena>
</auto>
<auto>
<marka>Honda</marka>
<model>Civic</model>
<rok_prod>2004</rok_prod>
<cena>78000</cena>
</auto>
</samochody>
Plik samochody-style.xsl:
<?xml version=”1.0″ encoding=”utf-8″?>
<xsl:stylesheet version=”1.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”>
<xsl:template match=”samochody”>
<html>
<body>
<h2>Samochody</h2>
<table>
<tr>
<th>Marka samochodu</th>
<th>Model samochodu</th>
<th>Rok produkcji</th>
<th>Cena</th>
</tr>
<xsl:for-each select=”auto”>
<tr>
<td><xsl:value-of select=”marka”/></td>
<td><xsl:value-of select=”model”/></td>
<td><xsl:value-of select=”rok_prod”/></td>
<td><xsl:value-of select=”cena”/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Elementy wymagane
Arkusz XSL jest poprawnym dokumentem XML, więc pierwszą linijką będzie nagłówek XML: <?xml version=”1.0″ encoding=”utf-8″?>.
Główny elementem deklarującym dokument jako styl jest <xsl:stylesheet> lub <xsl:transform> (obie deklaracje są równoważne). Poprawny sposób zdeklarowania stylu XSL według zaleceń W3C wygląda tak: <xsl:stylesheet version=”1.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”> lub <xsl:transform version=”1.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”>
Arkusze stylów XSL
Arkusze stylów składają się ze zbiorów zasad zwanych szablonami. Aby utworzyć taki szablon trzeba użyć elementu xsl:template. Atrybut match jest używany do połączenia szablonu z elementami XML’a (np. match=”/” przypisuje schemat do całego dokumentu).
To co jest pomiędzy <xsl:template> a </xsl:template> zawiera kod HTML, który będzie wyświetlany. Aby wstawić w kod HTMLowy dane z XMLa trzeba użyć polecenia xsl:value-of. Atrybut select określa, które elementy będą odczytywane.
Pętla
Jeśli chcemy aby nasz styl przeszedł przez wszystkie węzły dokumentu XML musimy użyć pętli <xsl:for-each>. Jak w każdym poprawnym dokumencie XMLowym trzeba pamiętać aby każdy otwarty znacznik zamknąć. Pętlę też: </xsl:for-each>.
Możemy dodać warunek do pętli, a przez to filtrować dane. Kryterium filtrujące trzeba umieścić w kwadratowych nawiasach: <xsl:for-each select=”auto[marka='Toyota']“>. Warunek może być złożony. Są do dyspozycji operatory:
= równe
!= różne
< mniejsze niż (less than)
> większe niż (greater than)
Co by było gdyby
Do dyspozycji jest warunek logiczny IF – <xsl:if> </xsl:if>.
<xsl:if test=”warunek”>
…
…wyrażenia, które są przetwarzane, jeżeli zachodzi warunek
…
</xsl:if>
Możemy na przykład dodać element <xsl:if> wewnątrz elementu <xsl:for-each>.
Słicz i kejs
Elementu <xsl:choose> odpowiada switch/case z c++. Jeżeli któryś z warunków jest spełniony, to następne nie są sprawdzane.
<xsl:choose>
<xsl:when test=”warunek1″>
…
… przetwarzane, gdy warunek1 jest prawdziwy
…
</xsl:when>
<xsl:when test=”warunek2″>
…
… przetwarzane, gdy warunek2 jest prawdziwy
…
</xsl:when>
<xsl:otherwise>
…
… przetwarzane, gdy żadne z powyższych warunków nie były prawdziwe
…
</xsl:otherwise>
</xsl:choose>
Tak, a gdzie tutaj jest PHP? Otóż jeszcze nie ma :) Nic straconego. Poniżej jest przykład jak to wszystko współpracuje z naszym ulubionym językiem programowania :) Ale zanim zabiorę się za PHP warto jeszcze wspomnieć o pewnej istotne sprawie. W przykładzie z XMLem i XSLem kod strony generowany jest w locie. Ma to plusy (stosunkowo niewielkie obciążenie serwera) i minusy (ryzyko niekompatybilności). I tutaj naprzeciw naszym potrzebom wychodzi PHP.
PHP w wersji 5_ ma wbudowane wsparcie dla transformacji XSL (serwer PHP musi być uruchomiony z opcją – with-xsl, a w systemie konieczna jest instalacja biblioteki libxslt). Można więc bez problemu wygenerować kod HTML i wysłać go do przeglądarki użytkownika. Do tego jest potrzebny jeszcze jeden plik – auta.php.
<?php
//Wczytuje plik XML
$xml = new DOMDocument(’1.0′, ‘utf-8′);
$xml->load(’samochody.xml’);
//Wczytuje arkusz XSL
$xsl = new DOMDocument(’1.0′, ‘utf-8′);
$xsl->load(’samochody-style.xsl’);
//Podczepiam arkusz stylów
$dane = new XSLTProcessor;
$dane->importStyleSheet($xsl);
//Wyswietlam koh HTML wygenerowany z XMLa i stylów XSL
echo $dane->transformToXML($xml);
?>
O co chodzi w users.php?
Pierwszą rzeczą jaką robi skrypt to wczytanie pliku XML oraz XSL (do tego celu wykorzystujemy
jeden z standardowo dostępnych modułów PHP5 – Document Object Model – DOM). Następnie
dokonuje transformacji i ostatecznie wyświetla efekt końcowy w przeglądarce. Całą pracę
wykonuje za nas PHP.
Ta metoda zapewnia pełną kompatybilność z przeglądarkami nieobsługującymi XSLT, jednak
każdorazowe generowanie strony w większym stopniu obciąża serwer.
Ot i cała sztuka :) Pierwszą rzeczą jaką robi skrypt to wczytuje XML i XSL. Później dokonuje transformacji i wyświetla wynik w przeglądarce. Całą pracę wykonuje PHP. Dzięki temu mamy pełną kompatybilność z przeglądarkami bez wsparcia dla XSLT, jednak każdorazowe generowanie strony w większym stopniu obciąża serwer.
Do tego można jeszcze dołożyć odrobinę MySQLa aby pozyskiwać dane z bazy a nie z pliku i mamy wszystko aby napisać ekonomiczną aplikację webową :) O MySQLu troszkę później :)