Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web development, networking and server security. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Xml pitanja # 5



Transformacija DocBook dokumenata upotrebom XSLT

dr Dejvid Merc
transformator, Gnosis Software Inc.
oktobar 2000.

Extensible Stylesheet Language Transformations (XSLT) standardni je način u XML svetu za transformisanje XML dokumenata u druge formate. Određen broj alata dostupan je za XSLT obradu, i još više će ih biti dostupno kada se standard ujedini. Ovaj članak koristi DocBook XML dokument razvijen u prethodnim kolumnama kao primer XML izvornog dokumenta i provodi čitaoce kroz transformaciju ovog izvora u HTML izlazni dokument. Pored samog kreiranja XSL dokumenta, objašnjava se i upotreba alata za obradu.

Pozadina ovog članka

Dobrodošli u svet XML transformacija! Bojim se da vas čeka trnovit put: standardi se stapaju i prolaze kroz reviziju, alati su nerazvijeni i često puni bagova, implementacije su nedosledne, a izbori su ponekad prosto zbunjujući. Ipak, ne paničite. Vaš autor provešće vas kroz barem jednu putanju iz lavirinta. I situacija će se vremenom neminovno popraviti, iako uvek sporije nego što mi to želimo.

Poslednja dva izdanja "XML pitanja" raspravljala su o autorovom ličnom projektu za konvertovanje njegovih akademskih spisa u XML, a posebno u DocBook DTD. Te kolumne će, nadamo se, pružiti čitaocima dobru polaznu tačku za pisanje sopstvenih DocBook dokumenata.

S tačke gledišta ove kolumne, pretpostavimo da imamo lepo struktuirane, dobro formirane i validne DocBook XML dokumente na raspolaganju. Lepo je uopšte ih imati, ali sledeći korak je da se oni transformišu u konvencionalnije formate za krajnjeg korisnika: stvari kao što su HTML stranice, PDF datoteke i štampane stranice (sve ono što čitaoci zapravo čitaju). Ovo je upravo problem s kojim sam se suočio nakon konvertovanja dela moje arhive u DocBook, a ovaj članak predstavlja moje lično rešenje.

Moj glavni cilj - bar za sada - jeste dobra transformacija u HTML. Ali ne želim da u svojim nastojanjima isključim ostale izlazne formate. Uz to ide i nekoliko manjih ciljeva, takođe. Hteo bih da imam izvesnu kontrolu nad preciznim izlazom bez puno posla, i bez potrebe da učim mnogo novih jezika i tehnika. Takođe bih hteo da koristim alate koji su slobodni i alate koji su višeplatformski. Osim toga, veliki broj složenih zavisnosti je nedostatak, čak iako su svi neophodni dodaci slobodni i višeplatformski. U suštini, moj ideal je samostalni izvršni program koji radi, radi pouzdano i konvertuje moje DocBook dokumente u HTML baš u onom stilu koji želim. Pusti snovi, ali zašto da ne?

Pristupi transformacijama

Najmanje četiri pristupa moguća su za transformisanje DocBook dokumenta - ili skoro bilo kojeg XML dokumenta - u formate za krajnjeg korisnika. Samo će o poslednjem biti detaljno reči u ovoj kolumni, ali sve vredi imati u vidu dok planirate projekat koji podrazumeva transformacije koje se ponavljaju. Naravno, sve ove pristupe ozbiljno sam razmatrao za svoj mali projekat.

(1) Napišite prilagođeni kod transformacije. U idealnom slučaju, bilo bi dobro da se počne s programskim jezikom koji ima neke biblioteke za osnovne XML interfejse, kao što su SAX i DOM. Ali, čak i pod pretpostavkom da je osnovna analiza crna kutija, prilagođeni kod može da uradi šta god želite s analiziranim elementima. Na kraju krajeva, ovo je najfleksibilniji i najmoćniji pristup, ali je takođe verovatno da će zahtevati više rada, kako unapred tako i u održavanju.

(2) Koristite kaskadne stilove (Cascading Stylesheet) u svom DocBook dokumentu. To je ideja. Bilo bi dobro da se tipografske specifikacije drže potpuno odvojeno od strukturnog jezika za označavanje, i da jednostavno klijentski uređaj (npr. pretraživač) obavlja posao. To bi još moglo da se desi, ali trenutno izgleda da postoji samo ograničena podrška, i to samo u IE5.5, Operi 4 i u nekim od najnovijih programerskih izdanja Mozille. Izgleda da se nije stiglo do tačke gde se može računati da će krajnji korisnici uspeti ovo da iskoriste i ostvare.

(3) Koristite Document Style Semantics i Specification Language (DSSSL) da precizirate transformacije u ciljanim formatima. S pozitivne strane, izvestan broj DSSSL stilova već postoji za DocBook (i za druge formate). DSSSL je, u osnovi, potpuno novi programski jezik koji treba da se nauči, kao i funkcionalan programski jezik poput Lispa. Da biste iskoristili DSSL, morate da počnete sa alatkama Jade ili OpenJade; ali oni sami su dovoljno složeni da su mnogi ljudi napisali omotačke funkcije za njih (kao što je SGML-tools Lite). Da biste dobili funkcionalni sistem - mada, prema izveštajima veoma uspešan sistem - stvarno treba da zadovoljite razne vrste sistemskih zavisnosti, i da instalirate svakakve alate i biblioteke. U nekim dobronamernim, iako možda nedovoljno posvećenim, pokušajima, vaš autor nije uspeo da mu Jade alati glatko funkcionišu na sistemu. Očigledno da mnogo ljudi svakodnevno koristi ove sisteme, tako da bi malo više posla sigurno dovelo stvari u red. (Ako čitaoci mogu da me usmere ka nekom brzom, jednostavnom, sve-u-jedan DSSSL procesoru, voleo bih da pokušam.).

Još i više nego teškoće konfigurisanja, međutim, DSSSL jednostavno deluje kao da potiče iz drugačijih tradicija - i načina razmišljanja - od XML tehnika. Nasuprot tome, konačni pristup je u suštini čist XML i proizilazi iz službene (radne) specifikacije W3C. (XSLT).

(4) Koristite eXtensible Stylesheet Language Transformations (XSLT). XSLT je, zapravo, u izvesnom smislu, specifikacija za klasu XML dokumenata. To jest, XSLT stil sam je po sebi dobro koncipiran XML dokument s nekim specijalizovanim sadržajima koji vam omogućavaju da "šablonirate" izlazni format koji tražite ( videćemo šta to znači). Postoji veliki broj alata koji (makar nominalno) podržavaju XSLT; moj lični predosećaj je da je ovo zaista pravac kojim tehnologije idu za XML transformacije - bilo zbog ili uprkos svom "zvaničnom" statusu sa W3C.

XSLT je sposoban da odredi transformacije za bilo koji ciljni format, ali primetio sam da je opšti stav većine programera da im je najlakše da rade kada je ciljani format drugi XML format, kao što je XHTML.

Odabir Xslt alata

Odlomak “Resursi” sadrži dobar link sa opisima velikog broja XSLT alata. Isprobao sam nekoliko njih, ali sam ustanovio da Sabletron najviše odgovara mojim željama. To je slobodan, višeplatformski softver (GNU). Ima samostalni izvršni fajl koji je jednostavan za pokretanje iz komandne linije. I što je najvažnije, izgleda da radi ispravno, barem za moje jednostavne test slučajeve (ne rade svi s kojima sam pokušao).

Izvestan broj ostalih XSLT alata koje navodi XSLT.com takođe su slobodni softveri (vidite Resursi). Većina njih su, međutim, Java programi i takođe zavise od raznih dodatnih Java biblioteka. Nekoliko Java alata korisnici su pozitivno ocenili, tako da oni mogu biti dobar izbor za vas. Ali meni se dopao Sabletron kako zbog veće brzine kompajlovanja C, tako i zbog jednostavne instalacije i upotrebe.

Normal Volš kreirao je niz kompletnih XSLT stilova za DocBook. Nažalost, Sabletron jednostavno pada na njima, i XML Spy ne uspeva da pronađe nikakve podudarnosti u validnom DocBook dokumentu kada ih koristi (to su bili moji glavni pokušaji). Ovo je verovatno više ograničenje u alatima nego u Volšovim stilovima; možda ćete imati više sreće s drugim alatima. Ipak, ovaj problem daje nam priliku da razvijemo sopstvene (manje kompletne) XSLT stilove, što je ionako ono što zaista želimo.

Upotreba Sabletrona je prilično jednostavna. Osnove su:

X:\mydocs> x:\sabl\bin\sabcmd mystyle.xsl mydoc.xml mydoc.html

Ovo govori sledeće: koristite pravila u mystyle.xsl da transformišete u mydoc.xml i mydoc.html. Takođe možete da koristite cevi i preusmeravanje ako želite. Prilagodite putanje i nazive fajlova u skladu s vašim okruženjem; podešavanje Sabletrona je lako kao raspakivanje njegove arhive (takođe pruža i biblioteke koje možete pozvati iz svojih programa, ali komandna linija je dobar način da počnete). Na dokumentima umerene veličine, Sabletron je dovoljno brz da se koristi u CGI kontekstu, po želji.

Pisanje naše Xslt specifikacije

O detaljima XSLT-a pročitajte službenu W3C-ovu preporuku (vidite “Resursi”). Za ovu kolumnu, mi ćemo težiti više ka neformalnim detaljima o njegovom funkcionisanju.

Onaj DocBook dokument koji smo razvili u poslednjim kolumnama, chap5.xml bio je poglavlje. Samo relativno mali podskup svih mogućih DocBook tagova korišćen je u tom poglavlju. Dakle, za sada, sve što treba je chapter.xsl fajl koji će učiniti nešto korisno sa svakim tagom koji je zapravo iskorišćen u chap5.xml. Ovo je skroman početak, ali veoma ga je lako nadograditi zbog otvorene i rastegljive prirode XSLT-a. Hajde da pogledamo.

Počnimo s kosturom chapter.xsl uzorka - naš "kako da konvertujete poglavlje DocBook u HTML”:

Skeleton XSLT Document (empty.xls)

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns="http://www.w3.org/TR/xhtml1/strict">
  <xsl:output method="html" indent="yes" encoding="UTF-8"/>
</xsl:stylesheet>

Kao što možete da vidite, chapter.xsl dobro je koncipiran XML fajl. Kao što ćete takođe primetiti, mnogi od tagova u jednom XSLT dokumentu imenovani su obrascem imenskog prostora . Štaviše, svi tagovi koji izgledaju ovako jesu komande. Prilikom transformacije u XML tip formata, (kao što je HTML) videćete razne druge tagove, ali ti drugi tagovi pripadaju ciljnom formatu i pojaviće se samo u okviru elementa.

U suštini, trebalo bi da koristite tačno one atribute imenskog prostora (xmlns:xsl i xmlns) koji su gore navedeni. Verovatno je i izlazna linija ono što želite da zadržite; ali možete da koristite xml ili tekst metode. Dodeljeni imenski prostor (svi elementi koji nemaju prefiks) dozvoliće upotrebu XHTML tagova. Primetite da morate da zatvorite sve svoje XHTML tagove, ali html izlazni metod skinuće neke od tagova gde ih HTML ne koristi (na primer i
).

XSLT fajl iznad savršeno je dobar da se koristi kao uzorak za obradu. Međutim, možda neće uraditi baš ono što očekujete. Moglo bi se pretpostaviti da, pošto nikakav izlaz nije naveden, ništa i neće izaći. Ispostavlja se da to nije baš tačno: svi tekstualni čvorovi ipak se hvataju i, upotrebom gorenavedenog stila dobićete običnu ASCII verziju vašeg poglavlja. Ako zaista želite da nemate baš nikakav izlaz, ovo vam je potrebno za XSLT dokument:

Null-Output XSLT Document (null.xls)

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns="http://www.w3.org/TR/xhtml1/strict">
  <xsl:output method="html" indent="yes" encoding="UTF-8"/>

  <xsl:template match="*">
  </xsl:template>

</xsl:stylesheet>

Naš nulti-outputter kreće nas u pravcu korisne transformacije. Pravi stil je zaista samo opis skupa šalona koje treba pokušati upariti, i uzorak unutar svakog elementa koji daje šablon šta da se izbaci. Kao što primer pokazuje, "*" može da odgovara svakom uzorku; naš primer samo igrom slučaja ništa ne radi unutar šablona, ali ipak uspeva da upari svaki element koji bi mogao nastati u našem izvornom XML/DocBook dokumentu.

Uparivanje po poreklu

Snaga XSLT uzoraka leži uglavnom u njihovoj sposobnosti da prođu uparivanje po jednom elementu, prema bilo kom podelementu za koji se desi da odgovara ostalim uzorcima. Proširujući priču o našem nultom outputteru, hajde da kreiramo polu-smisleni stil. Bitan tag za dozvolu silaska u podelemente je . Generalno, svaki će uzorak uvrstiti ovaj tag negde u svom telu:

Minimal Chapter XSLT Document (minimal.xls)

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns="http://www.w3.org/TR/xhtml1/strict">
  <xsl:output method="html" indent="yes" encoding="UTF-8"/>

  <xsl:template match="chapter">
    ----- Start of Chapter -----
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="*">
    ##### Unmatched Element in Source #####
  </xsl:template>

</xsl:stylesheet>

Kada pokrenemo XSLT procesor koristeći ovaj stil i DocBook poglavlje, dobijamo ovako nešto:

----- Start of Chapter -----
##### Unmatched Element in Source #####
##### Unmatched Element in Source #####
##### Unmatched Element in Source #####

Ovaj izlaz nije baš toliko koristan, ali omogućava nam da vidimo šta stil radi. Osnovni element poglavlja je tag . To uparuje i najavljuje početke poglavlja. U okviru elementa javljaju se razna deca i svako takvo dete nazvano je nekako drugačije nego poglavlje, i stoga će proći uparivanje na "*" uzorku.

Za razvijanje sopstvenog XSLT stila, ostavljanje neke očigledne oznake, poput gorenavedene, za neuparene elemente omogućiće vam da brzo vidite koje uzorke treba da razvijete. Pogledajmo verziju s nekim realnim uzorcima:

Valid HTML Outputter XSLT Document

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns="http://www.w3.org/TR/xhtml1/strict">

  <xsl:output method="html" indent="yes" encoding="UTF-8"/>

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

  <xsl:template match="chapter/title">
    <hr></hr>
    <h1><xsl:apply-templates/></h1>
  </xsl:template>

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

  <xsl:template match="*">
     ##### Unmatched Element in Source #####
  </xsl:template>

</xsl:stylesheet>

Ovaj HTML-outputter pokazuje neke realistične odlike XSLT stila. Unutar poglavlja uparenog s uzorkom, mi izlažemo HTML dokument koji želimo da proizvedemo. Postoji mali specijal o XHTML tagovima unutar uparenog uzorka; svaki tekst koji tu stavimo pojaviće se u izlazu (ali ne možemo uključiti tagove koji se ne nalaze u XSL ili standardnom XHTML imenskom prostoru). U okviru HTML elementa , koristimo komandu da ubacimo podelement koji je potreban unutar u DocBook-u. U HTML elementu prenosimo kontrolu na druge uzorke. (verovatno ih ima poprilično za ceo DocBook).

Sledeći uzorak nakon poglavlja je poglavlje/naslov. To znači da se upari element , ali samo ako se javlja direktno u . Da smo hteli mogli smo jednostavno da uparimo naslov i time preciziramo izlazni format svakog elementa u izvornom dokumentu. Međutim, želimo da oblikujemo naslove poglavlja drugačije od , , i tako dalje. Izvodimo opšte uparivanje s u primeru (ali on se zapravo nikad ne upari, jer može da se pojavi samo unutar tagova koje još nismo uparili). Pored toga, i dalje uparujemo "*" što nam omogućava da vidimo da nam stil nije potpun kada pregledamo njegov izlaz.

Ponovljena deca

Uparivanje uzoraka po poreklu nije jedini trik koji XSLT ume da izvede. Takođe možete da izvedete uslovno izbacivanje, sortiranje, izvlačenje izvornih atributa i pravljenje petlje preko dece. Za ovu kolumnu, hajde da pogledamo petlje:

XSLT template for looping over subelements

<xsl:template match="simplelist">
  <ul>
    <xsl:for-each select="member">
      <li><xsl:apply-templates/></li>
    </xsl:for-each>
  </ul>
</xsl:template>

Umesto spuštanja do svakog podelementa u simplelisti, samo pretpostavimo da su podelementi svi <član> elementi. funkcioniše slično kao nested ​​uzorak, a takođe i slično kao konstrukcija petlje programskog jezika. Sadržaj elementa ići će na izlaz za svaki podelement koji odgovara odabranom atributu. U okviru petlje, sadržaj tekućeg elementa <član> postaje aktivni čvor koji se spušta do taga koji nalazimo unutar petlje. To jest, svaka stvar na listi možda ima dalje oznake u sebi i prepuštamo formatiranje tih elemenata njihovim odgovarajućim uzorcima (za tekstualne čvorove, oni su samo izlaz u slovnom obliku).

Za ubuduće

Ova kolumna samo je zagrebala površinu XSLT-a. Ali trebalo bi da je pružila čitaocu osećaj rada sa stilovima i transformacijama. Resursi nude mnoga mesta gde možete dalje da čitate o ovim pitanjima. Naročito vam može biti od koristi da pogledate potpunije XML i XSLT primere u arhivnom fajlu ovog članka. Budite u toku jer će se ova kolumna ponovo vraćati na XSLT na brojne načine.

O autoru



Dejvid Merc mora da je zameo svoj trag u jednom od svojih drugih članaka. Sigurno će se uskoro ponovo negde pojaviti. S Dejvidom možete kontaktirati na mertz@gnosis.ck. Njegov život opisan je na sajtu http://gnosis.ck/publish/. Dobrodošli su predlozi i preporuke o ovoj, prošlim, ili budućim kolumnama.



Published (Last edited): 05-11-2012 , source: http://gnosis.cx/publish/programming/xml_matters_5.html