İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

XSL (Extensible Style Language)

XSL nedir?

XSL bir XML document'ini başka bir XML document'ine veya başka bir type'e (text vs..) dönüştürmek için kullanılan bir dildir. XSL'in kendisi de bir XML dilidir. XML dillerinin uyduğu tüm kurallara uyar. XSL ile bir document'in herhangi bir bölümü (source tree) yeni document'in bir bölümü (result tree) haline getirilir.

XSL iki ana bölüme ayrılır. Birincisi XSLT dir ki genellike XSL denilince XSLT akla gelir. XSLT dönüştürme dilidir. Bir XML'den başka bir XML'e dönüştürmek içindir. XSL'in diğer bölümü ise XSL Formatting Objects'dir (XSL Biçimlendirme Nesneleri). XSL Formatting Objects CSS'ye benzerlik göstermektedir. Bu yazıda biz sadece XSLT'yi anlatacağız.

XSL'in Çalışma Sistemi

XSLT ile dönüştürülecek XML document'inin belirli bir kısmı seçilir. Seçilen bu kısım document'in root element'i veya br element'in attribute'si veya bir element'in içindeki text olabilir. Bu seçilme işleminden sonra oluşturulacak XML document'inin bir kısmı oluşturulur. Böylece seçilen kısım'dan bilgiler alınarak yeni document'in bir parçası yaratılır. Bir document'in bir parçasını seçmek işin XPATH kullanılır. XPATH konusunu aşağıda anlatılmaktadır.

XSLT'de en önemli element xsl:template element'tidir. xsl:template element'tinin match attributesi ile hangi element'lere bu template(şablon)'in uygulanacağı verilir. Örneğin her title element'ti için h1 element'ini yaratabilirsiniz. Yapacağınız template'in match özelliğine title element'inin document'teki adresini (XPATH) vermenizdir. Ancak tüm bu işlemleri anlayabilmek için XPATH bilinmesi gerekmektedir. XPATH örnekleri için xsl:template element'i kullanılacaktır.

XPATH

XML document'leri 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'leri olabilir. Bazı element'lerin içinde sadece text olabilir. İşte XPATH bu hiyerarşi içideki element'lere, attribute'lere 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 document'inin 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.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 <book>
  2 	<title>Hello</title>
  3 </book>
  4 	

Göster Gizle Kopar Satır Gizle Satır Göster
  1 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  2 <xsl:template match="book/title">
  3 	<html>
  4 		<body>
  5 			<xsl:value-of select="."/>
  6 		</body>
  7 	</html>
  8 </xsl:template>	
  9 </xsl:stylesheet>	

Göster Gizle Kopar Satır Gizle Satır Göster
  1 <html><body>Hello</body></html>

İlk satırda <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> ile XSL declaration'u yapılmaktadır. Template'in match attribute'sini 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.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 <book>
  2 	<title>
  3 		<name>Ali</name>
  4 	</title>
  5 </book>

Göster Gizle Kopar Satır Gizle Satır Göster
  1 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  2 <xsl:template match="/">
  3 	<html>
  4 		<body>
  5 			<xsl:apply-templates/>
  6 		</body>
  7 	</html>
  8 </xsl:template>
  9 	
 10 <xsl:template match="title">
 11 	<h1><xsl:value-of select="name"/></h1>
 12 </xsl:template>	
 13 </xsl:stylesheet>

Göster Gizle Kopar Satır Gizle Satır Göster
  1 <html>
  2 <body>
  3 	
  4 <h1>Ali</h1>
  5 </body>
  6 </html>

XSLT'de önce / ile root element'i yakalanmaktadır. <apply-templates/> 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'sine erişmek içinse @ işareti kullanılır. örneğin title element'inin size attribute'sine erişmek için title/@size yazılması gerekir. Aşağıdaki örnekte title element'inin size attributesi 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 ELement'leri

Yukarıdaki örneklerde xsl:template ,xsl:value-of ,xsl:apply-templates element'lerini kullandık. Bunun gibi XSLT'de bir çok element bulunmaktadır. Şimdi bu element'ler anlatılacaktır.

En önemli element yukarıda gördüğümüz xsl:template element'idir. Bu element'in match attribute'si ile verilen element'e istenilen işlem uygulanır.

<xsl:template match="element path">
..burada bir takım işlemler yapılır.
</xsl:template>	

Kendiniz bir isim vererek bir template yaratabilirsiniz. Her template'in XML document'indeki bir element'e karşılık gelmesi gerekmez. İsim verilerek yaratılan template'ler

<xsl:call-template name="template name">
</xsl:call-template>	

şeklinde çağırılırlar. İsim verilen template'ler parametre ile de çağrılabilirler.

  
<xsl:template name="template name">
	<xsl:param name="param name">default değer</xsl:param>
</xsl:template>	

şeklinde yaratılırlar ve

  
<xsl:call-template name="template name">
	<xsl:with-param name="paramName">value</xsl:with-param>
</xsl:call-template>

şeklinde çağrılırlar.

XSLT ile sabit veya parametre yaratılabilir. Örneğin bir sabit yaratmak

<xsl:constant name="test" value="test value"/>

şeklinde yapılır. Bu sabitin değerini kullanamak için

<xsl:value-of select="$test"/>

yazmak gerekir. Burada görüldüğü gibi sabit adının önünde $ işareti bulunmaktadır. Aynı şekilde parametre'lerin değerine erişmek için de $ işareti kullanılır.

Element ve Attribute Yaratma

Sunuç XML'e eklenecek olan element'ler ve attribute'ler yaratılabilir. Aşağıdaki örnekte bir title element'i yaratılmaktadır.

<xsl:element name="title">değer</xsl:element>

Eğer title element'inin size diye bir attribute'si var ve değeri 10pt ise aşağıdaki gibi yaratılır.

<xsl:element name="title">
	<xsl:attribute name="size">10pt</xsl:attribute>
</xsl:element>

size adıyla bir attribute yarattık ve değerini 10pt yaptık. Sonuç XML'inde aşağıdaki üretilecektir.

<title size="10pt"/>

Akış Kontrolleri ve Döngüler

Bir çok programlama dilinde olan if, if-else, for gibi yapılar XSLT'de de vardır. Aşağıda eğer title'in size attributesi varsa h1 ile başlık koyan bir örnek görülmektedir. Eğer title element'inde size kullanılmamışsa bu başlık gözükmeyecektir.

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

XSL'de if'in yanında bir else gibi bir element yoktur. Eğer bu tür bir işleme ihtiyaç duyuyorsanız xsl:choose element'ini kullanacaksınız. Bu elementin içinde xsl:when element'leri bir seçim yapmanızı sağlar. Bu seçimler yoksa xsl:otherwise element'inin içindekiler uygulanır. Yukardaki örnekteki gibi title'nin size attrinbute'si varsa h1 yoksa h3 element'ini üretmesini sağlayalım.

<xsl:choose>
	<xsl:when test="title/@size">
		<h1><xsl:value-of select="title/@size"></h1>
	<xsl:when>
	<xsl:otherwise>
		<h3><xsl:value-of select="title/@size"></h3>
	</xsl:otherwise>	
</xsl:choose>

For döngüleri içinde xsl:for-each element'i kullanılır. Aşağıda bir book element'inin içindeki tüm title'ler seçilip bir işlem gerçekleşmektedir.

<xsl:for-each select="title">
	<h1><xsl:value-of select="."></h1>
</xsl:for-each>

Burada tüm title element'leri sırasıyla seçilmektedir. Her title element'i için h1 element'i yaratılacaktır. select="." ile aktif olan title element'i anlamına gelir.

Element Kopyalamak

Bazen kaynak XML'den bir element ve içini aynı şekilde yeni XML document'ine kopyalamak gerekebilir. Bunu için xsl:copy kullanılır. Örneğin book içindeki title element'ini aynen kopyalamak için

<xsl:copy-of select="title"/>

yazmak yeterlidir. Burada element'in attribute'leri ve içindeki element'ler olduğu gibi kopyalanır.

Sorting-Sıralama

Bazen XML document'inden bazı element'leri sıralı bir şekilde almak gerekebilir. Örneğin bir catalog içindeki kitap isimlerinin alfabetik olarak alınması istenebilir. Bunun için xsl:sort element'i kullanılır. Aşağıda book element'inin name attribute'sine göre name'in değerini alfabetik olarak sıralı bir şekilde listeleyen kod görülmektedir.

<xsl:for-each select="book">
	<xsl:sort select="@name" order="descending"/>
		<h1><xsl:value-of select="./@name"></h1>		
	</xsl:sort>
</xsl:for-each>

Burada book element'in name attribute'sine göre küçükten büyüğe (A'dan Z'ye) bir sıralama yapılmaktadır. Dikkate edilmesi gereken xsl:sort element'inin for-each veya xsl:apply-templates içinde kullanılmasıdır.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır