|
|
||||||||||||
|
|
XML Belgelerini XSL ile Biçimlendirme
Genişletilebilir Sayfa Biçimlendirme Dili olarak adlandırabileceğimiz XSL, temelinde üç ayrı dili barındırır: XSLT, XPath ve XSL Formatting Objects. HTML, ilk çıkarıldığındaki görevlerinden fazlasını yapabilse de
artık bizim yapmak istediklerimizi tam anlamıyla karşılayamıyor. HTML'nin
yapamadıklarını yapması öngörülen yeni nesil web dilinin adı XHTML. XSL VE XHTML XML belgeleri sadece veri içerir. Verinin biçimlendirilmesi işlemi XML'in amacı ve görevi dışındadır. Biçimlendirme görevini CSS, XSL gibi diller üstlenmektedir. CSS, HTML biçimlendirmelerinin zenginleştirilmesinde yeteneklidir ve XML belgelerinin temel biçimlendirilmesinde kullanılabilir. Fakat XML belgeleri ile çalışırken CSS, yeterli olmayıp yerine XSL tercih edilmektedir. XSL, XML'i her türlü biçime sokabilir. XML verisi içinde süzme, arama, sıralama gibi işlemleri yapabilir, HTML biçiminde sayfalar üretebilir. XSL bununla yetinmeyip HTML biçiminde olmayan herhangi bir belge de üretebilir. XML'in web'de yaygın ve kolay kullanılabilir bir dil olmasının ön koşullarından biri de güçlü bir biçimlendirme dilinin var olmasıdır. XSL bu koşulu yerine getirebilecek güçlü bir dildir. Son zamanlarda sadece Web'e ait ve HTML'nin yerini alabilecek XHTML'den bahsedilmektedir. XHTML, HTML'nin yeni sürümü olup XML kurallarına sadık bir betimleme dilidir. 1999'da geliştirilmeye başlanmıştır. Şu an 1.1 sürümü geçerli olup 2.0 sürümü geliştirilme aşamasındadır. Özellikle yeni dillerin XML kurallarına tam olarak uyması öngörülmektedir. XSL de XHTML gibi XML'in katı kurallarına sadıktır. Bu ne anlama geliyor? Bu iki dilin temelinde aslında XML vardır. Serbest etiket tanımlaması yapılabilen XML'den sınırsız sayıda yeni diller türetilebilmektedir. XML ile uyumlu olması amaçlanan bir dil için yeni bir sözlük tanımlaması yapmak tek başına yeterlidir. XSL ve XHTML de kendi sözlüklerine sahiptir. Bu açıdan XHTML'nin HTML'den farkı biraz daha gelişmiş olması dışında XML'in yazım kurallarına harfiyen uymasıdır. Kısaca XHTML, HTML'nin katı XML kurallarına uygun hale getirilmiş ve biraz daha geliştirilmiş halidir. XSL'E GİRİŞ XSL belgesi tek başına bir dosyadır ve XML belgesi biçimlendirirken buna başvuru yapılır. Web gözatıcıları XML'i biçimlendirirken belgenin üst tarafında işlem yönergeleri bölümünde gerekli komutu ararlar. XSL ile biçimlendirme yapmak için XML belgesinin üst tarafında XML-STYLESHEET ile başlayan bir yönerge olmalıdır. XSL ile biçimlendirilmesi öngörülen bir XML belgesinin içeriği aşağıdakine benzerdir. <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="dosya.xsl"?> <KÖK ELEMENT> ... ... </KÖK ELEMENT> Biçimlendirme yönergesindeki dosya.xsl dosyası burada XML belgesi ile aynı dizinde olmalıdır. Buraya aynı etki alanındaki (domain) bir XSL dosyasının yolu da yazılabilir. Bu yönerge web gözatıcıları için geçerlidir ve bir XML belgesine bu şekilde XSL belgesi bağlanabilir. MSXML kütüphanesinde gelen DOMDocument nesnesi ile de bir XML belgesini herhangi bir XSL şablonu ile biçimlendirmek mümkündür. Dim xml As New MSXML2.DOMDocument Dim xsl As New MSXML2.DOMDocument xml.async = False xml.Load "dosya1.xml" xsl.async = False xsl.Load "dosya2.xsl" MsgBox xml.transformNode(xsl) DOMDocument nesnesini kullanırken XML ve XSL belgelerinin alındığı kaynakların uaklığı önemli değildir. Biri sabit disk üzerinde olabilirken, diğeri uzak bir web alanından çağrılabilir. DOMDocument nesnesinin TransformNode yöntemi XML belgesini XSL belgesi kullanarak dönüştürür. Burada her iki belge türünün de MSXML.DOMDocument olduğuna dikkat edin. XSL belgeleri zaten XML kurallarına uyduğu için bunu XML imiş gibi yüklemek sakıncalı değil, bilakis kolaylaştırıcıdır. Web gözatıcıları için XSL'in HTML'ye uygun çıktı üretmesi önemlidir. Zira sonuç belgesi gözatıcı tarafından görüntülenecektir. Fakat DOMDocument kullanılırken böyle bir zorunluluk yoktur. XSL her türlü serbest dönüşüm gerçekleştirilebilecek şekilde tasarlanmıştır. Yukarıdaki kodda Async özelliğinin Load eyleminde işlem bitmeden alt satıra geçilmemesini sağladığını hatırlayın. XSL BELGELERİNİ TANIMAK XSL belgeleri XML verisini işlemek için sıralı yönergeler kullanır. Bu yönergelerde belgenin herhangi bir noktasında bulunabilen küçük şablonlar XML öğelerine uygulanır. XML belgesinden alınacak öğeler ve bunların hangi sırada yazılacağı belirtilir. Bir XSL dosyası başında ve sonunda xsl-stylesheet etiketi bulundurur. Doğrusu dosyanın XSL dosyası olduğunu bu etiketten başkası belirlemez. Bir gelenek olarak dosya uzantısı da bu adla aynıdır. XSL belgeleri düzenlenirken XML belgelerinin ağaç yapısına ve öğe adlarına dikkat edilir. Bu yapıya ve adlara göre XSL belgesi oluşturulur. XML belgesinin yapısında değişiklik olduğunda XSL belgesinde de değişiklik yapmak gerekebilir. Aksi halde biçimlendirme işlemi doğru yapılmayabilir. Bir XSL dosyasının içeriğinden önce uye.xml dosyasının içeriğini inceleyin. <?xml version="1.0" encoding="ISO-8859-9"?> <?xml-stylesheet type="text/xsl" href="uye.xsl"?> <UYE> <AD>Ali</AD> <SOYAD>Kara</SOYAD> <SEHIR>Adana</SEHIR> <MESLEK>Öğretmen</MESLEK> <DOGUMTARIHI>1972-04-23</DOGUMTARIHI> <CINSIYET>Erkek</CINSIYET> </UYE> İkinci işlem yönergesi satırında web gözatıcıya bu belgenin açılırken uye.xsl dosyası ile biçimlendirme yapılması gerektiği bildirilmektedir. <?xml version="1.0" encoding="ISO-8859-9"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <B> Hoşgeldiniz <xsl:value-of select="UYE/AD"/> <xsl:value-of select="UYE/SOYAD"/> <BR/><BR/> </B> <U>Üyelik Bilgileriniz</U> <BR/> Şehir: <xsl:value-of select="UYE/SEHIR"/> <BR/> Meslek: <xsl:value-of select="UYE/MESLEK"/><BR/> Doğum Tarihi: <xsl:value-of select="UYE/DOGUMTARIHI"/><BR/> Cinsiyet: <xsl:value-of select="UYE/CINSIYET"/> <BR/> </xsl:template> </xsl:stylesheet> XSL belgesi XML yapısında olduğu için ilk satır XML'deki gibidir. Buradaki xsl:stylesheet belgenin kök öğresidir. Xmlns özniteliği belgenin sözlü alanını (namespace) işaret eder. Belge sözlükleri kimi yerlerde 'ad boşlukları' şeklinde adlandırılmaktadır. xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ifadesi sözlük alanının yazılı web adresi gibi olduğunu ve bu belgedeki xsl öğelerinin 'xsl' ile başlaması gerektiğini ifade ediyor. Bu deyim xmlns:abc=.. şeklinde başlatılmış olsaydı xsl: ile başlayan etiketler de abc: ile başlatılacaktı. Zaten xsl belgesindeki etiket adları aslında xsl:'den sonra gelen adlardır. Bu durumda belgenin kök öğesinin xsl:stylesheet değil, stylesheet olduğunu söylemek daha doğru olur. Sözlük alanları (namespace veyahut ad boşlukları) daha sonra ayrıntısıyla inceleyeceğimiz bir konudur. Hemen her XSL belgesinde template (xsl:template) adlı şablon öğeleri bulunur. Bu şablonlar match özniteliği ile XML belgesindeki bir öğeyi açarlar. Geri kalan iş value-of ile verileri yazdırmaktır. Template komutu Match özelliğini kullanarak XML belgesi içinden belli değerleri seçer. Bu seçim XML öğelerinin adı ya da onları belirten bir yol ile ve istenirse gelişmiş arama koşulları ile yapılabilir. Yukarıdaki örnekte Template'nin Match değerinin "/" olması tüm XML öğelerinin bu şablonla biçimlendirileceği anlamına gelir. Value-of komutu ise Select özelliğinde adı geçen XML öğesini yazdırmaktadır. <xsl:value-of select="UYE/AD"/> XSL içinde bilinen HTML etiketlerinin birçoğu kullanılabilmektedir. Uye.xsl dosyasında kullandığımız <BR/>, <B> ve <U> etiketleri size yabancı gelmeyecektir. Keza HTML'deki gibi boşlukta kalan metinler belgede yer alabilir ve bunlar çıktıya dahil edilir. HTML'dekine nazaran XSL kodlarında katı XML kurallarına uymak gerekir. HTML'de alışık olduğumuz, satır sonu işareti olan <BR> etiketi aslında sonlandırılabilen bir elementtir. Bu yüzden <BR></BR> ya da <BR/> ile ifade edilebilmektedir ve XSL'de bu şekilde kullanılır. Biçimlenmiş çıktıyı görmek XML dosyasını açmakla mümkündür. Web gözatıcıları bunu yaparken XSL dosyasını sadece arkaplanda kullanırlar ve açılan belge öncelikle XML dosyasıdır. Uye.xml dosyasını Internet Explorer'da açtığımızda resimdeki gibi görünür.
Görünüm / Kaynağı Göster (View / Source) komutu ile belgenin içeriğini görüntülemeyi deneyin. Sayfada biçimlendirilmiş bir belge görüntülenmesine rağmen kaynak bilgisi XML belgesinin kendisidir. Biçimlendirme sonucu oluşan çıktı ise doğrudan görüntülenmez. Bu, Microsoft'un XML belgelerini görüntüleme konusunda getirdiği bir yorumdur. Biçimlendirilmiş XML çıktısını görmek için Mayıs ayında CD'mizde yer verdiğimiz Chip IE Extensions programını kullanabilirsiniz. Internet Explorer'ın sağ tuş menüsüne yerleşen XSL Sonucu Göster komutu ile biçimlendirme sonucu görüntülenebilmektedir. Aşağıdaki metin bu komutla elde ettiğimiz çıktıyı gösteriyor. <?xml version="1.0" encoding="UTF-16"?><B> Hoşgeldiniz AliKara<BR /><BR /></B><U>Üyelik Bilgileriniz</U><BR /> Şehir: Adana<BR /> Meslek: Öğretmen<BR /> Doğum Tarihi: 1972-04-23<BR /> Cinsiyet: Erkek<BR /> Çıktıda ad ile soyad arasında boşluk olmadığına dikkat edin. XSL'de boşluk işareti xsl:text komutu ile aşağıdaki şekilde tanımlanıyor. <xsl:value-of select="UYE/AD"/> <xsl:text> </xsl:text> <xsl:value-of select="UYE/SOYAD"/>
Template komutu aslında Match özelliğinde belirtilen yola uyan bütün XML öğelerini açmaktadır. Fakat bu, içeride bir döngü oluştuğu anlamına gelmez. İçerideki komutlar için bir kayıt kümesi oluşturulmuştur sadece. Uzun bir listeyi görüntülemek için for-each komutu kullanılmaktadır. For-each, Template'nin Match ile aldığı tüm kayıtlar üzerinden sırasıyla geçer. </xsl:for-each> satırına kadar olan kısım her öğe için işlenir. Arada kalan bölgede value-of komutu ile değerler yazdırılabilir. Bununla birlikte for-each için kayıt numarası döndüren position() işlevi mevcuttur. Ekteki kitaplar.xml dosyası aşağıdaki XSL belgesi ile biçimlendirildiğinde sonuç alt resimdeki gibi olacaktır. <?xml version="1.0" encoding="ISO-8859-9"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <h1>Kitaplar</h1> <xsl:for-each select="KITAPLAR/KITAP"> <xsl:value-of select="position()"/>, <xsl:value-of select="KITAPADI"/>, <xsl:value-of select="YAZAR"/>, <xsl:value-of select="YAYINEVI"/>, <xsl:value-of select="CEVIREN"/><BR/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
For-each komutu kümeyi sıralayabilecek xsl:sort komutunu içerir. Xsl:sort komutu For-each içerisindeki kümeyi sıralar. Bunun için sıralama yapılacak alan adını ve sıralama yönünü Select ve Order öznitelikleriyle, for-each başlangıcının ardından belirtmek gerekir. <xsl:for-each select="KITAPLAR/KITAP"> <xsl:sort order="ascending" select="KITAPADI"/> .. .. </xsl:for-each> Order özelliği "ascending" (artan) ve "descending" (azalan) değerleriyle sıralamanın yönünü belirler. Sort satırındaki Select ise For-each satırında seçilen KITAPLAR/KITAP altındaki KITAPADI'na göre sıralama yapılacağını belirtir. Sıralama yaparken bazı durumlara dikkat etmek gereklidir. KOD alanı bu şekilde sıralandığında sırasıyla 1,10, 11, 12 şeklinde başlayıp devam eden numaralar listelenir. Bu durumda sıralamanın karakter bazında değil, sayısal değerlere bakılarak yapılması gerektiğini belirtmeliyiz. Sort komutunun data-type özelliği "number" olarak ayarlanmalıdır. <xsl:sort order="ascending" select="KOD" data-type="number" /> For-each içerisinde tahmin edebileceğiniz gibi birden çok alana göre sıralama yapılabiliyor. Bunun için xsl:sort komutlarını for-each'ten sonra alt alta yazmak yeterlidir. <xsl:for-each select="KITAPLAR/KITAP"> <xsl:sort order="descending" select="YAYINEVI"/> <xsl:sort order="ascending" select="KITAPADI"/> .. .. </xsl:for-each> XSL-XML DÜZENLEYİCİ XSL, diğerlerine nazaran öğrenilmesi zor bir dildir. Sıkça denemeler yapmak öğrenmeyi hızlandırabilir. XSL belgelerini deneyip test etmeyi kolaylaştırmak için ekte sunduğumuz CHIP XML-XSL Düzenleyici programı XSL ile çalışırken işinizi kolaylaştıracaktır. Girdiğiniz XML ve XSL bilgileri harmanlanıp altta çıktılar gösterilir. Siz bu programla denemeler yapıyorken biz gelecek ay için XSL yazısının devamını hazırlıyor olacağız.
DOSYALAR:
|