Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!
Kategorie

Kategorie

Kategoria wyżej
O autorze

O autorze

Tomasz (Slump) Szczupliński
Reklama

Reklama

Przetwarzanie XML do HTML za pomoca PHP i XSL

Cel

Prezentowanie zawartości jest jednym z największych wyzwań oraz zabiera najwięcej czasu podczas tworzenia strony internetowej. Turtolial ten ukazuje w jaki sposób transformować dokument XML do HTML wykorzystując PHP i XSL. Jako praktyczny przykład, Turtolial ten jest dostępny zarówno w formie XML jak i XSL które transformuje je do podstawowego Zend.com'a.

Zasadniczym celem tego dokumentu jest demonstracja sposobu przekształcenia dokumentu Xml do HTML za wykorzystaniem jedynie PHP i XSl.

Co wnosi

W artykule tym znajdziesz:

  • Wprowadzenie do technologii XML, XSL oraz Simplified DocBook DTD.
  • Informację, w jaki sposób za wykorzystaniem PHP i XSL dokonać transformacji dokumenty XML do formatu HTML.

Informacje podstawowe

Podczas pracy z ogromną ilością danych pochodzących od różnych autorów ( jak np. na stronie Zend.com) potrzebujesz efektownej metody zarządzania i organizowania danych. W sieci dokumenty bardzo często trzeba prezentować w wielu różnych formatach. XML rozwinął się na fali popularności publikowania danych w Internecie, ponieważ pozwala na zapisywanie danych w ustrukturyzowanych formatach, łatwych w transformowaniu do różnorakich postaci.

XSL zostało stworzone jako narzędzie służące do transformowania dokumentów XML. Jądro XSL zostało stworzone z trzech technologii. XSL:T, XPath oraz XSL-FO. W tym poradniku skupimy się tylko na XSL:T (szablony) oraz na XPath w celu generowania kodu HTML.

Definicje

  • XML jest meta językiem służącym do definiowania jeżyka znacznikowego. Więcej informacji o XML znajdziesz w "What is XML?" na XML.com
  • XSL (Extensible Stylesheet Language) jest używany do formułowania szablonu styli (Stylesheets) dla dokumentu XML. Składa się z trzech części, XSLT (transformacje), Xpath, oraz XML-FO. Dokument XSL jest poprawnie sformatowanym dokumentem XML, instruującym procesor języka XSL w jaki sposób dokonać transformacji dokumentu XML. Zobacz, What is XSL? Aby uzyskać więcej informacji.
  • XPath jest językiem adresującym i dostępowym do części dokumentów XML. Został zaprojektowany w współpracy z XSL:T. Specyfikację XPath można znaleźć: http://www.w3.org/TR/xpath, Turtoliale natomiast: http://www.w3schools.com/xpath/
  • XSL:T - XSL:T jest jedną z podstawowych technologii XSL, oraz jest językiem transformującym dokumenty XML do innych formatów zapisu danych. Specyfikację XSL:T można znaleźć http://www.w3.org/TR/xslt turtoliale natomiast http://www.w3schools.com/xsl/.

Simplified DocBook

Simplified DocBook jest pochodną oryginalnego DocBook XML DTD. Oryginalne DocBook DTD jest idealne do zastosowań, w których pracujemy z dużymi ilościami danych, jednak przy małych projektach jest nie wygodny. Simplified DocBook skierowany jest do bardziej ograniczonych zastosowań, w zamian za to dostarczając lepiej wyspecjalizowany zestaw narzędzi.

Simplified DocBook jest o wiele mniejsza aplikacja od oryginalnego i pełnego DocBook DTD, zachowując jednak funkcjonalność oryginału. Simplified DocBook składa się z 106 elementów, 525 wpisów i 26 notatek.

Więcej informacji na temat Simplified DocBook można znaleźć na: http://www.oasis-open.org/docbook/xml/simple/.

Wymagania

  • Skompilowane PHP wraz ze wsparciem dla XML oraz XSL
  • Pliki źródłowe Simplified DocBook
  • Dokument XSL

Jak to działa

Tworzenie pliku XML

Pisania materiałów korzystając z języka znacznikowego jest procesem bardzo czasochłonnym i nie przyjemnym. Posiadanie odpowiednich narzędzi może przyspieszyć i uprzyjemnić prace nad ustrukturyzowanymi dokumentami. Dla przykładu: Piszę zawartość tego tutorialu w notatniku pochodzącym z pakietu Open Office'a, program ten przetwarza go do XML za pomocą edytora XML napisanego przez XMLmind.com, który od razu jest gotowy do opublikowania.

Korzyścią wynikająca z używania narzędzi XML w celu pośredniczenia w procesie strukturyzacji, jest fakt, iż finalny dokument jest mniej narażony na błędy czynnika ludzkiego. Większość narzędzi XML posiada rozwiązania automatycznie formatujące Tagi XML, oraz umożliwiające sprawdzenie poprawności składni przetwarzanego dokumentu.

Struktura Simplified DocBook

Pomimo faktu iż Simplifed DocBook jest jedynie małą częścią DocBook, nadal może posiadać zbędne dla nas wpisy. Niniejsza sekcja przedstawia wprowadzenie i wyjaśnienie znaczenia struktury DocBook.

<?xml version='1.0' encoding='UTF-8'?> 
<!DOCTYPE article PUBLIC "-//OASIS//DTD Simplified DocBook XML V4.1.2.5//EN" 
"http://www.oasis-open.org/docbook/xml/simple/4.1.2.5/sdocbook.dtd"> 
<article> 
  <title>Krótki przykład</title> 

  <section> 
    <title>Sekcja #1</title> 

    <para>Krótki przykład pliku systemu.</para> 
  </section> 
</article>

W Simplified DocBook są tylko dwie główne struktury elementów, mianowicie <article> oraz <section>. Inne elementy, takie jak Np. <para>, <example>, <itemizedlist>, etc. opisują jedynie różne opcje przetwarzanego dokumentu.

Dla Simplified DocBook nadrzędnym elementem jest zawsze <article>. Element ten może być separowany w sekcjach, a każda sekcja może zawierać w sobie nielimitowaną ilość subsekcji. Najważniejsze z podstawowych typów elementów to titles, paragraphs, links, oraz lists. W celu poznania spisu wszystkich dostępnych elementów zobacz Simplified DocBook: The Definitive Guide.

Tworzenie szablonu XSL

Celem stworzonego przez nas szablonu XSL będzie przetworzenie struktury danych Simplified DocBook do standardowej formy turtoliala Zend.com'a. Standardowa forma tego dokumentu zawiera:

  • Tytuł tutoliala
  • Data artykułu
  • Nazwa autora
  • Tabele zawartości
  • Grupa docelowa
  • Podsumowanie wykładu
  • Cel
  • Definicje
  • Zastosowanie
  • Informacje
  • Wymagania
  • Jak to działa
  • Przykładowy skrypt

Stworzenie szablonów styli korzystających z XSL w celi ich transformacji do HTML jest troszkę bardziej skomplikowane od stworzenia pliku danych XML, ponieważ wymagana jest wiedza o obu językach szablonów oraz o XPath. Wszystko poza wprowadzeniem do tych technologii jest poza zakresem tego tutoliala, jednak postaram się podsunąć Wam podstawowe informacje o roli każdej z tych technologii w procesie transformacji.

Oto przykład szablonu XSL do transformacji:

<xml version='1.0'?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'> 
     
    <xsl:output method="html"/> 
    <xsl:template match="/"> 
      <html> 
        <head><title><xsl:value-of select="title"/></title></head> 
        <body> 
          <xsl:apply-templates/> 
        </body> 
      </html> 
    </xsl:template> 
     
    <xsl:template match="article/title"> 
      <h1><xsl:value-of select="."/></h1> 
    </xsl:template> 
     
    <xsl:template match="section"> 
        <xsl:apply-templates/> 
    </xsl:template> 
         
        <!-Ustawienia formatowania WYŁĄCZNIE dla nazw (titles) sekcji --> 
        <xsl:template match="section/title"> 
          <h2><xsl:value-of select="."/></h2> 
        </xsl:template> 
     
    <xsl:template match="para"> 
      <P><xsl:apply-templates/></P> 
    </xsl:template> 
</xsl:stylesheet>

Jak widać szablon XSL jest prostym i poprawnie sformatowanym dokumentem XML. Głównym elementem jest <xsl:stylesheet>, stworzonym z <xsl:output>, <xsl:template>, <xsl:apply-templates> oraz <xsl:value-of>. Istnieje jeszcze kilka użytecznych elementów jednak wymienione cztery są esencja wystarczającą do stworzenia funkcjonalnego jądra.

Podstawowe elementy XSL

Istnieje jeszcze kilka ważnych i użytecznych elementów takich jak między innymi <xsl:if> oraz <xsl:choose> pozwalających na testowanie składni przed wprowadzeniem zasad, <xsl:for-each> pozwala na powiązanie kilku elementów. oraz <xsl:sort> pozwalającego na sortowanie pliku wyjściowego.

Połączenie wszystkiego razem

Wykonanie transformacji za pomocą PHP jest bardzo łatwe. Najtrudniejszym zadaniem podczas używania XSL w PHP jest przygotowanie aktualnego pliku do transformacji.

Transformowanie plików XML i XSL wykorzystując PHP sprowadza się do dwóch kroków: Pierwszym krokiem jest stworzenie procesora dla XSL:T za pomocą metody xlst_create(); Drugim krokiem jest użycie metody xlst_process() w celu dokonania transformacji pliku XML do HTML.

Funkcja xslt_process() dokonuje całej pracy związanej z transformacją. Są trzy oddzielne sposoby użycia xslt_process(). Poniższe przykłady pochodzą z Manuala PHP.

Metoda 1: Automatyczne zachowanie rezultatów do pliku
<?php 

// Inicjalizowanie nowego procesora XSLT 
$xh = xslt_create(); 

// Przetwarzanie dokumentu 
if (xslt_process($xh, 'sample.xml', 'sample.xsl', 'result.xml')) { 
    print "SUKCES, plik sample.xml został przetworzony poprzez sample.xsl i zapisany jako result.xml"; 
    print ", result.xml posiada następującą zawartość\n<br>\n"; 
    print "<pre>\n"; 
    readfile('result.xml'); 
    print "</pre>\n"; 
} 
else { 
    print "Niestety, plik  sample.xml nie został przetworzony poprzez sample.xsl w"; 
    print "  plik result.xml z powodu " . xslt_error($xh) .; 
    print "kod błędu to " . xslt_errno($xh); 
} 

xslt_free($xh); 

?> 
Metoda 2: Pobranie rezultatów jako wartość string

(W większości wypadków ta metoda jest bardziej użyteczna.)

<?php

// Inicjalizowanie nowego procesora XSLT 
$xh = xslt_create(); 

// Przetwarzanie dokumentu, zapisywanie rezultatu jako wartość pola $result $result = xslt_process($xh, 'sample.xml', 'sample.xsl'); 
if ($result) { 
    print "SUKCES, plik sample.xml został przetworzony poprzez example.xsl w wartość pola \$result"; 
    print "struktura pola \$result wygląda następująco \n<br>\n"; 
    print "<pre>\n"; 
    print $result; 
    print "</pre>\n"; 
} 
else { 
    print "Niestety, plik sample.xml nie został przetworzony poprzez sample.xsl w"; 
    print "  wartość pola \$result z powodu " . xslt_error($xh) .  
    print " kod błędu to " . xslt_errno($xh); 
} 

xslt_free($xh); 

?> 
Metoda 3: Wprowadzanie i pobieranie stringów

Trzecia metoda używa xslt_process() w celu wprowadzenia dokumentów XML oraz XSL jako wartości typu string, i posiada funkcje do zwracania wartości jako string Ta metoda jest najbardziej elastyczna pozwala na przetwarzanie danych jeszcze przed przetworzeniem ich przez procesor.

<?php 
// $xml oraz $xsl zawierają odpowiednio dane typów XML i XSL 

$arguments = array( 
     '/_xml' => $xml, 
     '/_xsl' => $xsl 
); 

// Allocate a new XSLT processor 
$xh = xslt_create(); 

// Przetwarzanie dokumentu 
$result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);  
if ($result) { 
    print "SUKCES, plik sample.xml został przetworzony przy pomocy sample.xsl w wartość pola \$result"; 
    print " variable, struktura wartości pola wygląda następująco\n<br>\n"; 
    print "<pre>\n"; 
    print $result; 
    print "</pre>\n"; 
} 
else { 
    print "Niestety, plik sample.xml nie został przetworzony przy pomocy sample.xsl into"; 
    print "  w wartość pola \$result z powodu " . xslt_error($xh) .  
    print " kod błędu to " . xslt_errno($xh); 
} 
xslt_free($xh); 
?> 

Skrypt

Następujący skrypt demonstruje w jaki sposób przetwarzanie po (post-processing) przetransformowaniu z XML może zostać realizowane za pomocą PHP. Po przetworzeniu dokumentu PHP szuka specjalnych ograniczników (Tagów) w HTML, które oznaczają rozpoczęcie innego języka (np. php), a następnie rozpoczyna kolorowanie składni.

<?php 
     
function unhtmlentities ($string) 
{ // Z MANUALA PHP 
    $trans_tbl = get_html_translation_table (HTML_ENTITIES); 
    $trans_tbl = array_flip ($trans_tbl); 
    return strtr($string, $trans_tbl); 
} 

// $xml oraz $xsl zawierają odpowiednio dane typów XML i XSL... 
$xml = implode('',file('document.xml')); 
$xsl = implode('',file('sdocbook.xsl')); 

$xh = xslt_create(); 
$output = xslt_process($xh, 'arg:xml', 'arg:xsl', NULL, 
             array( 
              'xml' => $xml, 
              'xsl' => $xsl));  

/* Znajdż  wszystkie części których składnia ma zostać pokolorowana. 
   .. proces transformacji XSL wstawi Tagi typu 
   <parse_php>, <parse_xsl>, <parse_xml>... etc. 
   
*/ 
$types = array('php');  // dodaj więcej aby uzyskać lepsze i inne kolorowania składni 

foreach ($types as $type) { 
    $oKey = "<parse_$type>"; 
    $cKey = "</parse_$type>"; 

    $outputArray = explode($cKey,$output); 
    unset($outputArray[count($outputArray)-1]); // wprowadź dane na końcu. 
    foreach ($outputArray as $data) { 
        $data = substr($data,strpos($data,$oKey)+strlen($oKey)); 
        switch ($type) { // wykonanie kolorowania składni... 
            case 'php': 
                $dataReplace = unhtmlentities($data); 
                $dataReplace = highlight_string($dataReplace,true); 
                break;  
        } 
         
        // zamiana danych na wyjściu.. 
        $output = str_replace("$oKey$data$cKey",$dataReplace,$output); 
    } 
} 

echo $output; // wyświetlenie rezultatu 
?> 

O autorze

Kontakt z Bensonem można uzyskać pod adresem mailowym phpauthor@tummytech.com.

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (2)
Składnia szablonu
Czwartek 23 Lipiec 2009 9:30:09 am - szagi3891 <szeligagrzegorz_at_gmail.com>

Dodatkowo zamiast :

<xsl:template match="/">
<html>
<head><title><xsl:value-of select="title"/></title></head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>

<xsl:template match="article/title">
<h1><xsl:value-of select="."/></h1>
</xsl:template>


Zdaje się że powinno być :

<xsl:template match="/article">
<html>
<head><title><xsl:value-of select="title"/></title></head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>

<xsl:template match="title">
<h1><xsl:value-of select="."/></h1>
</xsl:template>

- dzięki temu znaczniki title są poprawnie wypełniane właściwą wartością

Literówki
Czwartek 23 Lipiec 2009 9:24:58 am - szagi3891 <szeligagrzegorz_at_gmail.com>

W przykładzie transformacji występują literówki.

Pierwsza z nich to :

<xml version='1.0'?>
powinno być
<?xml version='1.0'?>

kolejna to :
<!-Ustawienia formatowania WYŁĄCZNIE dla nazw (titles) sekcji -->

powinno być
<!--Ustawienia formatowania WYŁĄCZNIE dla nazw (titles) sekcji -->

Pozdrawiam

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2024 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System