XSL Dönüşümleri (XSLT) Sürüm 1.0
ÖncekiYukarıSonraki

12 Ek İşlevler

İçindekiler

    12.1 Çok Kaynaklı Belgeler
    12.2 Anahtarlar
    12.3 Sayı Biçimleme
    12.4 Çeşitli Ek İşlevler

Bu bölümde temel XPath işlev kütüphanesine ek olarak XSLT'ye özgü işlevlere yer verilmiştir. Bu ek işlevlerin bazıları ayrıca, biçembentte tepe-seviyeden elemanlar tarafından belirtilen bilgileri de kullanıma sokarlar; bu bölümde bu işlevler ayrıca açıklanacaktır.

12.1 Çok Kaynaklı Belgeler

düğüm-kümesi document(nesne, düğüm-kümesi?)
İşlev

document işlevi asıl kaynak belgeden başka XML belgelere de erişimi mümkün kılar.

document işlevi tek bir argümana sahipse ve bu argüman da bir düğüm kümesi ise, sonuç, belirtilen düğüm kümesinin her düğümü için, düğümün kendi dizgesel değerinin document işlevinin ilk argümanı, düğümün üyesi olduğu düğüm kümesinin ikinci argümanı olduğu document çağrılarının sonuçlarının birleşimidir.

document işlevi iki argümana sahipse ve ilk argüman bir düğüm kümesi ise, sonuç, belirtilen düğüm kümesinin her düğümü için, düğümün dizgesel değerinin document işlevinin ilk argümanı, ikinci argümanın yine ikinci argümanı olduğu document çağrılarının sonuçlarının birleşimidir.

document işlevine aktarılan ilk argümanın bir düğüm kümesi olmaması halinde, ilk argüman string işlevinin yaptığı gibi bir dizgeye dönüştürülür ve bu dizge bir tanım-yeri (URI) başvurusu olarak ele alınır; Bu tanım-yeri ile tanımlanan özkaynak alınıp getirilir. Bu algetir işleminin sonucu olan veri bir XML belge olarak çözümlenir ve veri modeline uygun ber ağaç oluşturulur (bkz, Veri Modeli). Özkaynağın alınıp getirilmesi ile ilgili bir hata oluşmuşsa, XSLT işlemci hatayı raporlayabilir, raporlamıyorsa, bir boş düğüm kümesi döndürerek hatayı ortadan kaldırabilir. Özkaynağın alınıp getirilmesi ile ilgili olası tek hata çeşidi XSLT işlemcinin tanım-yeri tarafından kullanılan tanım-yeri şemasını desteklemeyişidir. Bir XSLT işlemcinin her tanım-yeri şemasını desteklemesi gerekmez. XSLT işlemcinin belgeleri, XSLT işlemcinin hangi tanım-yeri şemalarını desteklediğini açıklamalıdır.

Eğer tanım-yeri başvurusu bir bölüm betimleyici (adresin sonunda yer alan ve # imi ile başlayan dizgecik) içermiyorsa, belgenin sadece kök düğümünü içeren bir düğüm kümesi döner. Eğer tanım-yeri başvurusu bir bölüm betimleyici içeriyorsa, tanım-yeri başvurusunun bölüm betimleyicisi tarafından betimlenen ağaçtaki düğümleri içeren bir düğüm kümesi döner. Bölüm betimleyicinin ifade ettiği anlam, tanım-yerinden alınıp getirilen özkaynağın ortam türüne bağımlıdır. Eğer bölüm betimleyicinin işlenmesi ile ilgili bir hata oluşmuşsa, XSLT işlemci hatayı raporlayabilir, raporlamıyorsa, bir boş düğüm kümesi döndürerek hatayı ortadan kaldırabilir. Olası hatalar şunlar olabilir:

Özkaynağın alınıp getirilmesinin sonucu olan veri algetir işleminin sonucunun ortam türünden bağımsız olarak bir XML belge olarak çözümlenir; eğer tepe seviye ortam türü text ise, ortam türünün text/xml olduğu durumda uygulanan yöntemle çözümlenir; aksi takdirde, application/xml ortam türüne özgü yöntemle çözümlenir.

Not:
Tepe-seviyeden bir xml ortam türü olmadığından text/xml veya application/xml ortam türünde olmayan veri yine de fiilen XML olabilir.

Tanım-yeri başvurusu göreli olabilir. İkinci argümandaki düğüm kümesinde, belgedeki sıraya göre ilk olan düğümün temel tanım-yeri (bkz, Temel Tanım-yeri), göreli tanım yerlerini mutlak tanım yerine dönüştürmek için temel tanım-yeri olarak kullanılır. İkinci argümanda boş düğüm kümesi ile göreli tanım-yeri belirtmek bir hatadır. XSLT işlemci hatayı raporlayabilir, raporlamıyorsa, bir boş düğüm kümesi döndürerek hatayı ortadan kaldırabilir. Eğer ikinci argüman hiç belirtilmemişse, biçembentte document işlevinin çağrıldığı ifadeyi içeren düğüm öntanımlı değerdir. Göreli tanım-yeri başvurusunun çözümlenmesini sağlaması nedeniyle, sıfır uzunluktaki bir tanım-yeri başvurusunun belgeye bir başvuru oluşuna dikkat ediniz; bu bakımdan, document("") ifadesi biçembendin kök düğümüne karşılıktır; biçembendin ağaç gösterimi, biçembendi kaynak belgenin başında içeren XML belgeyle tamamen aynıdır.

Eğer iki belge aynı tanım-yerine sahipse bunlar aynı belge olarak ele alınır. Karşılaştırma için kullanılan tanım-yeri, göreli tanım-yerlerini çözümlemekte kullanılan ve bir bölüm betimleyici içermeyen mutlak tanım-yeridir. Eğer ikisi de aynı belgeye aitse iki kök düğüm aynı kök düğüm olarak ele alınır. Bu bakımdan aşağıdaki ifade daima doğru sonuç verecektir:

generate-id(document("foo.xml"))=generate-id(document("foo.xml"))

document işlevi, bir düğüm kümesinin birden fazla belgeden düğümler içermesini olasılığını arttırır. Böyle bir düğüm kümesi ile aynı belgedeki iki düğümün göreli belge sırası XPath [XPath] tarafından tanımlanmış normal belge sırası olacaktır. İki düğümün farklı belgelerdeki göreli belge sırası, bu iki düğümü içeren belgelerin gerçeklenime bağımlı sıralamasına göre saptanır. Sürekli olarak aynı sonucu vermek dışında gerçeklenimlerin belgeleri nasıl sıralayacağıyla ilgili bir kısıtlama yoktur: Bir gerçeklenim, aynı belge kümesi için daima aynı sıralamayı yapmak zorundadır.

12.2 Anahtarlar

Anahtarlar, belgelerde örtük bir çapraz başvuru yapısıyla çalışma imkanı verir. XML'deki ID, IDREF ve IDREFS öznitelik türleri XML belgelerin kendi çapraz başvurularını doğrudan oluşturabilmeleri için bir mekanizma sağlar. XSLT bunu XPath id işlevi üzerinden destekler. Bununla birlikte bu mekanizmanın bazı gereklilikleri vardır:

Bu gerekliliklerden dolayı XML belgeler, ID/IDREF/IDREFS öznitelikleriyle açıkça belirtilmese bile bir çapraz başvuru yapısına sahip olurlar.

Bir anahtar şu üçlemeye sahiptir:

  1. anahtarın sahibi olan düğüm

  2. anahtarın ismi (bir genişletilmiş isim)

  3. anahtarı değeri (bir dizge)

Bir biçembentte her belge için anahtar kümesi xsl:key elemanı kullanılarak bildirilir. Bu anahtar kümesi, x diye bir düğüme, y diye bir isme ve z diye bir değere sahipse, x düğümünün z değerli bir y anahtarı olduğundan bahsedebiliriz.

Bu bakımdan, bir anahtar, bir XML ID'sinin sınırlamalarına konu olmayan genelleştirilmiş bir ID çeşididir:

<!-- Grubu: tepe-seviyeden-eleman -->
<xsl:key
  name = nitelikli-ad
  match = örüntü
  use = ifade />
eleman

xsl:key elemanı anahtarları bildirmek için kullanılır. name özniteliği ile anahtarın ismi belirtilir. name özniteliğinin değeri, Nitelikli Adlar bölümünde açıklandığı gibi yorumlanan bir NitelAd olmalıdır. match özniteliği bir Örüntü olup, bir xsl:key elemanı, belirtilen bu örüntüyle eşleşen düğümlerin anahtarları hakkında bilgi verir. use özniteliği anahtarın değerini belirten bir ifade olup, örüntüyle eşleşen her düğüm için bir kere değerlendirilir. Eğer sonuç bir düğüm kümesi ise, düğüm kümesindeki her düğümün belirtilen isimde, değeri düğümün dizgesel değeri olan bir anahtarı olur; aksi takdirde, sonuç bir dizgeye dönüştürülür ve örüntüyle eşleşen düğümün belirtilen isimde değeri bu dizge olan bir anahtarı olur. Bu bakımdan, bir x düğümünün y isminde ve z değerinde bir anahtara sahip olması için bir xsl:key elemanının sağlaması gerek ve yeter koşullar şunlardır:

Ayrıca, belli bir düğümle eşleşen birden fazla xsl:key elemanı olabileceğini de aklınızdan çıkarmayın; böyle xsl:key elemanlarının hepsi aynı ithal önceliğine sahip olmasalar bile kullanılırlar.

use veya match özniteliğinin değer olarak bir DeğişkenGönderimi veya bir key işlev çağrısı içermesi bir hatadır.

düğüm-kümesi key(dizge, nesne)
İşlev

key işlevi ID'ler için id işlevinin yaptığını anahtarlar için yapar. İlk argüman anahtarın ismini belirtir. Argümanın değeri Nitelikli Adlar bölümünde açıklandığı gibi yorumlanan bir NitelAd olmalıdır. İkinci argüman bir düğüm kümesi olduğunda, sonuç, bu düğüm kümesindeki her düğümün dizgesel değerine key işlevinin uygulanmasından elde edilen sonuçlarının birleşimi olacaktır. İkinci argüman herhangi bir başka türde bir değer içerdiğinde, argüman string işlevinin yaptığı gibi bir dizgeye dönüştürülür; bu durumda, işlevden dönen sonuç, değeri bu dizgeye eşit bir isimli anahtara sahip bağlamsal düğümle aynı belgedeki düğümleri içeren bir düğüm kümesi olur.

Örnek:
Örneğin, şöyle bir bildirim olsun:

<xsl:key name="idkey" match="div" use="@id"/>

key('idkey', @ref) ifadesi, id(@ref) ifadesinin sonucu olan düğüm kümesi ile döner; XML kaynak belgesinde özniteliğin ID türünde şöyle bildirilmiş olduğu,

<!ATTLIST div id ID #IMPLIED>

ve geçerli düğümün ref özniteliğinin herhangi bir boşluk karakteri içermediği varsayımıyla.

Örnek:
Bir işlev kütüphanesini açıklayan bir belgemiz olduğunu ve işlevleri tanımlamak için bir prototype elemanı kullanıldığını varsayalım.

<prototype name="key" return-type="düğüm-kümesi">
<arg type="dizge"/>
<arg type="nesne"/>
</prototype>

İşlev isimlerinden bu tanıma atıfta bulunmak için de function elemanı kullanılıyor olsun.

<function>key</function>

Buradan hareketle biçembent gönderimlerle tanımlar arasındaki hiper bağları şöyle üretecektir:

<xsl:key name="func" match="prototype" use="@name"/>

<xsl:template match="function">
<b>
  <a href="#{generate-id(key('func',.))}">
    <xsl:apply-templates/>
  </a>
</b>
</xsl:template>

<xsl:template match="prototype">
<p><a name="{generate-id()}">
<b>Function: </b>
...
</a></p>
</xsl:template>

Örnek: (çevirmenden)

Bu anahtarlar konusu bu işin en zor anlaşılan kısmıdır. Yukarıdakine benzer ama yukarıdakinden her bakımdan daha yararlı olacağını umduğum bir örneği vermek istiyorum.

Bir belirtim belgemiz olsun. Belgede bahsedilen sabitlerden bazılarının tanımları varken bazıları sadece birer dizgesel sabit olsun. Tanımları olanların isimleri belgede geçtikçe (<literal>sabit</literal> gibi) bu isimler bu tanımlara aynı zamanda birer hiper bağ olsun, tanımları olmayanların da birer sabit oldukları belli olsun, istiyoruz.

<xsl:template match="literal">
  <xsl:variable name="idx" select="concat('value-def-', text())"/>
  <xsl:variable name="targets" select="key('ids', $idx)"/>

  <xsl:choose>
    <xsl:when test="count($targets) > 0">
      <a href="#{$idx}">
        <code><xsl:apply-templates/></code>
      </a>
    </xsl:when>
    <xsl:otherwise>
      <tt><xsl:apply-templates/></tt>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Örneklenimin ilk yönergesinde bir değişken ataması yapılıyor. $idx değişkenine, literal elemanının içeriğinden bir ID değeri oluşturup bunu atıyoruz. İkinci yönergedeki değişken atamasında ise $idx değişkenine atadığımız ID değerini içeren düğümleri $ids değişkeninin değerinden alıp $targets değişkenine atıyoruz. Tabii bunu yapabilmek için biçembentin başlarında şöyle bir yönergemiz olması gerek (bu anahtar, belgede birer id özniteliğine sahip bütün elemanları toplayıp $ids değişkenine atar):

<xsl:key name="ids" match="*" use="@id"/>

xsl:when elemanında aradığımız ID'ye sahip eleman var mı acaba diye bir sınama yapıyoruz. Varsa, XML belgedeki <literal>sabit</literal> yerine XHTML belgeye sabitin tanımını işaret eden bir hiper bağ yerleştiriyoruz (bu bağ için gereken ID değerini bildiğimiz için bir önceki örnekte olduğu gibi bir ID üretmemiz gerekmiyor). Yoksa, içeriğini bir dizgesel sabit olduğunu vurgulayacak bir imlenimin (tt) içine alıyoruz.

key işlevi daima geçerli düğümle aynı belgede yer alan düğümleri döndürür; bir anahtarı başka bir belgeden almak için önce geçerli düğümün değiştirilmesi gerekir.

Örnek:
Bir belgenin <bibref>XSLT</bibref> biçiminde kaynakça girdilerine atıfta bulunduğunu ve bu kaynakçanın da bib.xml adlı ayrı bir XML belgede girdilerinin şöyle bir veri modeliyle tutulduğunu varsayalım:

<entry name="XSLT">...</entry>

Bu durumda biçembent bibref elemanlarını dönüştürmek için şu kodları içerebilirdi:

<xsl:key name="bib" match="entry" use="@name"/>

<xsl:template match="bibref">
  <xsl:variable name="name" select="."/>
  <xsl:for-each select="document('bib.xml')">
    <xsl:apply-templates select="key('bib',$name)"/>
  </xsl:for-each>
</xsl:template>

12.3 Sayı Biçimleme

dizge format-number(sayı, dizge, dizge?)
İşlev

format-number işlevi birinci argümanında belirtilen sayıyı ikinci argümanında belirtilen biçim örüntüsü dizgesini kullanarak bir dizgeye dönüştürür. Üçüncü argümanda onluk sayı biçimi belirtilir, üçüncü argümanın yokluğunda öntanımlı onluk sayı biçimi kullanılır. Biçim örüntüsü dizgesi JDK 1.1 DecimalFormat sınıfı tarafından belirtilen sözdizimine sahiptir. Biçim örüntüsü dizgesinin gösterimi yerelleştirilebilir: onluk biçim örüntüdeki karakterlerin hangilerinin ne anlama geldiğini belirler (yerelleştirilmeyen tırnak karakteri hariç). Biçim örüntüsü sent imini (#x00A4) içeremez; Bu özellik için destek JDK 1.1'e ilk sürümünden sonra eklenmiştir. Onluk biçim ismi Nitelikli Adlar bölümünde açıklandığı gibi yorumlanan bir NitelAd olmalıdır. Biçembendin onluk biçimin genişletilmiş isimli bir bildirimini içermemesi bir hatadır.

Not:
Gerçeklenimlerin ne JDK 1.1 kullanması ne de Java dilinde geliştirme yapmaları gereklidir.

Not:
Biçembentler yuvarlamayı denetim altına almak için XPath'daki diğer oluşumları kullanabilirler.

<!-- Grubu: tepe-seviyeden-eleman -->
<xsl:decimal-format
  name = nitelikli-ad
  decimal-separator = karakter
  grouping-separator = karakter
  infinity = dizge
  minus-sign = karakter
  NaN = dizge
  percent = karakter
  per-mille = karakter
  zero-digit = karakter
  digit = karakter
  pattern-separator = karakter />
eleman

xsl:decimal-format elemanı, format-number işlevi tarafından kullanılan bir biçim örüntüsünün yorumlanışını denetleyen bir onluk biçim bildirir. name özniteliği belirtilmişse, eleman isimli bir onluk biçim belirtir. name özniteliğinin değeri Nitelikli Adlar bölümünde açıklandığı gibi yorumlanan bir NitelAd olmalıdır. Öntanımlı onluk biçim bildirimi yapmak veya tüm öznitelikler (öntanımlılar dahil) için aynı değerle bildirilmiş olmadıkça aynı isimde birden fazla onluk biçim bildirimi yapmak (ithal öncelikleri farklı olsa bile) bir hatadır. Eğer bir biçembent bir öntanımlı onluk biçim bildirimi içermiyorsa, özniteliksiz xsl:decimal-format elemanına eşdeğer bir bildirim uygulanır.

xsl:decimal-format elemanının diğer öznitelikleri JDK 1.1 DecimalFormatSymbols sınıfındaki yöntemlere karşılıktır. Her get/set çiftine karşılık xsl:decimal-format elemanı için tanımlanmış bir öznitelik vardır.

Aşağıdaki öznitelikler hem biçim örüntüsündeki karakterlerin yorumlanışını denetler hem de sayının biçimlenmesi sonucu elde edilebilen karakterleri belirtirler:

Aşağıdaki öznitelikler biçim örüntüsündeki karakterlerin yorumlanışını denetlerler:

Aşağıdaki öznitelikler biçimlenmiş sayıda yer alan karakterleri veya dizgeleri belirtmekte kullanılır:

12.4 Çeşitli Ek İşlevler

düğüm-kümesi current()
İşlev

current işlevi, tek üyesi geçerli düğüm olan bir düğüm kümesi ile döner. Son tahlilde (başka bir ifadenin içinde yer almayan bir ifadede), geçerli düğüm daima bağlamsal düğümle aynıdır. Bu bakımdan,

<xsl:value-of select="current()"/>

ile

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

aynı anlama gelir. Bununla birlikte, köşeli ayraçlar içindeki geçerli düğüm bağlamsal düğümden farklı bir düğüm olacaktır. Örneğin,

<xsl:apply-templates select="//glossary/item[@name=current()/@ref]"/>

ebeveynleri glossary elemanları olup, değerleri geçerli düğümün ref özniteliğinin değerine eşit olan birer name özniteliğine sahip tüm item elemanlarını işleyecektir. Aşağıdaki yönerge bunu yapmaz:

<xsl:apply-templates select="//glossary/item[@name=./@ref]"/>

yönergesi

<xsl:apply-templates select="//glossary/item[@name=@ref]"/>

ile aynı anlama gelir. Bunlar, ebeveynleri glossary elemanları olup, name ve ref özniteliklerinin değerleri aynı olan tüm item elemanlarını işleyecektir.

current işlevini bir Örüntü içinde kullanmak bir hatadır.

Çevirmenin notu:
Geçerli düğümü bir değişkene atayıp işlevin yerine bu değişkeni köşeli ayraçlar içinde kullanmak da istenen sonucu verecektir.
dizge unparsed-entity-uri(dizge)
İşlev

unparsed-entity-uri işlevi, bağlamsal düğümle aynı belgede ismiyle belirtilmiş bir çözümlenmemiş öğenin tanım-yerini döndürür (bkz, Çözümlenmemiş Öğeler). Böyle bir öğe yoksa boş dizgeyle döner.

dizge generate-id(düğüm-kümesi?)
İşlev

generate-id işlevi argümanında belirtilen düğüm kümesinin belgedeki sıraya göre ilk rastlanılan düğümünü eşsiz olarak betimleyen bir dizge ile döner. Eşsiz betimleyici bir ASCII harf ile başlamalı ve ASCII abecesayısal karakterlerinden oluşmalıdır. Bir gerçeklenim, aynı düğüm için daima aynı betimleyiciyi ve farklı düğümler için farklı betimleyicileri üretecek herhangi bir yöntemi seçmekte özgürdür. Bir gerçeklenim her dönüşümde aynı betimleyicileri üretmek zorunda değildir. Üretilmiş bir eşsiz betimleyicinin belgedeki mevcut (bu üretimin sonucu olmayan) eşsiz betimleyicilerden farklı olmak zorunda değildir. Eğer işleve belirtilen düğüm kümesi boşsa işlev boş dizge döndürür. Hiç argüman belirtilmemişse, bağlamsal düğüm öntanımlıdır.

nesne system-property(dizge)
İşlev

Argüman bir NitelAd olarak değerlendirilecek bir dizge olmalıdır. Bu NitelAd ifadenin etki alanındaki isim-alanı bildirimleri kullanılarak bir isme genişletilir. system-property işlevi bu isim tarafından betimlenen sistem gerecinin değeri olan nesne ile döner. Böyle bir sistem gereci yoksa boş dizge döner.

Gerçeklenimlerin aşağıdaki sistem gereçlerini hepsi XSLT isim-alanında yer alacak şekilde sağlamalıdırlar:

Üreticilerin XSLT isim-alanında başka sistem gereci tanımlamaması gerekir.

ÖncekiYukarıSonraki
Değişkenler ve DeğergeçlerBir Linux Kitaplığı Sayfasıİletiler