Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
[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