XSL (Extensible Style Language) nedir?

October 18, 2008 – 5:43 pm

Geçtiğimiz günlerde şirkette ‘fonbase’ adlı web tabanlı program için yeni bir menu yapmak durumunda kalmıştım. Eski menü flash tabanlıydı ve verileri bir xml dosyasından okuyordu. Haliyle ben de yeni bir menü yapacağımdan ve mevcut xml yapısını bozmak istemediğimizden (olur da flash menüyü tekrar kullanmak durumunda kalırız vs. diye), mevcut xml içindeki verileri okuyup, html içine gömebilecek bir yapı oluşturmamız gerekti ve haliyle bu yapıyı oluşturmak için de bunu yapabilecek bir programlama dili ihtiyacına girdim. Ben ‘acaba java ile xmlden okuyup mu jsp’ye gömsek’ diye düşünürken ve bu öneri ile vinnie‘ye gittiğimde bana bunun yerine XSL kullanabileceğimi söyledi. Ve ben de ‘XSL de ne yahu’ moduna girip araştırmaya koyuldum. Şimdi XSL nedir biraz inceleyelim:

XSL, bir XML dökümanını başka bir XML dökümanına yada başka bir formata (text vs.) dönüştürmek için kullanılan bir programlama dilidir. XSL kendisi de bir xml dilidir ve XML’in uyduğu tüm kurallara uyar.
XSL konu olarak iki bölüme ayrılır. Bunlardan biri XSL’in dili olan XSLT, diğer bölümü ise XSL Formatting Objects’dir (XSL Biçimlendirme Nesneleri). XSL Formatting Objects CSS ile benzerlik göstermektedir. Biz burada sadece XSLT’yi inceleyeceğiz.

XSLT çalışma mantığı basitçe şudur: Ağaç şeklinde oluşan XML dökümanından belirli bölümler seçilir ve bu bölümlerdeki degerler alınarak(bu root elementi, element içindeki attiribute’u veya attribute’a ait text olabilir) belirli bir döküman formatına sokulur (genelde HTML). Bir dökümanın bir parçasını seçmek için XPATH kullanılır.

XML dökümanları element’lerin hiyerarşik bir şekilde sıralanmasından oluşur. root element’inin içinde başka element’ler, o element’lerin içinde başka element’ler olabilir. Bazı element’lerin attribute’lari olabilir. Bazı element’lerin içinde sadece text olabilir. İşte XPATH bu hiyerarşi içideki element’lere, attribute’lara veya text’lere erişmenizi sağlayan bir adresleme sistemidir.

XPATH’te bir adres tam adres olabileceği gibi göreli bir adres olabilir. Bu web sayfaları için kullanılan göreli isimlere benzer. Örneğin aynı klasörün içindeki web sayfalarından diğerine sadece adı ile erişebilir. Bunun gibi birbirine göre durumlara göre XPATH kullanılabilir.

Önce bir dökümanın root elementini yakalayalım. Bunun için / işareti kullanılır. Eğer root element’nin hemen altında title element’ine erişmek istiyorsanız /title yazmanız gerekir. Aşağıdaki örnekte title element’i yakalanmakta ve her title için h1 element’i koyulmaktadır. title element’inin text’i de h1 element’inin içine koyulmaktadır.
XML dökünmanı:

<book>
  	<title>Hello</title>
  </book>

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="book/title">
  	<html>
  		<body>
  			<xsl:value-of select="."/>
  		</body>
  	</html>
  </xsl:template>	
  </xsl:stylesheet>

HTML çıktısı:

<html><body>Hello</body></html>

İlk satırda ile XSL tanımı yapılmaktadır. Template’in match attribute’unu book/title yaparak book element’inin içindeki title element’ini yakalamış oluyoruz. Görüldüğü gibi bir XML document’inden bir HTML document’i elde etmiş olduk.

Herhangi bir element’in içindeki element’i yaklamak için için /element1/element2/element3 şeklinde bir path kullanılır. Eğer title element’inin içindeki name element’i yakalamak istiyorsak:

<xsl:template match="book/title/name">

şeklinde bir match kullanmalıyız. XPATH göreli olarak kullanılabilir. Örneğin aşağıdaki örnekte önce root element’i yakalanmakta, sonra title elementi yakalanmakta daha sonrada name element’i yakalanmaktadır.

XML dökümanı:

 
<book>
   	<title>
   		<name>Ali</name>
   	</title>
   </book>

XSL dökümanı:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="/">
   	<html>
   		<body>
   			<xsl:apply-templates/>
   		</body>
   	</html>
   </xsl:template>
 
  <xsl:template match="title">
  	<h1><xsl:value-of select="name"/></h1>
  </xsl:template>	
  </xsl:stylesheet>

Oluşan HTML:

<html>
   <body>
 
   <h1>Ali</h1>
   </body>
   </html>

XSLT’de önce / ile root element’i yakalanmaktadır. ile root element’leri içindeki element’ler için yaratılmış tüm template’ler çağrılmaktadır. Biz title için de bir template yapmış olduğumuzdan title template’i de çağrılmaktadır. title template’i çağrıldığı zaman seçili element title olmaktadır. Bu yüzden name element’ine ulaşmak için yanlızca name element’inin adını yazmak yeterlidir. Eğer root içinden erişseydik book/title/name yazmamız gerekirdi.

Bir element’in attribute’una erişmek içinse @ işareti kullanılır. örneğin title element’inin size attribute’una erişmek için title/@size yazılması gerekir. Aşağıdaki örnekte title element’inin size attribute’u yakalanmakttadır ve değeri h1 element’inin içine konulmaktadır.

<h1><xsl:value-of select="book/title/@size"/></h1>

Tüm element’leri seçmek için * işareti kullanılır. Örneğin book/* book element’tinin içindeki tüm element’ler anlamına gelir. . işareti ise seçili olan element demektir. Örneğin seçili element title ise onun attribute’si size’ın değeri

<h1><xsl:value-of select="./@size"/></h1>

şeklinde alınabilir.

XSL ile ilgili bu döküman şimdilik bu kadar. Biraz kendimden bira ise godoro.com dan yararlandım. Daha sonra XSL’ in işlevsel özelliklerinden bahseden bir yazı ile bu konuya devam edeceğim.

Daha fazlası için buradan da yararlanabilirsiniz.

Post a Comment