Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
Bu makalenin farkl� dillerde bulundu�u adresler: Turkce  

[Photo of the Author]
by Egon Willighagen

Yazar Hakk�nda:

1999'da Alman LF tak�m�na kat�ld� ve senenin ba��nda ikinci editor oldu. �imdi Nijmegen �niversitesinde kimya ��rencisi . Basketbol oynamay� sever ve hiking yapmaktan ho�lan�r.

Icerik:

Perl'�n XML::XSLT mod�l�

�eviri : Selahattin Din�

[Illustration]

�zet:

Bu metinde Perl XML::XSLT mod�l� tan�t�lm��t�r. Metin, W3C's XSLT standart�n�n yeteneklerini ve XML belgeglerinin g�rsel sanal y�rede nas�l yay�nland���n� ele al�r.



 

�ns�z

XSL d�n���mleri (XSLT) W3C i�in genelde �nerilir ve bundan dolay� standart kabul edilebilir. XSLT :XML Stylesheet Dili olan XSL'in bir par�as�d�r. Ad�ndan da belli oldu�u gibi, amac� XML belgelerini stylesheet ya da �n y�z etmek ve nesneyi formatlama, XSL'deki bilgileri �n y�z etmede b�y�k �neme sahiptir. Ancak veri ge�i� s�resinde ona s�k s�k gereksinim duyulur .Ve o an XSLT'inin devreye girdigi and�r.

XSL kendi i�inde , XSLT zaten �nerilir ve dura�and�r. PEk �ok programlama dili XSLT i�lemcileri geli�tirmeye ba�lad�. Bu programlar i�inde en bilineni C' de (XT, James Clark taraf�ndan) ve Java 'da yaz�lm��t�r.(Xalan, Lotus Inc. taraf�ndan geli�tirildi ve Apache Foundation olarak bilinir.). Buna kar��n Perl'de �stelik iki proje devam etmekte.XML::XSLT ve XML::Sabotron. Former eski olan� ve aray�z� C++ XSLT i�lemcisi iken tamam� Perl'de yaz�ld�.  

XML::XSLT mod�l�

XSL ile k�yasland���nda, XSLT daha �ok �nerilen ve dura�an olan�d�r. Baz� programlama dillerinde XSLT i�lemcileri geli�tirilmekte. En geli�mi� olanlar� C (XT, uyumlu. Bu makalede 0.21 s�r�m� taban al�nd�. Perl mod�l� Geert Josten taraf�ndan geli�tirldi. Geert Josten, Nijmegen �niversitesinde kimya ��rencisi. Ancak bu anda pek �ok ki�i bu konuyla ilgili �al���yor.CVS a�ac�yla birlikte, XML::XSLT 'in geli�imi yard�m bekledi. W3C'nin gereken d�zenlenmesi h�zla yap�ld� ve XSLT �zerinde �al���yor.

A�a��daki Perl kodu mod�l�n nas�l kullan�ld���n� g�sterir:

#!/usr/bin/perl
 use XML::XSLT;
 
 my $xmlfile = "example.xml";
 my $xslfile =
"example.xsl";
 
 my $parser = XML::XSLT->new ($xslfile, "FILE");
 
$parser->transform_document ($xmlfile, "FILE");
 $parser->print_result();

Bu �rnekte XML dosyas�n�n (example.xml) XSLT dosyas�na(example.xsl ba�l� olarak nas�l ge�i� yapt�gin� g�sterir. Ama stil sayfas� DOM tree'ye de bagl� olabilir:

#!/usr/bin/perl
use XML::XSLT;
use XML::DOM;

my $domparser = new XML::DOM::Parser;
my $doc = $domparser->parsefile ("file.xml");

my $parser = XML::XSLT->new ($doc, "DOM");

veya bir string:


#!/usr/bin/perl
use XML::XSLT;

my $xsl_string = qq{
<?xml version="1.0"?>
<xsl:stylesheet>
  <xsl:template match="/">
    <html>
      <xsl:apply-templates/>
    </body>
  </xsl:template>
</xsl:stylesheet>
};

my $parser = XML::XSLT->new ($xsl_string, "STRING");

Ve bu �� tip ilk ornekte g�sterilen yol i�in bulunmaktad�r.

Buradaki script XSLT stil sayfalar�na ba�l� XML dosyas�n� �eviren scripttir. komutsat�r�na iki arguman� birden al�r,ve XSLT stil dosyas�n�n ve XML dosyas�n�n dosya ad�d�r ayn� zamanda. Script'in"FILE" mechanism'den yararland���na dikkat edin.

Simdi XSLT i�lemcisinin XML belgelerini Perl'de nas�l kulland���n� ve �evrildi�ini biliyoruz. �yleyse XSLT standard�na g�z atabiliriz.  

XSL D�n���m Standart�

XSL d�n���m�, XML icinde yedeklenmi� veriyi sunmay� kolayla�t�rmak i�in tasarlanm��t�r. XSL ile XML �zerinde d�zenleme ve tasar�m yap�labilir fakat XSLT , XML verisi �zerinde kaydetme, basit d�n���mler yapma, de�i�ik kaynaklardan bilgi se�ip birle�tirmemiz gibi i�leri yapmam�z� sa�lar. Her nekadar teoride bu b�yle g�z�kse de ger�ekte XSLT tasar�m ve d�zenleme i�in de uygundur.

XML::XSLT hen�z b�t�n XSLT komutlar�n� kapsam�yor. Fakat bu makaledeki b�t�n komutlar� anlayabiliyor.

XSLT belgeleri bir XML dokuman�n nas�l d�n��t�r�lmesi gerekti�ini tan�mlar. Bunu her element icin bir �ablon tan�mlayarak yapar. A�a��da bir �ok XSLT belgesi var. Bunlar Gnumeric worksheet (GNOME Spreadsheet application) i�eren ayn� i�i yapan tek bir XML belgesine uygulanm��t�r. (Dolay�s�yla, art�k Gnumeric's Storage Format '�n XML belgesi oldu�unu anlami� bulunuyorsunuz). Normal olarak hepsi gzip 'lenmi�tir.( Bir *.gnumeric dosyas�n� gunziplemeyi deneyin.)

E�er �rnekleri incelerseniz o an kullan�lan verinin yan�s�ra d�zenlenmi� verilerin de kaydedildigini g�receksiniz. �rnegin, sayfa d�zeni, h�cre geni�ligi ve y�ksekligi. �zel g�revler i�in bir �ok XSLT sayfas� haz�rlayacag�z. �rnek vermek gerekirse:

Bir XSLT dosyas�yla haz�rlanm�� cok basit bir �zet haz�rlayarak XSLT'nin temel �zelliklerini anlataca��z. (verysimple.xsl):

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

  <xsl:template match="text()"/>

  <xsl:template match="Item">
    <xsl:value-of select="./name"/> : <xsl:value-of select="./val-string"/>
  </xsl:template>

</xsl:stylesheet>

�lk �ablon XML dokuman�ndaki b�t�n elementlerle e�le�ir. �kinci �ablonda b�t�n XML belgesi i�indeki b�t�n CDATA ile e�le�iyor. Son �ablon ise tam olarak yapmak istedi�imizi yapar. Her iki ba�l�k , Gnumeric dok�man�nda name ve val-str�ng elementlerinin CDATA de�erini veriyor. Bunu s�nay�n. Kar��la�t�r�n : XML tabanl� dok�manda ne bekliyordunuz ?

Fakat ilk �ablon zaten "item" ile e�lesiyor, degil mi? �yleyse neden �c�nc� �ablona ba�vuruyor da ilkine degil? Bunun nedeni en son bahsedilenin ilk kabul edilmesidir. B�ylece �ablonlar genelden �zele s�ralanm�� olurlar.

XML::XSLT in XSLT sayfas�ndan kaynaklanan bir �ok bosluk bast���n� not edin isterseniz. Bu s�r�mde bu sorunu ��zecek bir yolun bulundugunu da sanm�yorum. Fakat ��kt�m�z XHTML i�inde oldu�undan beri bunu fazla dert etmemiz gerekmiyor. Bir sonraki �rne�in i�levi ayn� fakat XHTML i�erdiginden bir g�rsel y�re inceleyicisi ile g�r�nt�leme �ans�m�z var.(simple.xsl):

<?xml version="1.0"?>
 <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
  <xsl:template match="*">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="text()"/>

  <xsl:template match="Item">
    <b><xsl:value-of select="./name"/></b>: <i><xsl:value-of select="./val-string"/></i><br />
  </xsl:template>

  <xsl:template match="/">
    <html>
      <head>
        <title>Summary Gnumeric File</title>
      </head>
      <body bgcolor="white">
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

�imdi art�k fazladan root(/) eleman� i�in bir �ablonumuz var. Bu, XHTML kodunu ��kt�n�n her tarafina koymam�z� m�mk�n k�lar.�lk �rnekte ba�l�kta koydu�umuz �rnek �imdi body' nin i�inde. Neden? XML::XSLT i�lemeye baslad��� zaman ilk �nce root ile e�le�en �ablonu arar. B�ylece body elementi a��l�ncaya kadar XHTML kodunu basar. Ondan sonra da �ablonlar� b�t�n yavru elementlere uygular. T�m bunlar tamamland���nda root �ablonuyla devam eder ve body, html etiketlerini kapat�r.

Ayr�ca Item �ablonun i�inde baz� XHTML kodlar� var. Bir kenara not edin: XSLT komutlar�n� output data ile beraber kullanabiliriz. XSLT i�lemcisi xsl isim bo�lu�una sahip her elementi al�r.

Bu andan sonra sadece yeni veya de�istirilmi� �rnekleri verece�iz. B�t�n stil sayfalar� link edilmi�tir. �rne�imizi sonland�rmak i�in bir ba�l�k ekleyece�iz ve ba�vuru-�ablon komutundaki ikinci durumu g�zleyece�iz (finalsimple.xsl):

   <xsl:template match="Summary">
    <h2>Summary</h2>
    <ul>
      <xsl:apply-templates/>
    </ul>
  </xsl:template>
 

for-each komutu

xsl:for komutu �zellikle xsl:sort komutuyla olan kombinasyonunda XML dok�man�na baz� ek �zellikler katar. Fakat bu komut hen�z XML::XSLT i�inde uygulanabilir de�ildir.

Gnumeric Workbook i�indeki safalar hakk�nda bilgi eklemek i�in xsl:for-each yap�s�n� kullanaca��z (foreach.xsl):

  <xsl:template match="Sheets">
    <xsl:for-each select="Sheet">
      <h2><xsl:value-of select="Name"/></h2>
      <ul>
        Rows: <xsl:value-of select="MaxRow"/><br />
        Cols: <xsl:value-of select="MaxCol"/><br />
      </ul>
    </xsl:for-each>
  </xsl:template>

Ne yaz�k ki XML dok�man� sadece bir �al��ma sayfas� kullan�r. XML d�k�man�n�n daha fazla �al��ma sayfas� kullanmas�n� isterseniz Gnumeric dosyay� kullanabilirsiniz.

Daha �nce de belirtildi�i gibi XML::XSLT ile en az�ndan �imdilik, ��eleri s�ralayamay�z. Bu duruma yaz�k, ��nk� Gnumeric dosya i�indeki XML verisi s�ral� de�ildir. E�er bu s�ralamay� yapabilseydik, �al��ma dosyas�n�n i�eri�ini vererek XHTML tablosu olu�turabilirdik. Fakat bu �imdilik m�mk�n de�il. Bununla beraber, b�t�n bilgileri bir kolon veya s�ran�n i�inde listeleyebiliriz. Bu bir sonraki �rnekte a��klanm��t�r.  

if komutu

B�t�n veriyi ���nc� kolonda listelemek i�in (Hollanda'daki zengin bir ��rencinin sat�� miktar�n� tutan), xsl:if komut yap�s� olu�turabiliriz. (if.xsl):

  <xsl:template match="Sheets">
    <xsl:for-each select="Sheet">
      <h2><xsl:value-of select="Name"/></h2>
      <ul>
        Rows: <xsl:value-of select="MaxRow"/><br />
        Cols: <xsl:value-of select="MaxCol"/><br />
        <xsl:apply-templates select="Cells"/><br />
      </ul>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="Cells">
    Content of Col 3:
    <xsl:for-each select="Cell">
      <xsl:if test="@Col='3'">
        <xsl:value-of select="Content"/><xsl:text>, </xsl:text>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>

sayfa �ablonu kullan�lamad��� durumlarda, �ablonun yavru h�cre elementlerine uygulanmas�n� sa�lamal�y�z. Se�me ba�vuru y�ntemini xsl:apply-templates komutuyla kullanarak �ablonu sadece h�cre elemanlar�na uygulanmas�na zorlayabiliriz.

H�cre �ablonu b�t�n yavru h�vre elemanlar� �zerinde d�nd�r�l�r(bunu XML kaynak dosyas� ile tekrar kontrol ediniz)fakat e�er atanan Col de�eri "3" ise, sadece de�eri ekrana basar.

�imdi �ablonlar daha karma��kla�acak fakat aktif eleman�n �nemi daha fazlala�t�. Belge i�inde bir odak yok, fakat bir �ablon i�inde odak uygulanmas� gerekir. �rne�in bir Cell �ablonu uygulan�rken, i�lemci bu eleman �rne�i �zerine odaklan�r. B�ylece bir Cells eleman� olu�mu� oldu. Herhangi bir veriye ula�mak istenildi�i zaman select="." komutuna ba�vurulur. Bu i�lem Cells eleman�na i�aret eden Cells �ablonu i�inde yap�l�r. select="Cell" ifadesi xsl:for komutu i�inde b�t�n Cell elemanlar�n� se�mek anlam�na gelir. Fakat �ncelikle loop i�inde odak Cell elemanlar�ndan herhangi birinin �zerinde olmal�d�r. Fakat test="@Col" ifadesi Cell �e�mek i�in de�il Cellin atand��� yeri i�aret eder. Cells'in hi� bir �zelli�e sahip olmad�klar� durum d���nda loop i�inden bir tanesi select="../@name" ifadesi ile Cells eleman� �zelliklerine i�aret eder.

xsl:text komutu b�t�n yaz�n�n yans�t�ld���ndan bizi emin k�lar. Normal olarak, "," dizisi i�indeki bo�luk whitespace olarak kabul edilir. xsl:text komutunu kullanarak b�t�n tekstin yans�t�ld���ndan emin olabiliriz.  

Sonu�

Elbette XSLT ve XML::XSLT modul hakk�ndaki her �ey bu kadar de�il. Bu k�sa makale sadede modul i�in bir giri� say�l�r. B�y�k olas�l�kla, burdakiler kafan�zda daha fazla soru ve cevap b�rakm��t�r ve bu sevinilecek bir durum. Soru ve �nerilerinizi talkback sayfas�na ve XML::XSLT sanal y�resindeki e-posta listesine g�nderiniz.  

Kaynak�a

 

L�gat�e

CDATA
CDATA karakter veridir ve "]]>" i�ermeyen b�t�n karakterlerin dizisini olu�turabilir. Bak�n�z XML Recommendation.

DOM
Document Object Model. D�k�manlara ula�mak i�in bir aray�z. �rne�in XML d�k�man�na. Bak�n�z DOM web site.

Gnumeric
Gnome i�in stilsayfas� haz�rlama aray�z�  

Bu makale �zerine

Her makalenin kendisine ait tart��ma sayfas� mevcut.Bu sayfada �nerilerinizi belirtebilir veya di�er okuyucular�n �nerilerini okuyabilirsiniz.
 talkback page 

�lgili sanal y�reler LinuxFocus Editor tak�m� taraf�ndan haz�rlanm��t�r
© Egon Willighagen
LinuxFocus.org 2000

�stek ve �nerilerinizi bildirmek i�in buraya t�klay�n�z

2000-08-02, generated by lfparser version 1.7