[LinuxFocus-icon]
<--  | Ana Sayfa  | Erişimdüzeni  | İçindekiler  | Arama

Duyumlar | Belgelikler | Bağlantılar | LF Nedir
Bu makalenin farklı dillerde bulunduğu adresler: English  Castellano  Deutsch  Francais  Italiano  Nederlands  Portugues  Russian  Turkce  

[Photo of the Author]
Egon Willighagen
<egonw/at/linuxfocus.org>

Yazar hakkında:

Yüksek lisans diplomasını bu sene alacak ve kemometrikler üzerine Phd 'ye başlayacak. Basketboldan çok hoşlanır tıpkı Linuxfocus ve genel olarak Linux'dan hoşlandığı gibi.

Türkçe'ye çeviri:
Ceyhun ELMAS <ceyhun.elmas/at/linuxfocus.org>

İçerik:


 

LinuxFocus.org'yi oluşturmak için XML ve XSLT kullanmak (/Hollanda)

[Illustration]

Özet:

Bu yazı Temmuz'da Bordo'da yapılan Libre Software Meeting'de verilen bir sunumu içeriyor. Linuxfocus.org'un (/Hollanda) XML veritabanı ile otomatik olarak oluşturulmasını açıklıyor.

_________________ _________________ _________________

 

Giriş

Sistemde LinuxFocus projesinde oldukça yüklü kaynak dosyaları ve çeviri çalışmalarından oluşan, arasında resdb.txt, issuedb.txt and maindb.txt dosyalarının da olduğu pek çok ASCII dosyası bulunuyor. Dosyanın biçimi sabit ve bu genel olarak sanaldoku yörelerinde kullanılan türden. Bununla birlikte, doğal olarak yazıların üzerindeki tüm bilgilerin izlenmesi, farklı verilerin ayırımı epeyce zordur.

Yeni veritabanına başladığımda sanaldoku yöresinin otomatik değişimi LinuxFocus projesinde çok kullanılmadı. Hollanda takımının bir editörü olarak , sanaldoku yöresinde içeriklerin otomatik olarak yapılması konusunda çok hevesliydim. Çeşitli HTML dosyalarını düzenlemek her yeni yazıda çok fazla zaman alıyordu ve pek çok kırık bağlantı bulunuyordu. Bu nedenle bilgilerin kolaylıkla eklenebileceği ve sanaldoku yöresi için içerik sayfalarını otomatik olarak oluşturabileceğim yeni bir sistem istedim. Bu konuda çalışmaya 2000 yazında başladım.

XML seçimi biraz keyfi oldu.Önerilen gerçek bir veritabanı oluşturmaktı, ancak benim XML konusunda deneyimim vardı ve metin tabanlı bir sistem tercih ediliyordu. Bu daha sonra kullanışlı yeni proje sayılarına dönecekti, çünkü veritabanı bir çeşit ID kullanabiliyordu. Tüm yeniden sayılandırma işlemini Guido Socher çok büyük bir emek harcayarak tamamladı (teşekkürlerimle).

Document Type Definition (DTD) zaten geliştiriliyordu ve epeyce içerik veritabanında test aşamasındaydı. Yeni düzenli numaralama ardından veri tabanı içerikleri dolduruldu. 20 yazı eklendikten sonra, bu tekrar büyüyen proje düzgün oldu. Eski dosyalar için betik yazılması olanaklıydı ancak tüm bilgiler için değil, yeni veritabanı buna uygun olabilmeliydi ce açıklandığı gibi bilgiler eski dosyaların üzerine dağıtılmaya uygundu. Neyse ki, Floris Lambrechts çözümü buldu ve içeriğin çoğunu veritabanına eklediği için ona ne kadar teşekkür etsem azdı. Bu yardım olmaksızın bu sistem bu gün olmazdı.

Yeni biçimle ilerlemek yeni bilgiler için de bir takım olanaklar getirdi. Ve geçmiş bir kaç yılın üzerine yeni tipte veriler veritabanına eklenmiş oldu. Yazarların, çevirmenlerin, editörlerin ve LF ile ilgili diğer insanların çalıştığı önceki veriler ve dosya konumları. Sonraki düzenlemeler nedeniyle LF'nin başlangıcından bu yana çeşitli dosya isimleri tasarlandı. Yeniden numaralandırma anında bu iki tasarıma indi. Bazı dosyalar sunucu üzerindeydi ve .shtml uzantısına sahipti , eski dosyalar .html uzantısı kullanıyordu. <file> tagı bazı gbvenimsenmiş değerler üzerine kullanılabildi. (Varolan benimsenmiş kullanım biçimi : "makale" + makale numarası " + ".shtml". Seçimlik olarak bu dosya henuz sonuç dosyasına dönüşmemiş makaleler için ".meta" sozcüğünü de içeriyordu.).

Artık veritabanı en alt düzeydeki karmaşıklığa erişti.Son olarak sırayı yazdığım başarım ölçüm yazılımına getirmiştim. . XSLT biçimtabakaları (stylesheets) zaten kullanılan ilk olmayan uyarlamaydı. currently used were not the first implementation. Perl tabanlı koddan önce geliyordu, ancak veritabanının büyümesiyle , başarım önem kazandı ve ilk prototip basitti ve yeterli değildi. Fakat araçları açıklamaya geçmeden önce, ilk olarak veritabanı biçimini açıklayacağım.

 

Doküman Tipi Tanımlama

XML,ilk olarak markup dilleri için özel bir sözdizim biçimidir. XML markup'ın nasıl görünmesi gerektiğini tanımlar. Ardışık karakter dizgilerinin sözdizim açıklamaları XML dokümanında "iyi biçim" sağlar. Bu dokümanın bir kök elemanı olduğunu ve başlangıç tagını içerdiğini,içerik (metin,toy elementleri,ya da her ikisini ) ve tagın sonunu bildirir. Bu taglar bir "<" karakter içerir, bir isim ve ismin sonunda bir ">" karakter takip eder. Son tag yalnızca ismin önünde bir "/" içermek zorundadır. Boş taglar, HTML'nin <br>, isimden sonra bir "/" alır. Başlangıç tagı nitelikler içerebilir, ve üstelik özel sözdizimi içerebilir. XML tagları bunlar gibi görünür:

<greeting>Hello, world!</greeting>
ya da boş tag için
<br/>

Sösdiziminin yanında, anlambilimler de içerir. Bu belirli elementlerin herbiriyle nasıl ilişki kurduğunu açıklar. HTML'in anlambilimleri <body> tagının <html> elementinde içerilmesi gerektiğini ve başka bir yol olmadığını açıklar. Anlambilimler aynı zamanda <img> elementinin boş, bir <br> elementi gibi olduğunu açıklar. Eğer bu anlambilimler biçimsel bir notasyon veriyorsa programla yerleşimlenebilir ve bunları kullanan doküman onaylardı. Bu biçimsel notasyonlardan biri Doküman Tipi Tanımlaması (Document type Definition) olarak adlandırılır ya da kısaca DTT (DTD)olarak. Eğer doküman işlem onayını geçerse bu geçerli (valid) doküman olarak adlanır. XML ile dikkatli olmalısınız çünkü onaylama çok katıdır.

Şimdi DTD'nin ne olduğunu biliyoruz, haydi LinuxFocus XML Veritabanı DTD'ye bakalım. Özelliklerin çoğu için örnek vereceğiz. Bu örneklere bakarken LF'nin XML veritabanının bilgiyi nasıl içerdiğini göreceksiniz.

 

<veritabanı>

LF XML veritabanında kök element ya da bu tanımlamaların ya da yerleşimlerin birisi <veritabanı> elementidir.

<!ELEMENT database    (themes?, persons?, issues?, articles?)>
    

İlk olarak, "?" elementinin toy element olduğuna dikkat edin , bu boş a da bir kez oluşabilir. Böylece, veritabanı LF'nin temalarına, kişilere, sayı ve yazılarına ilişkin bilgileri içerebilir. Bu çok daha açık duruma geldikten sonra beri çok daha ilginç örneklere ilerleyeceğim.

 

<temalar>

Temalar <themes> elementi olarak yer alan, <veritabanın> toy elementidir. Her tema bir tek ID'ye, ünvana, ve seçimsel olarak özete ve resime sahiptir.

<!ELEMENT themes      (theme+)>
  <!ELEMENT theme       (title*, desc?, img?)>
    <!ELEMENT title       (#PCDATA)>
    <!ELEMENT desc       (#PCDATA)>
    <!ELEMENT img         (EMPTY)>
    

Bu elementlerin bazıları nitelik içermelidir. Bunlar DTD içinde de verilir. Herhangi bir metin içerik xml:lang niteliğiyle bulunur. Bu niteliğin değeri ülke kodlarına göre uyumlu bir ISO 3166 standard alır. Örneğin "en", "fr" ve "nl". Her iki id ve xml:lang niteliği doğal XML içinde özelleştirilmiştir ve XML sözdiziminin bir parçasıdır.

<!ATTLIST theme       id            ID            #REQUIRED>
<!ATTLIST title       xml:lang      NMTOKEN       #REQUIRED>
<!ATTLIST desc        xml:lang      NMTOKEN       #REQUIRED>
<!ATTLIST img         src           CDATA         #REQUIRED>
    

Örnek bir veritabanı bunun gibi görünür:

<database>
  <themes>
    <theme id="hw">
      <title xml:lang="en">Hardware</title>
      <img src="Hardware.jpg"/>
    <theme>
  <themes>
</database>
    
 

<sayılar>

Sayılar <issues> elementindedir. Her sayı teması gibi belirli bir ID'ye sahiptir.

<!ELEMENT issues      (issue+)>
  <!ELEMENT issue       (title+, published?, file*)>
    <!ELEMENT title       (#PCDATA)>
    <!ELEMENT published   (EMPTY)>
    <!ELEMENT file        (#PCDATA)>
    

<published> elemnti yayınlanmış sayıları gösterir. Sonraki sayı ve SomeLanguage2Eng sayıları bu elemente sahip değildir. <title> elementi yine @xml:lang niteliğine sahiptir. <file> elementi sayının yer aldığı dizini belitir. Bu index.html'ye işaret etmemelidir, çünkü belirli dosya konumları gösterir.

Örneğin (@code niteliğinin sıralama için kullanıldığına dikkat edin):

    <issue id="ToBeWritten" code="999996">
      <title xml:lang="en">Not yet written articles</title>
    </issue>
    <issue id="September2001" code="200109">
      <title xml:lang="en">September2001</title>
    </issue>
 

<kişiler>

Yazar ve çevirmenler hakkındaki bilgiler <person> elementinde yer alır. Her kişi belirli bir ID'ye sahip olmak zorundadır.

  <!ELEMENT persons     (person+)>
    <!ELEMENT person      ((name|email)*,(homepage|nickname|desc|team)*)>
      <!ELEMENT email       (#PCDATA)>
      <!ELEMENT name        (#PCDATA)>
      <!ELEMENT homepage    (#PCDATA)>
      <!ELEMENT nickname    (#PCDATA)>
      <!ELEMENT desc        (#PCDATA|%html-els;)*>
      <!ELEMENT team        EMPTY>
    

Her kişi aşağıdaki bilgilere sahip olabilir : adres (ya da daha fazlası), evsayfası ya da sayfaları ve takma adları. Eğer kişi aynı zamanda LF çeviri takımının bir parçası ise If the person is also <team> elementi eklenir. Örnek olarak, Floris Hollanda takımının bir üyesi, takip eden satır <person> elementine eklenir: <team xml:lang="nl"/>. Sonuç olarak her kişi bir tanımlamaya sahiptir ve bazı fazladan sanaldoku yöresi bağlantıları içerebilir.

Örneğin:

    <person id="nl-ew">
      <name>Egon Willighagen</name>
      <email>egonw@linuxfocus.org</email>
      <team xml:lang="nl"/>
    </person>
 

<makaleler>

Makaleler elbette veritabanının en ilginç parçasıdır.

  <!ELEMENT articles    (article+)>
    <!ELEMENT article     (title+,
        (file|personref|abstract|issueref|themeref|
         nometa|nohtml|translation|proofread)*)>
      <!ELEMENT abstract    (#PCDATA)>
      <!ELEMENT nohtml      EMPTY>
      <!ELEMENT nometa      EMPTY>
      <!ELEMENT translation (personref*, (reserved|finished|proofread)*)>
        <!ELEMENT reserved    (#PCDATA)>
        <!ELEMENT finished    (#PCDATA)>
        <!ELEMENT proofread   (personref*, (reserved|finished)*)>
<!ATTLIST article     id            ID            #REQUIRED
                      xml:lang      NMTOKEN       #IMPLIED
                      type          (article|coverpage)
                                                  "article"
                      next          IDREF         #IMPLIED
                      prev          IDREF         #IMPLIED>
<!ATTLIST file        xml:lang      NMTOKEN       #REQUIRED
                      type          (target|meta) "target">
<!ATTLIST translation from          NMTOKEN       #REQUIRED
                      to            NMTOKEN       #REQUIRED>

    

Her makale her dil için en az bir başlığa sahip olmalıdır. <file> elementi makalenin dosya konumunu kullanabilir, META ve HTML biçiminin her ikisi için (aşağıdaki örneğe bakın) META ya da HTML sürümünün sağlanmadığı durumda, seçimli <nohtml/> ve <nometa/> elementi kullanılabilir. Her makale bir özete sahiptir.Özet, veritabanında içerik sanaldoku yörelerinde kullanılır.

The <article> elementi beş niteliğe sahiptir:@ID gereklidir, seçimlik nitelik xml:lang dili ve aslının kimin tarafından yazıldığını gösterir, @type niteliği kapak sayfaları için kullanılır. Sonuç olarak diğer 2 seçimlik nitelik, @next ve @prev, birbirine bağlı seri makalelerde kullanırlar.

Makale sayıya ve temaya <issueref> ve <themeref> elementleriyle eklenir, her ikisi de @href niteliğine sahiptir.Bu nitelik için değer belirli bir ID olmalıdır. Bu ID bağlı olunan sayının ya da temanındır.

Örnek olarak:

    <article id="article206" xml:lang="en">
      <title xml:lang="en">Using XML and XSLT to build
        LinuxFocus.org(/Nederlands)</title>
      <personref href="nl-ew"/>
      <issueref href="ToBeWritten"/>
      <themeref href="appl"/>
      <abstract xml:lang="en">
This article shows you how parts of the Dutch web site of LinuxFocus is
generated with XSLT tools from the XML database. It compares this with
the (very) much slower DOM tools in Perl.
      </abstract>
    </article>

Yerelleştirilmiş <article> elementi aşağıdaki gibi görünür:

    <article id="52">
      <title xml:lang="nl">Enlightenment</title>
      <file xml:lang="nl">Nederlands/July1998/article52.html</file>
      <translation from="en" to="nl">
        <personref href="nl-tu"/>
        <reserved>2000-09-06</reserved>
        <finished>2000-10-04</finished>
        <proofread>
          <personref href="nl-fl"/>
          <reserved>2000-10-04</reserved>
          <finished>2000-10-04</finished>
        </proofread>
      </translation>
      <abstract xml:lang="nl">
Enlightenment is een Linux window-manager met uitgebreide mogelijkheden.
Dit artikel bespreekt ze, samen met de installatie en de instelling van E.
Dit alles is niet voor beginners daar E op het moment nog in beta-stadium
verkeert.
      </abstract>
    </article>

Bu çevirinin mutlak verilerde çeviri için ayrıldığına dikkat edin, yapılmış ancak inceleniyor. Tüm kısımlarda kimin çalıştığını <personref> bağlantı elementi belirler.

Tüm elementler için en iyi örnek veritabanının kendisidir:

 

Otosihir ile sanaldoku sayfaları oluşturmak

Bu yeni biçime başlamamızın nedenlerinden birisi de sanaldoku sayfalarını otomatik olarak oluşturmaktı.Şimdi (?) veritabanı biçimini anladık ve haydi sanaldoku sayfaları nasıl oluşturuluyor ona bakalım.

İlk olarak biraz hikaye.İlk uyarlamada veritabanı arayüzü için Perl modülleri kullanıldı. Arayüz çok açık olsa bile uyarlama çok yavaşdı.Bilgi XML içinde Document Object Model (DOM) denilen bir depoda tutuluyordu. Uyarlamaların çoğu DOM içindi ancak oldukça yavaşdı hatta bir başka yol olan XML'in Simple Application arayüzü (SAX)'dan bile daha yavaşdı.

Ancak eğer işlem sanaldoku sayfası oluşturmaksa bunu için üç iyi yol görünüyordu: XSLT.Bu XML tabanlı bir geçiş dilidir. Pek çok XSLT işlemcesi zaten var ve programlama dillerinin çoğunu destekliyor. Bir süre önce bir LF yazısı XML::XSLT, bir Perl XSLT uyarlaması anlatılıyordu. Bu yazının yayınlanmasından sonra uyralamalrın çoğu ortaya çıktı, ve burada bir kaç önerim bulunuyor :

Örnek olarak Sablotron'nun kullanılacağı yazıda hatırlatılıyor.

XSLT işlemcisi giriş için 2 dosya alır. Birisi dönüşecek olan XML kaynağı. Diğeri dönüşümde tanımlanan XSLT biçimtabakaları. LF'nin sanaldoku sayfalarını oluşturan XSLT biçimtabakaları aşağıdaki gibidir :

mainindex.html'yi oluşturmak için , örneğin Hollanda takımı şunu koşturur:

sabcmd stylesheets/mainindex.xslt db/lfdb.nl.xml > ../mainindex.html

Biçimtabakaları şimdi İngilizce kök veritabanı ve yalnızca yerel veritabanı XML girişlerine gereksnimi duyuyor.

sabcmd stylesheets/theme.xslt db/lfdb.nl.xml '$theme=appl' > ../Themes/appl.html

Hollanda index.html sayfası zaten veritabanı tarafından oluşturuldu, ,ancak kullanım biraz daha karışık.index.html Guido Socher'in lfpagecomposer'ı ve bazı giriş dosyalarından oluşur. Ve bu dosyalar *.pre dosyaları ile oluşturulur. Bu dosyalara örnek olarak :

  <H2>Vorige nummers</H2>

<p>Dit zijn de uitgaven van LinuxFocus in het Nederlands:
<ul>
<!-- macro xslt previssues -->
</ul>

apply_stylesheets.pl programının çağrılmasıyla işlem tamamlanıyor . <!-- macro xslt [stylesheet] --> komut ve yerleşimler bu komutla yapılıyor. .xslt uzantısının atlandığına dikkat edin. Makefile 'ımızın içeriği:

%.shtml: %.pre
        @echo "Making $*..."
        @../../xml/bin/apply_stylesheets.pl $*.pre

Sonuç olarak *.shtml dosyaları lfpagecomposer betiği tarafından kullanılır. Biçimtabloları index.html'yi oluşturmak için issuetoc.xslt, previssues.xslt ve recently_translated.xslt dosyalarını kullanır.  

Yerelleştirme

Bu sistemi diğer dillerde kullanmak için aşağıdakilere gereksinim duyulur:

  1. yerel XML veritabanı (lfdb.nl.xml gibi)
  2. yerel biçimtabloları

İkinci basamak biraz yersizdir. Teoride yerelleştirme için yalnız metin içerik gereklidir ancak biçimtabloları yerel özelliklere henüz sahip değil.Bu mümkün ancak sizi uyarlama işlemlerinde görmek iserim.

Size DTD bilen XML editörü öneririm. Emacs 'de yapabilirsiniz, örneğin psgml major mod kullanın. Bu size dokümaının geçerliliği için foksiyonlar vercektir. (nsgmls ile). Bu sizin çok fazla hata yapmamanıza yardım eder. Emacs'de üstelik fareyi sağ klikleyerek XML'de odaklanmak istediğiniz element ve nitelikleri yerleştirebilirsiniz.

Holanda yerelinde bir diğer büyük yardım, zorlandığınızda dosyaya danışabilmenizdir. Eğer bu size yardım etmezse herzaman bana e-ileti gönderebilirsiniz.

Biçimtablolarını yerelleştirmenin bir kaç püf noktası vardır. Dokunmayın (ne yaptığınızı bilmedikçe). İlerde yerelleştirme için XSLT komutlarıyla uğraşmadan yalnızca çeviri kısımlarını düzenleyebileceğiniz bir yapı planlıyorum fakat henüz tamamlanmadı.  

Gelecek planları

Tamam , bu sizin başlamanıza yardımcı olmalı.Bazı şeylerin çoğunu Hollanda dosyalarında kopyala/yapıştır yapabilirsiniz. Tüm sistem dosyaları FDL ve GPL'dir. Sonraki yıl bu sistemle ilgili planlarım:

 

Bu yazı için görüş bildiriminde bulunabilirsiniz

Her yazı kendi görüş bildirim sayfasına sahiptir. Bu sayfaya yorumlarınızı yazabilir ve diğer okuyucuların yorumlarına bakabilirsiniz.
 talkback page 

<--, Bu sayının ana sayfasına gider

Görselyöre sayfalarının bakımı, LinuxFocus Editörleri tarafından yapılmaktadır
© Egon Willighagen, FDL
LinuxFocus.org
Çeviri bilgisi:
en --> -- : Egon Willighagen <egonw/at/linuxfocus.org>
en --> tr: Ceyhun ELMAS <ceyhun.elmas/at/linuxfocus.org>

2004-07-14, generated by lfparser version 2.43