|
|
||||||||||||
|
|
XSL'de Şablonlarla Çalışmak
Sözlük alanları XSL belgelerinin yorumlanması için hayati önem
taşıyor. W3.Org sitesinde yayınlanan farklı XSL sürümlerinden hangisinin
kullanılacağını belirten tek bilgi, sözlük alanını işaret eden xmlns özniteliği.
Fakat yorumlayıcıların, aynı sözlük alanındaki kuralları benimsemiş olması
gerekiyor. ŞABLONLARLA ÇALIŞMAK Bir XSL belgesini oluşturan temel öğelerden biri kök şablondur. Biçimlendirme işlemi bu şablonun kapsamında yapılır. Basit bir XSL belgesinin aşağıdakine benzer bir içeriğe sahip olduğunu anımsayın. <?xml version="1.0" encoding="ISO-8859-9"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:template match="/"> .. .. </xsl:template> </xsl:stylesheet> Belgedeki iş akışı match özniteliği "/" olan xsl:template öbeğinin içinde gerçekleşir. Bu öbek aslında belgenin 'kök şablon'udur ve bulunması gerekir. Bu, gerçekten zorunlu olmasa da kullanılmadığı bir durumda XML verilerinin biçimsiz listesi elde edilir. Ek şablonlar ise Match özniteliği "/" olmayan xsl:template etiketli öğelerdir. Eğer belgede sadece bir xsl:template öğesi varsa bu, Match özniteliğinin değerine bakılmaksızın kök şablon olarak kabul edilebilir. Ek şablonların faydalarından biri tekrarlanan biçimlendirme işlemlerini kolaylaştırmalarıdır. Aynı zamanda belgenin derli toplu olması bu yolla sağlanabilir. Ek şablonlar genellikle kök şablonun altından itibaren devam ederler. Bu, şablonların işlenmesi için yeterli değildir. Bir şablonun işlenmesi için xsl:apply-templates veyahut xspl:call-template gibi bir komutla çağrılması gerekir. Şablonların özniteliklerinden yaygın kullanılan ikisi 'match' ve 'name'dir. Name özniteliği bir şablonu, daha sonra çağrılarak kullanılabilmesi için adlandırır. Match ise kapsamdaki verilerden seçme ve süzme işlemi yapar. Genellikle bu iki özniteliğin aynı anda yalnızca biri yorumlanır. <?xml version="1.0" encoding="ISO-8859-9"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
..
<xsl:call-template name="Sablon1"/>
<xsl:apply-templates select="/KITAPLAR/KITAP"/>
..
</xsl:template>
<xsl:template name="Sablon1">
..
..
</xsl:template>
<xsl:template match="/KITAPLAR/KITAP">
..
..
</xsl:template>
</xsl:stylesheet>
Name özniteliği ile adlandırılmış bir şablon xsl:call-template ile, Match özniteliği atanmış bir şablon ise xsl:apply-templates ile çağrılabilir. Ek şablonları birbirlerinin içinden çağırmak da aynı şekilde mümkündür. Match özniteliği aslında bulunduğu şablona uygun kayıt kümesini süzmektedir. Match'in değeri yukarıdaki gibi basit bir yol olabilmekle birlikte, çok karmaşık bir sorgu metni de olabilir. Yukarıdaki örnekte /KITAPLAR kök öğesinin altındaki tüm KITAP öğelerinin bu şablona geçirileceği belirtilmektedir. Daha üstte bulunan xsl:apply-templates'teki Select özniteliğinin değeri de aynı yolu kullanan bu şablonun çalıştırılmasını sağlamaktadır.
Örnek kitaplar.xml belgesindeki kitap bilgilerinin, ayrı bir şablon ile biçimlendirildiği kitaplar.xsl belgesinin içeriği aşağıdaki şekildedir. <!-- kitaplar.xsl -->
<?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:apply-templates select="/KITAPLAR/KITAP">
<xsl:sort select="KITAPADI"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="/KITAPLAR/KITAP">
<table width="300" cellspacing="0">
<tr><td bgcolor="#DDDDDD">
<b><xsl:value-of select="KITAPADI"/></b>
</td></tr>
<tr><td bgcolor="#EEEEEE">
Kod: <xsl:value-of select="KOD"/><br/>
Yazar: <xsl:value-of select="YAZAR"/><br/>
Yayınevi: <xsl:value-of select="YAYINEVI"/><br/>
Çeviren: <xsl:value-of select="CEVIREN"/>
</td></tr>
</table>
<br/>
</xsl:template>
</xsl:stylesheet>
Kitaplar örneğinde xsl:apply-templates öğesini <xsl:apply-templates select="/KITAPLAR/KITAP"/> yerine <xsl:apply-templates select="/KITAPLAR/KITAP">
<xsl:sort select="KITAPADI"/>
</xsl:apply-templates>
şeklinde kullanmayı tercih ettik. Xsl:apply-templates öğesi xsl:sort komutunu içine alabilir ve bu, şablonun üreteceği kayıt kümesinin Select'te bildirilen veri alanına göre sıralanacağı anlamına gelir. Örneğimizde xsl:sort'u kullanarak KITAPADI'na göre sıralama yaptık. Xsl:sort komutunun xsl:for-each içinde de kullanılabildiğini anımsayın. Geçen yazımızda bahsettiğimiz gibi Order ("ascending" | "descending") özniteliği ile sıralama yönü, Data-type ("text" | "number") özniteliği ile de sıralamanın metin bazında ya da sayısal olacağı belirtiliyordu. <xsl:sort select="KITAPADI"/> <xsl:sort select="KOD" order="descending" data-type="number"/> SÖZLÜK ALANLARI Belgenin başında bulunan xmlns özniteliği belgenin sözlük alanını (namespace) işaret ediyor. Gerçekte XML/XSL yorumlayıcılar bu sözlük alanını pek önemserler. Burada belirtilen web adresi aslında özel ve benzersiz bir isim olmaktan öteye gitmez. Bu adreste W3.Org tarafından açıklanan XSL önerisi bulunuyor. Yorumlayıcılar belgeyi incelerken öncelikle bu adresin, kendi komut kümelerine uygun olup olmadıklarına bakarlar.
Örneğin Microsoft'un MSXML paketi bu adreste bildirilen kurallara (önerilere) göre şekillendirilmiştir. Internet Explorer da aynı kurallara sadıktır. Xmlns özniteliğine farklı bir şey yazılması belgenin yorumlanmamasına neden olur. Bu yüzden XSL belgeleri için, sözlük alanını belirten xmlns özniteliği hayati önem taşımaktadır. XSL'in yaygın kullanılan sürümü (1.0) için öneriler http://www.w3.org/TR/xsl/ adresinde yayınlanmaktadır. Xmlns değerinde küçük bir değişiklik yapmak xsl: ile başlayan komutların geçersiz olmasına yol açar. Yorumlayıcıların daha sonra çıkacak sürümlerinde, bu adresteki kurallara uyduklarını göreceğiz. Daha sonraki XSL belgelerinde http://www.w3.org/1999/XSL/Transform yerine artık http://www.w3.org/2003/XSL/Transform gibi bir sözlük alanı adı kullanmaya başlayacağız. DOSYALAR:
Serkan ŞAHİNOĞLU |