Webcity.pl


  Wyrażenia w PHP

  Piszemy Engine cz. 3

  Piszemy Engine cz. 2

  Proste forum dyskusy...

  Optymalizacja skrypt...

 

 02.02.06 - [new] E-video - artykuł

 30.01.06 - [update] Artykuł o sesjach

 18.12.05 - [update] PDO - artykuł

 19.08.05 - [new+upd] Aktualizacja materia...

 26.04.05 - [update] Nowy artykuł



  Pomocy WML
[php]Sesje nie działają, ...
[actionscript 2.0] [flash...
Problem z talicami w php
[ocena] llll.pl darmowe a...
Kamera na stronie interne...
Kamera na stronie interne...
[xml] Jak wyciągnąć dane
Wizualizacja w JS - POMOC
Web Developer - stała / f...

... i wiele innych wątków na forum ›

Partnerzy
› allRSS.info - katalog zasobów RSS
› iloveflyer.org - webdesign
› webserv.pl - serverpack
› skryptoteka.pl - mnóstwo skryptów
› vel.pl - hosting
› TelePraca.net - pracuj swobodnie
› PHP Solutions - magazyn PHP
› HELION - wydawnictwo informatyczne

Ksišżka dnia

CityMag
Wpisz swój e-mail, aby zaprenumerować nasz Magazyn, który zawiera najnowsze informacje ze świata i najciekawsze teksty.
 

Szukasz czegoś?
Nasza wyszukiwarka znajdzie wszystko, czego szukasz.
 

Szukanie zawansowane


  Reklama
  Redakcja
  Hosting
  Kanał

© WebCity.pl Team
 
 
  Forum Forum
Kursy Kursy
Porady Porady
Recenzje Recenzje
Newsy Newsy
Katalog stron WWW Katalog
Skrypty PHP Skrypty
Download Oferty i praca
Artykuły:
 Teoria
 Praktyka
 Promocja
 Inne
 

 Webcity.pl |

Sablotron - arkusze XSLT w PHP

Autor: Paul Hudson
   Wstęp
Ten artykuł przeznaczony jest dla programistów PHP, którzy chcieliby szybko i bezboleśnie obrabiać za jego pomocą dokumenty XML. Chociaż zawiera on krótki wstęp do XML'a, niezorientowani w temacie powinni dodatkowo przeczytać o tym, jak PHP go przetwarza.

   Rzut okiem
Jakiś czas temu webmasterzy projektowali stronę tak, iż zarówno szata graficzna, treść, jak i style znajdowały się w jednym miejscu. Jednakże obecnie pojawił się nowy trend zalecający oddzielenie wszystkiego od siebie: XML przwchowuje zawartość, CSS style, a XHTML szatę graficzną. Wdrażając go u siebie, znacznie łatwiej jest manipulować informacjami bez wpływu na wygląd całości. Pomaga w tym XSLT: pozwala on na odpowiednie przetworzenie i wyświetlenie danych XML w przeglądarce.

   Czego się nauczysz?
Głównym celem tego tekstu jest nauczenie Cię, jak w PHP wykorzystać rozszerzenie XSLT bazujące na bibliotece Sablotron do przetwarzania dokumentów XML'a. Dokładnia znajomość tego ostatniego nie jest konieczna, chociaż bardzo się przydaje. Nauczysz się tu:
   - Tworzyć arkusze XSL
   - Aplikować je dokumentom XML za pomocą PHP
   - Manipulować procesem przetwarzania dla osiągnięcia maksymalnej elastyczności.

Będziesz potrafił także używać tych funkcji: xslt_create(); xslt_free(); xslt_process();

   Słowniczek
XML - eXtended Markup Language (Roszerzalny język znaczników) został stworzony do łatwego tworzenia własnych języków opartych na znacznikach, np. HTML.
XSL - eXtensible Stylesheet Language (Roszerzalny język arkuszy) jest elastyczną technologią opartą na XML'u do przetwarzania dokumnetów XML.
XSLT - XSL Transformations (Transformacje XSL) jest specjalnym rozszerzeniem XSL'a, które pozwala Ci na znaczne poszerzenie możliwości przetwarzania dokumentów XML.
XHTML - eXtended HyperText Markup Language (Rozszerzony Hipertekstowy Język Znaczników) to połączenie XML'owych reguł ze składnią HTML'a.

   Wymagania
Aby zainstalować rozszerzenie XML oraz XSLT, musisz najpierw zdobyć biblioteki Expat (Uwaga: w PHP 5 Expat został zastąpiony przez LibXML2) i Sablotron i zainstalować je gdziekolwiek; byleby kompilator mógł je znaleĽć. Jeśli budujesz PHP dla jednej z nowszych wersji serwera Apache, pierwsza z wymienionych bibliotek zostanie doinstalowana automatycznie do interpretera. Jeśli chodzi o Sablotron, to możesz go pobrać z http://www.gingerall.com.

Po zdobyciu niezbędnych plików, musisz po prostu zrekompilować PHP z dodatkowymi opcjami konfiguracyjnymi:

--with-xml --enable-xslt --with xslt-sablot

Uwaga: Funkcje obsługi XSLT zostały przepisane od nowa w PHP 4.1. Mocno zalecam aktualizację oprogramowania do wersji co najmniej 4.3, przed przetestowaniem jakiegokolwiek kawałka kodu z artykułu.

W systemie Windows całe zadanie polega na odnalezieniu odpowiednich bibliotek DLL w twojej dystrybucji i uaktywnienie ich w pliku php.ini. W zależności od wersji PHP, niektóre z nich mogą znajdować się w katalogu "experimental".

   Jak to działa - krótki wstęp do XML'a
Rozszerzalny Język Znaczników XML został zaprojektowany tak, by dać Ci możliwość definiowania twoich własnych języków znacznikowych. Dla wielu ludzi wygląda on po prostu jak HTML, którego można dostosować do własnych potrzeb. Prawda jest jednak bardziej skomplikowanana: możesz zdefiniować HTML (jak i inne języki) używając gramatyki XML'a (jeśli chodzi o tego HTML'a, to jest to niepotrzebne - W3C od dawna prowadzi prace nad XHTML'em, czyli wersją HTML'a zgodną z regułami XML'owymi).

Chociaż wiele dokumentów XML może przypominać HTML'a, jest kilka istotnych różnic między nimi. Wiele przeglądarek po prostu ładuje dokument HTML bez sprawdzenia go i próbuje nadać wszystkiemu jakieś kształty. To powoduje, że bez problemu możesz zadeklarować trzy tagi <body>, niespotykane atrybuty, niedomknięte wiersze tabeli i co tylko chcesz. Przeglądarki, używając odrobiny sztucznej inteligencji i tak zgadną, co chcesz wyświetlić. XML jest inny - reguły składni są jasno określone i nie wolno Ci ich złamać. Dzięki temu, nie jest konieczne zgadywanie, a co za tym idzie, pliki XML parsowane są szybciej i efektowniej. Są także bardziej zrozumiałe dla ludzi.

XML, na swoim podstawowym poziomie nie sprawdza jednak, czy jego zawartość jest zgodna z "gramatyką" twojego języka znaczników. Można to zrealizować poprzez dodanie DTD (Document Type Definition - Definicja Typu Dokumentu), które jasno określa, jakie tagi gdzie mogą się znaleĽć i jakie powinny mieć atrybuty.

Jeśli dokument ma dołączony arkusz DTD, jest poprawny pod względem samej budowy (ułożenia poszczególnych znaczników w pliku), co oznacza, że jest także zgodny z samymi zasadami budowy XML'a. To wszystko nie działa w drugą stronę. Dokument może w 100% spełniać reguły "gramatyki" XML'a, ale już nie DTD tego dokumentu.

Oto krótka lista cech każdego z dokumentów XML:
   * Wszystkie dokumenty muszą zawierać znacznik główny (root element). W nim umieszczona jest cała reszta. W HTML'u rolę znacznika głównego spełnia <html>.
   * Rozróżniana jest wielkość liter. <title> musi być zakończony poprzez </title> - </TiTlE>, oraz inne wariacje z wielkością liter nie będą działały - XML widzi tu dwa różne znaczniki.
   * Każdy element wymaga znacznika kończącego. Tak więc <tag> musi być zakończony poprzez </tag> gdzieś w pliku. <tag /> jest także poprawny, jeśli nie chcesz wewnątrz znacznika umieszczać żadnej treści.
   * Znaczniki muszą być zamykane we właściwej kolejności: <rodzic><potomek>coś</potomek></rodzic> jest prawidłowe, ale już <rodzic><potomek>coś</rodzic></potomek> nie będzie chodzić, ponieważ w pierwszej kolejności musisz zamknąć znaczniki najpóĽniej otwarte.
   * Wartości atrybutów muszą być zawarte w cudzysłowiach. Zamiast <body bgcolor=red> jesteś zmuszony pisać <body bgcolor="red">

W serwisie (chodzi o http://www.zend.com, z którego pochodzi artykuł - przyp. tłum.) znajdują się także inne samouczki XML'a. Jeśli potrzebujesz więcej informacji, zapoznaj się z nimi, zanim przejdziemy do dalszej części.

   Aby upewnić się, że rozumiesz już, o co chodzi, zaprezentuję tu dokument XML, który wykorzystam potem do zademonstrowania możliwości XSL'a:

<?xml version="1.0" encoding="ISO-8859-2"?>
<channel>
   <item type="klamstwo">
      <title>Microsoft kończy rozwój Windows</title>
      <url>http://www.nothere.com/foo/bar</url>
   </item>

   <item type="klamstwo">
      <title>George W. Bush znajduje Irak na mapie</title>
      <url>http://www.jakisserwis.irq/news/4544.html</url>
   </item>

   <item type="klamstwo">
      <title>Grzegorz M. sprzedaje lodówkę Eskimosom</title>
      <url>http://www.eskimostuff.nrd/ble/wombat.php</url>
   </item>
</channel>

Zapisz ten plik jako input.xml gdzieś, gdzie PHP będzie mógł sie do niego dostać; wrócimy do tego póĽniej. Teraz jednak zamierzam wytłumaczyć Ci, jak XML współpracuje z XSL'em.

   Pierwsze kroki z XSLT
XSLT jest językiem znaczników bazującym na XML, pozwalającym na manipulowaniu dokumentami XML przed ich wyświetleniem. PHP wspomaga ten proces dzięki wykorzystaniu biblioteki Sablotron.

Pisząc "XSLT manipuluje dokumentami XML" mam na myśli przetwarzanie ich (transformowanie, dlatego literka T w nazwie) w inną postać. Oznacza to, iż możesz, używając jednego dokumentu XML, przekonwertować go bez dokonywania w nim żadnych zmian w stronę WML, którą potem wyślesz do odbiorcy usługi WAP. Innym razem za pomocą innego arkusza XSLT przekształcisz ten sam dokument w listę instrukcji SQL dla twojej bazy danych.

Wiele przeglądarek (z MS Internet Explorer 6 na czele) potrafi wykonywać transformacje XSL'owe po stronie klienta. &brvbar;ciągają one dokument XML, arkusz XSL i ewentualne style CSS, po czym łączą je w jedno i całość prezentują na ekranie komputera gościa. Lecz co się stanie, gdy serwis odwiedzi ktoś z przeglądarką nie potrafiącą robić takich cudeniek? Po prostu nie zobaczy tego, co zobaczyć powinien.

Tu do akcji wkracza PHP. Gość wpisuje adres URL i dostaje się do strony, gdzie zachodzi cały proces generowania danych wyjściowych z połączenia XML'a z XSL'em. Dane te zazwyczaj są zapisane w formacie XHTML. Gośc nie widzi nic specjalnego - żadnych XML'i itp., tylko zwykły kod XHTML. Oczywiście nie ma żadnych przeszkód co do wysyłania tego w innych formatach: HTML2, WAP i czego tylko chcesz.

Teoria jednak nie na wiele się przydaje bez praktyki, dlatego dobrze Ci zrobi, gdy zobaczysz XSL'a w akcji. Stwórz więc sobie w tym samym katalogu plik input.xsl o takiej treści:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/">

<xsl:output method="html" indent="no" encoding="utf-8"/>

<xsl:template match="/">
<html>
<head>
<title>XSLT</title>
</head>
<body>

   <xsl:for-each select="/channel/item">
      Pojedynczy News: <xsl:value-of select="title"/><BR/>
   </xsl:for-each>

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

Przeanalizujmy to linia po linii...

Linia 1: <?xml version="1.0" encoding="utf-8" ?>: Powinno to być w każdym dokumencie, gdyż jest to określenie typu języka. Pamiętaj, XSL jest językiem opartym na XML'u, więc działa na dokładnie tych samych zasadach.

Linia 2: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/">: Definiuje przestrzeń nazw, jaką będziemy używać. Jeśli się jeszcze z nimi nie spotkałeś i nie rozumiesz, jak działają, pomyśl o nich jako o określeniach dla wyrazów. Na przykład ?<jackrussell>? może być zarówno imieniem człowieka, jak i psa, lecz ?<pies:jackrussell>? definiuje już, że mamy konkretny typ Jackrussell'a. Linia 2 określa, jaką przestrzeń nazw używamy, i gdzie w sieci znajduje się definicja standardu.

Linia 3: <xsl:output method="html" indent="no" encoding="utf-8"/>: pozwala zdefiniować konkretne parametry wyjściowe. Tutaj, dla przykładu, zdefiniowaliśmy, że wyjście jest kodem HTML z kodowaniem uft-8.

Linia 4: <xsl:template match="/">: Podstawowy element składni. XSL używa takich "wzorów" (ang. "matches" - przyp. tłum) do wyszukania elementów XML'a. Jeśli jakiś element będzie pasował do wzoru, zostaną wykonane instrukcje w szablonie, do którego on należał. W przykładzie za wzór występuje "/", oznaczające element główny (root). Jako że go posiada każdy dokument, cała jego zawartość jest przetwarzana na zasadzie tego właśnie szablonu.

Linie 5-9: <html>...<body>: To nie są instrukcje XSL'a, więc Sablotron traktuje je jako statyczne dane wyjściowe, które nie są przetwarzane.

Linia 10: xsl:for-each jest prostą pętlą do przeszukiwania tablic, podobną do PHP'owego "foreach()". Tutaj tablicą są wszystkie elementy pasujące do wzoru w atrybucie "select". Składnia wzoru jest podobna do tej używanej w xsl:template, chociaż w tym wypadku wyszukiwane są wszystkie "dzieci" innego elementu. Pętla wyszukuje każdy pasujący element, po czym wykonuje dla niego kod zawarty wewnątrz siebie.

Linia 11 do końca: To są znaczniki zamykające. Pamiętaj, że zawsze musisz wszystkie je zamykać!

   Łączymy XML i XSL za pomocą PHP
Posiadamy teraz zarówno plik XML z danymi, oraz plik XSL określający, jak mają dane te w przeglądarce wyglądać. Znajdują się jednak w separacji. Aby je połączyć, potrzebujemy podstawowego, magicznego składnika: PHP.

Chociaż PHP posiada tylko trzynaście funkcji do obsługi XSLT (w chwili pisania artykułu), wiele z nich jest dość skomplikowanych. Tutaj skupimy się na trzech podstawowych: xslt_create(), xslt_free(), oraz xslt_process().

xslt_create() i xslt_free() są używane razem do stworzenia i skasowania procesora XSLT. Aby przygotować go do pracy, musisz przynajmniej raz wywołać funkcję xslt_create(). Pamiętaj, że zwraca ona zasób tegoż procesora, który będzie używany we wszystkich innych funkcjach do obsługi XSLT. Na przykład xslt_free() pobiera go jako jedyny parameter, po czym zwalnia przydzieloną mu pamięć.

Teraz wystarczy użyć xslt_process(), będącej główną funkcją obsługi XSLT w PHP. Może ona pobrać maksymalnie sześć parametrów, a za jej pomocą łączymy dokumenty XSLT i XML w jeden. Wynikiem są przetworzone dane XML w takim formacie, jaki sobie zażyczyłeś.

Pierwsze trzy parametry tej funkcji to identyfikator zasobu procesora XSLT, położenie pliku XML, oraz XSLT. Wystarczą one spokojnie do całej operacji; reszta jest opcjonalna i zwykle ignorowana.

A tak to wygląda w praktyce:

xslt_process($xsltproc, '/sciezka/do/input.xml', '/sciezka/do/input.xsl');

Dodatkowo, aby stworzyć $xsltproc XSLT procesor, musisz przed xslt_process() wywołać:

$xsltproc = xslt_create();

a za nim:

xslt_free($xsltproc);

Okazuje się więc, że kompletny skrypt ma.... trzy linie długości: tworzymy procesor, łączymy dokumenty, zwalniamy pamięć.

   Pobieranie danych z wyjścia
Istnieją dwa sposoby pobrania gotowych danych z xslt_process():
   - Dodanie czwartego parametru, który umożliwia określenie pliku, do którego mają one trafić.
   - Zwrócenia danych, w przypadku niezdefiniowania, lub zostawienia pustego czwartego parametru.

Sposób, który wybierzesz, zależy od twoich planów wykorzystania tych danych. Zazwyczaj prawdopodobnie zignorujesz parametr czwarty (lub zostawisz go pustym), by otrzymać wynik do dalszej obróbki. Musisz po prostu przechwycić zwracaną zawartość i wrzucić ją do zmiennej, lub do komendy "echo". Tak to powinno mniej więcej wyglądać (xslt_test.php):

<?php
   $xsltproc = xslt_create();
   $xslt_result = xslt_process($xsltproc, '/sciezka/do/input.xml', '/sciezka/do/input.xsl');
   xslt_free($xsltproc);
?>
...........
<?php
   echo $xslt_result;
?>

W skrypcie pobieramy wartość generowaną przez xslt_process() do $xslt_result i wyświetlamy ją póĽniej. Choć tym przykładzie dobrze jest zastąpić przypisanie do zmiennej po prostu instrukcją "echo", możliwe, że będziesz chciał wprowadzić jakieś inne instrukcje w miejsce kropek pomiędzy funkcją xslt_process() i wyświetlaniem całości (pamiętaj, że nie trzeba dodawać tagu <HTML> na wyjściu PHP, ponieważ arkusz XSL jest tak zaprojektowany, iż wprowadza go wraz z innymi zamiast elementu głównego ROOT).

Uruchom skrypt xslt_test.php. Jeśli wszystko poszło tak, jak powinno, powinieneś ujrzeć na ekranie twój obrobiony plik XML. Przypatrz się także Ľródłom strony - jest tam tylko kod XHTML'a.

   Praktyczne zastosowanie XSL'a
Teraz, gdy umiemy już kontrolować przetwarzanie plików XML i arkuszy XSL, spróbujmy czegoś trudniejszego, co zademonstruje nam, jak bardzo elastyczne potrafi być połączenie XML'a i XSL'a.

Jak wspominałem wcześniej, XSLT potrafi przetwarzać dane wyjściowe na taki format, jaki sobie zażyczysz, włączając w to "nieformatowalne" języki takie jak SQL. Jeżeli zmodyfikujemy skrypt xslt_test.php tak, by sprawdzał, czy zmienna z $_GET jest ustawiona, będziemy mogli wybierać sobie, w jakiej postaci chcemy otrzymać nasze informacje.

Ta zmiana musi być wprowadzona w dwóch krokach. Po pierwsze potrzebujemy drugiego arkusza XSL, który będzie przetwarzał dokumenty na format SQL. Naturalnie będzie on podobny do poprzedniego, ponieważ budowa plików, których on dotyczy, jest taka sama: będzie więc ta sama pętla dla wszystkich elementów /channel/item, oraz ich konwersja.

Oto omawiany szablon. Zapisz go jako "sql.xsl" w tym samym katalogu, co pozostałe:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://my.netscape.com/rdf/simple/0.9/"
>
<xsl:output
method="html"
indent="no"
encoding="utf-8"
/>

<xsl:template match="/">
   <xsl:for-each select="/channel/item">
      INSERT INTO News (Title, Link) VALUES ('<xsl:value-of select="title"/>', '<xsl:value-of select="url"/>')<BR/>
   </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Kluczową zmianą jest brak jakiegokolwiek HTML'a. Dodatkowo tym razem arkusz wykorzystuje znacznik "url" z naszych dokumentów i wprowadza go do zapytania SQL.

Aby nowy arkusz w ogóle do czegoś nam się przydał, musisz także zmodyfikować skrypt PHP tak, by wybierał je w zależności od zmiennej z URL'a. Jest wiele różnych dróg do zrealizowania tego, lecz ja pokażę przykład, który pomoże Ci zacząć:

<?php

   $xsltproc = xslt_create();

   if(isset($_GET['USESQL'])) {
      $xslinput = 'sql.xsl';
   }else{
      $xslinput = 'formatted.xsl';
   }

   print xslt_process($xsltproc, 'final.rss', $xslinput);

   xslt_free($xsltproc)

?>


   Co jeszcze potrafi XSL?
Powinieneś być zaskoczony potęgą XSL'a. Jednak to, co widziałeś, naprawdę jest tylko początkiem. Na przykład wiele witryn zapisuje swoje wiadomości (newsy) także w formacie XML, by inne mogły je publikować także u siebie. Na ww. arkuszach XSL zamieściłem specyficzny atrybut xmlns w znaczniku xsl:stylesheet, ktory pozwala na przetwarzanie XML'owych formatów RSSi RDF, używanych właśnie do publikowania takich newsów.

W arkuszach XSL można także stosować znaczniki takie jak instrukcje warunkowe (coś na wzór "if foo = bar". W3C posiada potężną kolekcję materiałów o XML/XSL dostępnych za darmo z poziomu internetu, które są kopalnią nowych pomysłów. Nie zapomnij ich sprawdzić!

   Podsumowanie
XSLT jest naprawdę potężną technologią, ale, jak na nową technologię przystało, nie jest jeszcze obsługiwany przez wiele przeglądarek (i prawdopodobnie jeszcze jakiś czas nie będzie).

Podziękuj zatem sobie za wybranie PHP, oraz za to, że jego mechanizmy przetwarzania tych języków są szybkie i w 100% zgodne ze standardami. Końcowy rezultat przesiadki z przetwarzania XSLT po stronie klienta do parsowania po stronie serwera jest taki sam, jak użycie PHP do sprawdzania poprawności formularzy bez użycia JavaScript: masz 100% pewności, że wszystko zadziała poprawnie niezależnie od posiadanej przez gościa przeglądarki, oraz możesz dodać dodatkowe możliwości funkcjonalne, które normalnie nie byłyby dostępne.

Nawet najprostsze zastosowanie XML'a może zwrócić się w przyszłości stukrotnie poprzez naprawdę łatwą możliwość eksportu danych do najróżniejszych formatów. Ponadto, jeśliby jakiegoś brakowało, będziesz go mógł szybko dodać.

Uważam, że najbardziej popularnym zastosowaniem przetwarzania XSLT po stronie serwera jest generowanie jednej zawartości strony, niezależnej od typu, w jakim ma być wysłana (np. WML dla telefonów komórkowych).

   Materiały
http://www.php.net/manual/en/ref.xml.php
http://www.php.net/manual/en/ref.xslt.php
http://www.phpbuilder.com/columns/justin20001025.php3
http://www.phpbeginner.com/columns/ray/xml
http://www.w3schools.com

   O autorze
Paul Hudson jest pełnoetatowym redaktorem IT specjalizującym się w technologiach sieciowych. Możesz poczytać więcej o jego pracy co miesiąc w czasopiśmie "Linux Format" wyd. Future Publishing, lub skontaktować się osobiście poprzez hudzilla@php.net.

Przetłumaczył: ZyxwvU
Przetłumaczone za zgodą autora
Zakaz publikowania w innych serwisach

Powrót