Ta strona wygląda tak kiepsko, ponieważ korzystasz z przeglądarki nie obsługującej ogólnie przyjętych standardów internetowych. Aby zobaczyą ją w pełnej krasie, zaktualizuj ją do wersji zgodnej z tymi standardami. Trwa to krótko i nie kosztuje nic.

Rodzina XSL

Michał Paluchowski | opublikowany: 2004-10-10 | średnia ocena: 3.41/5

Dyskusje zwolenników wyższości formy nad treścią i ich przeciwników trwają już od wieków. Szybko znalazły one swoje miejsce w nowej, internetowej rzeczywistości, gdy wraz z rozwojem technologii tworzenia stron WWW z jednej strony jak grzyby po deszczu wyrosły witryny zachwycające szatą graficzną, ubogie w treść, a z drugiej o wręcz ascetycznym wyglądzie, zawierające jednak niezwykle cenne informacje.

wydrukuj artykuł wyślij artykuł skomentuj i oceń artykuł wyślij komentarz
o autorach
Michał  Paluchowski Michał Paluchowski

CEO, właściciel i redaktor vortalu NetHut.pl. Jego ulubionym tygodnikiem jest Wprost, a na co dzień z przyjemnością czyta Gazetę Wyborczą. Jest zakochany w muzyce i komputerach, czasem nieco ekscentryczny. Zawsze otwarty na nowe znajomości.

Łącznie napisał dla nas 45 artykułów.

tych samych autorów
zobacz również

Optymalnym rozwiązaniem okazał się, jak zawsze, złoty środek, a więc akceptacja wagi zarówno formy jak i treści, ich nawzajem uzupełniających się ról, oraz konsekwentne poszukiwanie równowagi między jednym a drugim.

Pora więc uzupełnić braki jakie posiada mogłoby się wydawać doskonały system przechowywania danych jakim jest XML. Wadą wynikającą bezpośrednio z jego otwartości – możliwości definiowania dowolnych znaczników – jest, iż przeglądarki nie wiedzą jak owe znaczniki interpretować i jak formatować ich wygląd. Próba wywołania dokumentu XML w przeglądarce skutkuje po prostu wyświetleniem jego zhierarchizowanej zawartości.

By pomóc przeglądarkom, dostarczając informacje o zamierzonej interpretacji znaczników opracowane zostały standardy XSL (eXtensible Stylesheet Language). Na rodzinę tych standardów składają się trzy języki:


Dwie ostatnie pozycje są dla nas mniej interesujące, przynajmniej w chwili obecnej. Skoncentrujemy się tutaj ściśle na XSLT, ponieważ to on stanowi podstawę formatowania zawartości plików XML.

Przykład do pracy

Zacznijmy więc od przykładowego pliku XML, z którym będziemy pracować:

<?xml version="1.0" encoding="UTF-8"?>
<news>
<wiadomosc>
<tytul>Rewolucja w Internecie!</tytul>
<autor>Jan Kowalski </autor>
<data>21.08.04</data>
<tresc>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et
dolore magna aliquyam erat, sed diam voluptua.
</tresc>
</wiadomosc>
<wiadomosc>
<tytul>Sprawy wagi państwowej</tytul>
<autor>Andrzej Nowak</autor>
<data>19.07.04</data>
<tresc>
Duis autem vel eum iriure dolor in hendrerit in vulputate
velit esse molestie consequat, vel illum dolore eu
feugiat nulla facilisis.
</tresc>
</wiadomosc>
</news>

Jak widać nasz przykład zawiera dwie wiadomości, każda z własnym tytułem, datą publikacji, nazwiskiem autora i treścią. Po zapisaniu powyższej treści do pliku, powiedzmy example.xml i otwarciu go w przeglądarce internetowej, ukaże nam się poniższy widok:

Kolumny tabeli 'goscie'

Jeśli jednak w strukturze dokumentu pojawi się jakiś błąd, przykładowo wewnątrz znacznika zamykającego </tresc> zniknie slash, a więc pozostanie <tresc>, parser w przeglądarce błyskawicznie nam to zgłosi:

Kolumny tabeli 'goscie'

To właśnie jest ogromną zaletą przechowywania treści w formacie XML. Szczególnie w dużych systemach zarządzania treścią, z których korzystają większe grupy autorów. Parsery XML w procesie sprawdzania poprawności kodu wykryją wszystkie formalne błędy, tym samym minimalizując ryzyko nieprawidłowości w formatowaniu dokumentu. To duży plus, gdy autorami treści dla danej strony WWW mają być osoby potocznie mówiąc ‘nietechniczne’.

Wracając do pierwszego obrazka, tuż nad dokumentem, na szarym tle przeglądarka wyświetliła lakoniczny komunikat o braku informacji dotyczących stylu wyświetlania powiązanych z danym dokumentem, stąd został on pokazany w stanie ‘surowym’. Te brakujące informacje to właśnie XSL.

Skoro już nawet przeglądarka się tego domaga, czas stworzyć arkusz stylów XSL, zawierający instrukcje wyświetlania w przeglądarce poszczególnych elementów pliku XML. Szkielet arkusza będzie wyglądał następująco:

<?xml version="1.0" encoding="UTF-8"?>
<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 XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" />

<!-— instrukcje formatowania -->

</xsl:stylesheet>

Zawiera on ogólne informacje o typie dokumentu, jaki ma powstać po przetworzeniu oryginalnego pliku XML. Znacznik xml:stylesheet ogranicza treść arkusza, zawiera wykorzystaną wersję XSL oraz xml namespace (xmlns), dosłownie ‘przestrzeń nazw’ a więc wskazanie na dokument na serwerze W3C zawierający listę dozwolonych znaczników.

Kolejny znacznik jest szczególnie istotny. To właśnie xsl:output decyduje jaki dokument ostatecznie wygeneruje parser. Jak widać, będzie to dokument XHTML o kodowaniu znaków w standardzie UTF-8.

Nasz szkielet arkusza możemy zapisać jako example.xsl. Aby teraz połączyć przykładowy example.xml z obecnym szkieletem, musimy do pliku XML dodać jeszcze jeden znacznik. Zaraz pod znacznikiem <?xml... a przed <news> wstawiamy:

<?xml-stylesheet href="example.xsl" type="text/xsl"?>

Jest to instrukcja dla parsera XML, aby instrukcji dotyczących formatowania szukał w podanym pliku. Gdy tak uzupełniony plik XML otworzymy w przeglądarce, zależnie od programu wyświetli się albo zawartość example.xml w jednej linijce, bez znaczników (Internet Explorer), albo pusta strona (Mozilla). Przystępujemy więc do formatowania, w miejscu komentarza <!—instrukcje formatowania --> umieszczamy:

<xsl:template match="/news">
<html>
<head>
<title>News</title>
</head>
<body>
<h1>Wiadomości</h1>
<xsl:apply-templates select="wiadomosc"/>
</body>
</html>
</xsl:template>

Oto pojedyncza reguła formatowania, nazywana w terminologii XSL ‘template’, czyli po Polsku szablon. Zasadniczo dla każdego znacznika XML tworzy się więc osobny szablon. Zaczynamy od pierwszego w hierarchii znacznika <news>, do którego odwołuje się parametr match=”/news”. Wartość tego parametru /news jest wyrażeniem wcześniej wspomnianego standardu XPAth, będącym ścieżką do poszukiwanego elementu. Slash / na początku oznacza, że poszukiwany znacznik jest właśnie najwyższym w hierarchii.

Parser, po otrzymaniu takiej instrukcji zamieni znacznik <news> wraz z zawartością na podany kod XHTML. Z kolei znacznik <xsl:apply-templates select="wiadomosc"/> wskazuje miejsce, w którym zastosowane mają zostać reguły z szablonów dotyczących znaczników wiadomosc. Dodajmy więc te reguły:

<xsl:template match="wiadomosc/tytul">
<h2><xsl:apply-templates/></h2>
</xsl:template>

<xsl:template match="wiadomosc/autor">
autor: <strong><xsl:apply-templates/></strong>
</xsl:template>

<xsl:template match="wiadomosc/data">
data: <em><xsl:apply-templates/></em>
</xsl:template>

<xsl:template match="wiadomosc/tresc">
<p><xsl:apply-templates/></p>
</xsl:template>

Ich działanie po krótkim przyjrzeniu się powinno być oczywiste. Definiujemy zamienniki w XHTML dla kolejnych znaczników XML, parser natomiast wstawia zawartość pierwotnych znaczników w miejsca gdzie podane jest <xsl:apply-templates/>. Otwierając nasz example.xml w przeglądarce po uzupełnieniu arkusza XSL zobaczymy taki widok:

Kolumny tabeli 'goscie'

W ramach eksperymentu proponuję wprowadzić jakiś błąd do kodu HTML w arkuszu XSL, na przykład zamieniając znacznik </p> na <p> i zobaczyć wynik w przeglądarce.

Po stronie serwera

Wszystkie transformacje dokumentu XML, które oglądaliśmy dotychczas miały miejsce po stronie klienta, wykonywane przez przeglądarkę stron WWW. Zobaczmy teraz na przykładzie PHP, jak parsowanie może wyglądać po stronie serwera. Na początek trzeba jednak sprawdzić, czy w naszej instalacji PHP uruchomione jest rozszerzenie XSLT. Kiedy tak już się stanie, kod jest zaskakująco krótki:

<?php
// Wywołujemy procesor XSLT
$procesor = xslt_create();

// Dokonujemy transformacji
$kod_html = xslt_process($procesor, 'example.xml', 'example.xsl');

// Jeśli pojawiły się jakieś błędy
// wyświetlamy je
if (!$kod_html)
{
die('Błąd przetwarzania XSLT: '.xslt_error($procesor));
}

// Zwalniamy pamięć zajętą przez procesor
xslt_free($procesor);

// Wyświetlamy rezultat
echo $kod_html;
?>

Rezultat wywołania strony o tym kodzie powinien być identyczny z uzyskanym przez lokalne otwarcie pliku example.xml.

Teraz pozostaje już tylko stosować połączenie XML z XSL w praktyce. Mnie pozostaje jedynie życzyć samych profitów związanych z wykorzystaniem tych technologii.

oceń artykuł: Kiepski 1 2 3 4 5 Doskonały
 
projekt i multimedia
programowanie
marketing
strategie prowadzenia
infrastruktura
praca