Xml , farklı platformlar arasında kolayca bilgi taşınmasına izin veren, veri kümelerini kendi kurallarımızla oluşturmamızı sağlayan önemli standartlardan birisidir. Lakin zaman zaman Xml dökümanlarını okumak çok kolay olmamaktadır. En azından oluşturulan Xml dökümanlarında tutulan içeriği, son kullanıcıya farklı şekillerde göstermek ihtiyacını duyabiliriz. İşte bu noktada, var olan Xml verisinin farklı bir formata dönüştürülebiliyor olması gerekmektedir. XSLT standardı tam bu noktada devreye girmektedir. Xslt herhangibir Xml içeriğini farklı bir Xml, Html, Csv veya Text formatına dönüştürme işlemi ile ilgili materyalleri sağlayan bir işaretleme dilidir. Bu sayede verileri sakladığımız bir Xml içeriğini son kullanıcıya daha uygun formatlarda sunabilme imkanını kazanmış oluruz. Bu özellikle web tabanlı sistemlerde son derece önemlidir. Dönüştürme işlemi sırasında sıradan bir tarayıcı kullanılabileceği gibi, . Net Framework içerisinde yer alan tiplerdende faydalanılabilir. Yani Xslt ile çarpıştırılmış bir Xml içeriğine basit bir tarayıcı ile bakabilir yada bu çarpıştırma işlemini yönetimli kod üzerinden. Net Framework tiplerini kullanarak gerçekleştirebiliriz. Xslt kendi içerisinde XPath dilini kullanmaktadır. Bu sayede kaynak Xml dökümanı içerisinde eşleştirme yaparak, dönüştürme işlemini uygulayacağı parçaları kolayca bulabilir. Xslt sadece Xml içeriğini farklı formatta göstermekle kalmaz dönüşüm işlemi sırasında aşağıdaki tabloda belirtilen işlemlerinde yapılabilmesini sağlar. Xslt Dönüştürme Operasyonunda Yapılabilecek Bazı İşlemler Sıralama işlemleri uygulatabilmek . Filtreleme işlemleri. Koşullu ayrıştırmalar . Parametre kullanımı sayesinde farklı dönüştürme işlemlerinin sağlanabilmesi. Xslt dökümanı içerisinde harici kullanıcı tanımlı fonksiyonları çağırabilmek. Xslt dökümanı içerisinde script çalıştırabilmek. Xslt' nin yukarıda sayılanlar haricinde de sahip olduğu pek çok yetenek vardır elbette. Ancak bunlar makalemizin konusunu şu an için aşmaktadır. Biz bu makalemizde temel olarak Xslt' yi tanıyacak ve. Net Framework 2.0 içinde etkin bir şekilde nasıl kullanabileceğimizi görmeye çalışacağız. İlk olarak aşağıdaki örnek xml dökümanını ele alalım. Kod: <?xml version="1.0" encoding="utf-8" ?> <Muzikler> <Muzik ID="1"> <Soyleyen>Coldplay</Soyleyen> <AlbumAdi>X and Y</AlbumAdi> <CikisTarihi>2005</CikisTarihi> <Fiyat>28</Fiyat> <Tip>CD</Tip> </Muzik> <Muzik ID="2"> <Soyleyen>Depeche Mode</Soyleyen> <AlbumAdi>Playing The Angel</AlbumAdi> <CikisTarihi>2005</CikisTarihi> <Fiyat>25</Fiyat> <Tip>CD</Tip> </Muzik> . . . <Muzikler> MuzikDukkanim. xml isimli fiziki dosyada tutulan bu içerikte Muzikler isimli root node altında Muzik isimli child node' lar yer almaktadır. Muzik boğumu içerisinde ID isimli bir attribute ve Soyleyen, AlbumAdi, CikisTarihi, Fiyat, Tip isimli alt boğumlar yer almaktadır. Bu dökümanı herhangibir tarayıcı üzerinde açarsak aşağıdakine benzer bir ekran görüntüsü elde ederiz. Gördüğünüz gibi bu Xml içeriği her ne kadar bir geliştirici için anlamlıda olsa, son kullanıcı için aynı şeyi söylemek pek doğru olmayacaktır. Bu içeriği örneğin bir Html çıktısı haline getirebiliriz. Böylece son kullanıcı için daha okunabilir bir yapı sağlamış oluruz. Xslt kendi içerisinde Html takılarına izin verdiği için üretilecek çıktının görsel formatını istediğimiz gibi ayarlayabiliriz. Aşağıdaki örnek Xslt içeriği bu amaçla yazılmıştır. XstlForHtml. xsl dökümanı içeriği; Kod: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www. w3. org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h1>Müzik Dükkanım</h1> <table border="1" borderColor="Black" cellpadding="0" cellspacing="0"> <tr bgcolor="#FFCC66"> <th>ID</th> <th>Söyleyen</th> <th>Albüm Adı</th> <th>Çıkış Tarihi</th> <th>Satış Fiyatı</th> <th>Cd/Dvd/Kaset</th> </tr> <xsl:for-each select="Muzikler/Muzik"> <tr> <td> <xsl:value-of select="@ID"/> </td> <td> <font size="2" color="Blue"> <xsl:value-of select="Soyleyen"/> </font> </td> <td> <b> <xsl:value-of select="AlbumAdi"/> </b> </td> <td align="right"> <xsl:value-of select="CikisTarihi"/> </td> <td> <b> <xsl:value-of select="Fiyat 1.5"/> Ytl </b> </td> <td> <xsl:value-of select="Tip"/> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Bir Xslt içeriği ilk zamanlarda geliştiricilere korkutucu gelebilir. Ancak adım adım incelendiğinde son derece kolay ve anlaşılırdır. Xslt dökümanları mutlaka stylesheet elemanı ile başlar ve biterler. Bu elemanda Xslt dökümanının standardlarında yer alan isim alanı ve versiyon numarası gibi bilgiler yer alır. Dökümanımızın içeriğinde yer alan en önemli kısımlardan birisi <xsl:template match="/"> boğumudur. Xslt dökümanlarının, kaynak olarak gösterildiği xml dökümanı üzerinde dönüştürme işlemi yapabilmesi için burada bir şablon eşleştirilmesinde bulunması gerekir. Bu eşleştirme işleminde ilgili kümeyi seçebilmek için XPath ifadeleri kullanılır. Dikkat ederseniz template elemanında match değeri / olarak belirlenmiştir. Bu, Xslt' yi uygulanan Xml dökümanındaki tüm boğumların dönüştürme işleminde ele alınacağını belirtir. Dönüştürme işleminin hangi üyelere, nasıl uygulanacağı ve / şablonuna uyan parçaların çıktıda nasıl gözükeceğine dair gerekli format ayarları ise template elemanına ait boğum içerisinde yapılmaktadır. Xslt dökümanımızda yer alan bir diğer önemli eleman <xsl:for-each select="Muzikler/Muzik"> boğumunda geçen for-each ' tir. for-each elemanı sayesinde select niteliğinde belirtilen küme üzerinde ileri yönlü hareket edebiliriz. Dikkat ederseniz select niteliğinin değeri Muzikler/Muzik olarak belirlenmiştir. Bu da tipik bir XPath ifadesidir. for-each elemanı programlamada kullandığımız foreach döngüsünden farksızdır. Bu eleman sayesinde Muzikler isimli ana boğum içerisindeki tüm Muzik alt boğumlarını dolaşacak bir ifade elde etmiş oluruz. Dikkat ederseniz Xslt dökümanı içerisinde yer yer Html takıları geçmektedir. Eğer Html' e aşina iseniz, burada bir tablo oluşturulduğunu, başlıklarının, arka plan renginin vb. belirlendiğini görebilirsiniz. Peki ilgili Html tablosunun satırlarında yer alan sütunlar içerisine gelecek olan değerleri bir Xml dökümanı içerisinden nasıl almaktayız? Yani Xml içeriğindeki hangi alanların nereye geleceğini nasıl belirtebiliriz? Bunun için Xslt' nin value-of elemanından yararlanmaktayız. Örneğin, <xsl:value-of select="Tip"/> boğumu, Xslt dökümanının uygulandığı Xml içeriğinde yer alan Muzikler/Muzik boğumu altındaki Tip isimli alt boğumun içeriğini bulunduğu yere yazdıracak işlevselliği sağlamaktadır. Gelelim yazmış olduğumuz bu Xslt dökümanının ilgili Xml içeriğine nasıl uygulanacağına. Bunun için xml dökümanımızın başına xsl-stylesheet işlemci direktifini uygulamamız gerekmektedir. Bu işlemin ardından MuzikDukkanim. xml dosyasını herhangibir tarayıcı penceresinde açarsak aşağıdakine benzer bir çıktı elde ederiz. Görüldüğü üzere son kullanıcı için çok fazla anlam ifade etmeyen bir Xml içeriği, Xslt kullanılarak çok daha düzenli ve okunabilir bir Html formatına dönüştürülmüştür. Xslt dönüştürme işlemi sırasında kullanabileceğimiz başka fonksiyonelliklerde vardır. Örneğin, sonuç olarak elde ettiğimiz kümede sıralama işlemleri yaptırabilir veya çeşitli koşullar uygulatabiliriz. Örneğin, MuzikDukkanim. xml dosyasının içeriğinde AlbumAdi alanına göre tersten sıralatma yapmak için Xslt dökümanımızda sort elemanını aşağıdaki gibi kullanmamız yeterli olacaktır. Kod: <xsl:for-each select="Muzikler/Muzik"> <xsl:sort select="AlbumAdi" order="descending" data-type="text"/> Mr.

Sort elemanı select niteliği ile hangi alana göre sıralama yapılacağını belirtmektedir. order niteliğinde sırlamanın yönünü belirtiyoruz . data-type niteliği ise sıralama kriteri için ele alınacak veri tipini belirtiyor. AlbumAdi alanı string bazlı bir içeriğe sahip olduğundan sıralamanında karakter bazlı olması, bir başka deyişle text tipinde olması gerekiyor. Eğer sayısal bir sıralama söz konusu ise data-type değerini number olarak belirtmemiz gerekecektir. Bu değişikliklerden sonra xml dökümanımızı yeniden bir tarayıcı penceresinde açarsak aşağıdakine benzer bir ekran görüntüsü elde ederiz. Sıralama dışında karşılaştırma ifadelerinide ele alabiliriz. Bunun için çoğunlukla Xslt' nin if yada choose elemanlarından faydalanılır. If elemanını özellikle filtreleme yaparken kullanabiliriz. Bu eleman içerisine dahil edilen value-of elemanları belirtilen koşula uyuyorsa çıktı olarak elde edilebilir. Örneğin Xml içeriğimizde Tip alanının değeri DVD olanları listelemek istediğimizi düşünelim. Bu durumda Xslt dökümanımızda for-each elemanı içerisinde yer alan value-of elemanlarını if elemanına ait boğumlar arasına almamız gerekecektir. Kod: <xsl:for-each select="Muzikler/Muzik"> <xsl:sort select="AlbumAdi" order="descending" data-type="text"/> <xsl:if test="Tip='DVD'"> <tr> <td><xsl:value-of select="@ID"/></td> <td><font size="2" color="Blue"><xsl:value-of select="Soyleyen"/></font></td> <td><b><xsl:value-of select="AlbumAdi"/></b></td> <td align="right"><xsl:value-of select="CikisTarihi"/></td> <td><b><xsl:value-of select="Fiyat 1.5"/> Ytl</b></td> <td><xsl:value-of select="Tip"/></td> </tr> </xsl:if> </xsl:for-each> Dikkat ederseniz Tip alanında DVD yazan elemanları elde ettik. If elemanı bunu gerçekleştirebilmek için test isimli niteliğini kullanmaktadır. Elbette burada mantıksal operatorleri kullanarak çoklu karşılaştırmalarda yapabiliriz. Örneğin tipi Dvd veya Cd olanları elde etmek istediğimizde if elemanını şu şekilde kullanabiliriz. Kod: <xsl:if test="Tip='DVD' or Tip='CD' "> If dışında kullanılabilecek karşılaştırma komutlarından biriside choose elemanıdır. Choose aslında swicth-case' e benzeyen bir yapıdadır. Örneğin Xml içeriğimizde Satış Fiyatı 35 Ytl' den küçük olanların arka plan rengini yeşil, 35 Ytl ile 55 Ytl arasında olanların arka plan rengini mavi ve kalan kısıma ait arka plan renklerinide kırmızı yapmak istediğimizi düşünelim. Üstelik bu işlemde sadece Dvd ve Cd tiplerini ele almak istediğimizi varsayalım. Bu durumda Xslt içeriğimizde aşağıdaki değişiklikleri yapmamız yeterli olacaktır. Kod: <xsl:for-each select="Muzikler/Muzik"> <xsl:sort select="AlbumAdi" order="descending" data-type="text"/> <xsl:if test="Tip='DVD' or Tip='CD' "> <tr> <td><xsl:value-of select="@ID"/></td> <td><font size="2" color="Blue"><xsl:value-of select="Soyleyen"/></font></td> <td><b><xsl:value-of select="AlbumAdi"/></b></td> <td align="right"><xsl:value-of select="CikisTarihi"/></td> <xsl:choose> <xsl:when test="Fiyat &gt;35 and Fiyat &lt;55"> <td bgColor="Blue"><font color="White" size="3"><b><xsl:value-of select="Fiyat"/> ytl</b></font></td> </xsl:when> <xsl:when test="Fiyat &lt;35"> <td bgColor="Green"><font color="White" size="3"><b><xsl:value-of select="Fiyat"/> ytl</b></font></td> </xsl:when> <xsl:otherwise> <td bgColor="Red"><font color="White" size="3"><b><xsl:value-of select="Fiyat"/> ytl</b></font></td> </xsl:otherwise> </xsl:choose> <td><xsl:value-of select="Tip"/></td> </tr> </xsl:if> </xsl:for-each> Dikkat ederseniz choose elemanı içerisinde when ve otherwise isimli iki alt eleman kullanılmıştır. When elemanı if elemanı gibi test isimli bir niteliğe sahiptir ki buraya koşulumuzu yazarız. otherwise ise when elemanında belirtilen koşullara uymayan durumlarda devreye girmektedir. Şu ana kadar geliştirdiğimiz örneklerde Xslt uyguladığımız Xml içeriğini görmek için, tarayıcı pencersinde ilgili xml dosyasını açma yolunu seçtik. Lakin Asp. Net uygulamalarında çok sık Xml verileri ile çalışmaktayız. Bu nedenle bir Xslt dökümanını herhangibir Xml içeriğine, yönetimli kod tarafında da uyarlayabilmeliyiz. Framework bir Xml dökümanını bir Xslt dökümanı ile çarpıştırmak için pek çok kullanışlı tip içermektedir. Framework 1.1' de transform işlemleri için XslTransform tipi kullanılmaktaydı. Bu tip Framework 2.0 içinde geçerlidir. Ancak modası geçmiş olarak kabul ediliyor ve yerine gelen yeni XslCompiledTransform tipinin kullanılması öneriliyor. Kaynaklarda yeni gelen XslCompiledTransform tipinin eskisine göre çok daha iyi bir performans sağladığı söylenmekte. Aşağıdaki kod parçası tipik olarak yukarıda gerçekleştirdiğimiz işlemlerin yönetimli tarafta nasıl yapılabileceğini içeren basit bir kod parçası sunmaktadır. Kod: XslCompiledTransform xsltran = new XslCompiledTransform ; xsltran. Load(Server. MapPath ; xsltran. Transform(Server. MapPath , null, Response. Output); XslCompiledTransform tipinin iki önemli üyesi Load ve Transform metodlarıdır. Load metodu ile dönüştürme işleminde kullanılacak olan kaynak Xslt dökümanı belirtilir. Load metodunun altı adet aşırı yüklenmiş versiyonu vardır. Yukarıdaki örnek kod parçasında Xsl dosyasının bulunduğu yol bilgisi kullanılmıştır. Transform işlemleri sırasında eğer performans önemli ise Load ve Transform medorlarında IXPathNavigable arayüzü tipinden parametre alan versiyonlarının kullanılması önerilmektedir. Aşağıdaki kod parçasında IXPathNavigable tipine atanabilen XPathDocument referansları kullanılmıştır. Kod: XslCompiledTransform xsltran = new XslCompiledTransform ; XPathDocument doc = new XPathDocument(Server. MapPath ; XPathDocument xslDoc = new XPathDocument(Server. MapPath ; xsltran. Load ; xsltran. Transform ; Hangi teknik kullanılırsa kullanılsın, dönüştürme işlemini Transform isimli metod gerçekleştirmektedir. Transform metodunun ondört farklı versiyonu bulunmaktadır. Bizim kullandığımız örneklerdeki versiyonlarda ilk parametre olarak dönüştürme işleminin uygulanacağı Xml dökümanı belirtilmektedir. İkinci parametrede ise, ortamdan Xslt dökümanına göndereceğimiz çeşitli parametreler varsa bunlara ait bilgilere yer verilir. Biz şu anki kod parçamızda parametre göndermediğimizden burayı null olarak belirttik. Son parametre ise dönüştürülen çıktının nereye yapılacağını belirtmektedir. Bizim örneğimizde bu çıktı web sayfasının html içeriğine doğru yapılmaktadır ki bu parametre bir stream de alabilir. Bu da çıktının fiziki bir kaynağa doğru yapılabileceğini gösterir. Yukarıdaki kod parçalarından herhangibirini örnek bir web uygulamasında kullandığımızda aşağıdakine benzer bir çıktıyı o anki güncel aspx sayfası üzerinde elde edebiliriz. Bazı durumlarda Xslt dökümanı içerisinde değerini dış ortamdan alacak parametreler kullanmak isteyebiliriz. Örneğin geliştirdiğimiz Xslt dosyasında fiyatı dış ortamdan gelen değerden büyük olanların üzerinde bir koşul çalıştırmak istediğimizi düşünelim. Öncelikli olarak dış ortamdan gelecek olan parametreyi Xslt dökümanımıza bildirmeli, onu içeride kullanmalı ve daha sonra yönetimli taraftan bu parametre değerini aktarmalıyız. İlk olarak içeride kullanacağımız parametreyi ekleyerek işe başlayalım. Bunun için param elemanından aşağıdaki gibi faydalanabiliriz. Param elemanına ait name niteliği parametre adını belirtir. select niteliğinde ise bu parametre için varsayılan bir değer kullanılır. Bu parametreyi örnek olarak when elemanı içerisinde kullanabiliriz. Mr.