Bu makalenin farkl� dillerde bulundu�u adresler: English Castellano Deutsch Francais Russian Turkce |
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: |
�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.
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�.
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�, 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>
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.
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.
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.
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�
|
�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