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

11 Değişkenler ve Değergeçler

İçindekiler

    11.1 Hedef Ağaç Bölümleri
    11.2 Değişken ve Değergeçlerin Değerleri
    11.3 Değişken ve Değergeçlerin Değerlerinin xsl:copy-of ile Kullanımı
    11.4 Tepe-Seviyeden Değişkenler ve Değergeçler
    11.5 Örneklenimlerin içinde Değişkenler ve Değergeçler
    11.6 Değergeçlerin Örneklenimlere Aktarılması

<!-- Grubu: tepe-seviyeden-eleman -->
<!-- Grubu: yönerge -->
<xsl:variable
  name = nitelikli-ad
  select = ifade >
  <!-- İçeriği: örneklenim -->
</xsl:variable>
eleman
<!-- Grubu: tepe-seviyeden-eleman -->
<xsl:param
  name = nitelikli-ad
  select = ifade >
  <!-- İçeriği: örneklenim -->
</xsl:param>
eleman

Bir değişken bir değere atanmış bir isimdir. Bir değişken atanmış bir değer ifadelerden elde edilen herhangi bir türde nesne olabilir. Değişken atamakta kullanılabilen iki eleman vardır: xsl:variable ve xsl:param. Farkları, xsl:param elemanının değişkene sadece bir öntanımlı değer atamasıdır; xsl:param elemanının yer aldığı örneklenim veya biçembent çağrıldığında değergeçler kullanıldıkları yerlere öntanımlı değer geçirirler.

xsl:variable ve xsl:param elemanlarının ikisinin de değişkenin ismi olarak kullanıldığından belirtilmesi zorunlu birer name özniteliği vardır. name özniteliğinin değeri Nitelikli Adlar bölümünde açıklandığı gibi bir NitelAda genişletilir.

Bu değişken atama elemanlarından herhangi biri için, içinde atamanın görünür olduğu bir biçembent ağacı bölümü mevcuttur. Bir ifadenin etki alanındaki değişken atamaları, bu ifadenin yer aldığı biçembentte değişkenin görünür olduğu yerdeki atamalardan oluşur.

11.1 Hedef Ağaç Bölümleri

Değişkenler ifade diline yeni bir veri türü ekler. Bu yeni türe hedef ağaç bölümü adı verilir. Bir değişken dört temel XPath türünden (dizge, sayı, mantıksal değer ve düğüm kümesi) başka bir hedef ağaç bölümü türünde de atanabilir. Bir hedef ağaç bölümü, hedef ağacın bir bölümü olarak ifade edilir ve tek bir kök düğüm içeren bir düğüm kümesine eşdeğer tarzda ele alınır. Bununla birlikte, bir hedef ağaç bölümünde izin verilen işlemler bir düğüm kümesinde izin verilen işlemlerin bir altkümesidir. Böyle bir işleme sadece bir dizge üzerinde izin verilen bir işlemse izin verilir (dizge üzerindeki ilk işlem, dizgeyi bir mantıksal değere veya sayıya dönüştürme işlemi olabilir). Özellikle, hedef ağaç bölümü üzerinde /, // ve [] işleçlerinin kullanımına izin verilmez. Bir hedef ağaç bölümünde izin verilen işlemlerden biri her uygulanışında, eşdeğeri bir düğüm kümesinde uygulandığı gibi uygulanır.

Bir hedef ağaç bölümü hedef ağaca kopyalanırken (bkz, Değişken ve Değergeçlerin Değerlerinin xsl:copy-of ile Kullanımı), eşdeğer düğüm kümesinde kök düğümün çocukları olan tüm düğümler hedef ağaca aynı sırayla kopyalanırlar.

İfadeler, hedef ağaç bölümü türündeki değerleri sadece, hedef ağaç bölümü türündeki değişkenlere atıfta bulunarak veya bir hedef ağaç bölümü döndüren bir eklenti işlevini çağırarak ya da değeri bir hedef ağaç bölümü olan bir sistem gerecini getirerek döndürürler.

11.2 Değişken ve Değergeçlerin Değerleri

Bir değişken atama elemanı bir değişken değerini üç yoldan biriyle belirtebilir.

Not:
Bir değişken, düğümleri konumlarına göre seçmek için kullanılmışsa, aşağıdakini yapmamak konusunda dikkatli olunmalıdır:

<xsl:variable name="n">2</xsl:variable>
...
<xsl:value-of select="item[$n]"/>

Bu örneklenim, ilk item elemanının değerini çıktılayacaktır. Sebebi, n değişkeninin bir sayıya değil bir hedef ağaç bölümüne atanmış olmasıdır. Şöyle,

<xsl:variable name="n" select="2"/>
...
<xsl:value-of select="item[$n]"/>

veya şöyle yapılabilirdi:

<xsl:variable name="n">2</xsl:variable>
...
<xsl:value-of select="item[position()=$n]"/>

Not:
Boş bir düğüm kümesini bir değergeçe öntanımlı değer olarak atamanın tek uygun yolu şudur:

<xsl:param name="x" select="/.."/>

11.3 Değişken ve Değergeçlerin Değerlerinin xsl:copy-of ile Kullanımı

<!-- Grubu: yönerge -->
<xsl:copy-of
  select = ifade />
eleman

xsl:copy-of elemanı hedef ağaca bir hedef ağaç bölümü yerleştirmekte kullanılabilir ve bunu yapmak için xsl:value-of elemanının yaptığı gibi (bkz, Metnin xsl:value-of ile Üretilmesi) önce bir dizgeye dönüşüm gerekmez. Bir ifade içeren bir select özniteliğinin belirtilmesi zorunludur. İfadenin değerlendirme sonucunun bir hedef ağaç bölümü olması durumunda, bölümün tümü hedef ağaca kopyalanır. Sonucun bir düğüm kümesi olması durumunda ise, kümenin düğümleri belgedeki sıralarına göre hedef ağaca kopyalanırlar; bir eleman düğümünün kopyalanması, elemanın kendinden başka, isim-alanı düğümlerinin, öznitelik düğümlerinin ve elemanın çocuk düğümlerinin de kopyalanmasına sebep olur; bir kök düğüm ise, çocuklarının kopyalanmasıyla kopyalanmış olur. Bir öznitelik veya isim-alanının kopyalanmasında, xsl:copy ile kopyalamada geçerli olan kurallar burada da aynen geçerlidir (bkz, Kopyalama). Sonucun ne bir düğüm kümesi ne de hedef ağaç bölümü olması durumunda, tıpkı xsl:value-of elemanının yaptığı gibi, sonuç bir dizgeye dönüştürüldükten sonra hedef ağaca yerleştirilir.

11.4 Tepe-Seviyeden Değişkenler ve Değergeçler

xsl:variable ve xsl:param elemanlarının her ikisi de tepe-seviyeden elemanlar olabilir. Bir tepe-seviyeden değişken atama elemanı, her yerde (başka bir atama tarafından geçersiz kılınmadıkça) görünür olan bir genel değişken bildirir. Bir tepe-seviyeden xsl:param elemanı biçembende bir değergeç bildirir; XSLT, biçembente değergeç aktarımı ile ilgili bir mekanizma tanımlamaz. Bir biçembent aynı isme sahip birden fazla değişken ataması içeriyorsa, ithal önceliği en yüksek atama kullanılır. Bir biçembendin aynı ithal önceliği ile aynı isme atama yapan birden fazla değişken ataması içermesi bir hatadır. Tepe seviyede, değişken değeri belirten bir ifade veya örneklenim, kaynak belgenin kök düğümünü işlemekte kullanılan bağlama eşdeğer bir bağlamla değerlendirilir: geçerli düğüm kaynak belgenin kök düğümü olup geçerli düğüm kümesi kaynak belgenin sadece kök düğümünü içeren bir listedir. Eğer bir örneklenim veya ifade bir y genel değişkenine atıf yapan bir x genel değişkeni belirtiyorsa, y değişkeninin değerinin x değişkeninin değerinden önce hesaplanması gerekir. Tüm genel değişken tanımları açısından bunun olması olanaksızsa bu bir hatadır; başka bir deyişle, atamanın bitmeyen bir döngüye yol açabilecek şekilde hesaplanması bir hatadır.

Burada, bir öznitelik değeri örnekleniminden atıfta bulunulan para-font-size isimli bir genel değişken bildirilmektedir:

<xsl:variable name="para-font-size">12pt</xsl:variable>

<xsl:template match="para">
 <fo:block font-size="{$para-font-size}">
   <xsl:apply-templates/>
 </fo:block>
</xsl:template>

11.5 Örneklenimlerin içinde Değişkenler ve Değergeçler

xsl:variable ve xsl:param elemanlarına tepe seviyede izin verildiği gibi örneklenimlerin içinde de izin verilir. xsl:variable elemanına, bir örneklenimin içinde bir yönergeye izin verilen her yerde izin verilir. Bu durumda, atama, xsl:fallback yönergeleri hariç tüm küçük kardeşlerin astsallarına görünür olacaktır. Atamanın xsl:variable elemanının kendisi için görünür olmayacağına dikkat ediniz.

xsl:param elemanına bir xsl:template elemanının başlangıcında bir çocuk olarak bulunmasına izin verilir. Bu bağlamda, atama, xsl:fallback yönergeleri hariç tüm küçük kardeşlerin astsallarına görünür olacaktır. Atamanın xsl:param elemanının kendisi için görünür olmayacağına dikkat ediniz.

Eğer bir atamanın görünür olduğu yerde başka bir atama yer alıyorsa ve bu atamalar aynı isme yapılmışsa, yeni atama o bağlamda eskisini geçersiz bırakır. Aynı örneklenim içinde xsl:variable veya xsl:param elemanlarınca yapılmış atamaların birbirlerini geçersizleştirmeleri bir hatadır. Bir örneklenim içinde, xsl:variable veya xsl:param elemanlarınca yapılmış atamaların tepe-seviyeden yapılmış atamaları geçersizleştirmeleri hata değildir. Bu durumda, bir tepe-seviyeden atama, başka bir atamanın kendisini geçersizleştirdiği bir biçembent bölümünde görünür olmayacaktır. Bu bakımdan şu bir hatadır:

<xsl:template name="foo">
  <xsl:param name="x" select="1"/>
  <xsl:variable name="x" select="2"/>
</xsl:template>

Ama, buna izin verilir:

<xsl:param name="x" select="1"/>

<xsl:template name="foo">
  <xsl:variable name="x" select="2"/>
</xsl:template>

Not:
Bir örneklenim içindeki bir xsl:variable elemanının Java dilindeki en yakın eşdeğeri, ilklendiricili bir nihai yerel değişken bildirimidir. Örneğin,

<xsl:variable name="x" select="'value'"/>

ile

final Object x = "value";

aynı anlambilgisine sahiptir. XSLT, böyle bir Java atama işlecinin bir eşdeğerini sağlamaz:

x = "value";

Çünkü bir belgeyi başından sonuna kadar, betik benzeri bir yöntemden başka bir yöntemle işleyen bir gerçeklenimi oluşturmak daha zor olurdu.

11.6 Değergeçlerin Örneklenimlere Aktarılması

<xsl:with-param
  name = nitelikli-ad
  select = ifade >
  <!-- İçeriği: örneklenim -->
</xsl:with-param>
eleman

Değergeçler örneklenimlere xsl:with-param elemanı kullanılarak aktarılırlar. Belirtilmesi zorunlu olan name özniteliği değergeçin (atamanın değerini değiştirdiği değişken) ismini belirtir. name özniteliğinin değeri Nitelikli Adlar bölümünde belirtildiği gibi yorumlanan bir NitelAddır. xsl:with-param elemanına xsl:call-template ve xsl:apply-templates elemanlarının her ikisinde de izin verilir. Bir xsl:call-template veya xsl:apply-templates elemanının birden fazla aynı isimli xsl:with-param elemanı içermesi bir hatadır. Değergeç değeri xsl:variable ve xsl:param elemanlarında kullanılan yöntemle belirtilir. xsl:with-param ile belirtilen değerin hesaplanmasında kullanılan geçerli düğüm ve geçerli düğüm listesi, içinde kullanıldığı xsl:call-template veya xsl:apply-templates elemanlarınınkilerle aynıdır. x için bir xsl:param elemanına sahip olmayan bir örneklenime bir x değergecini aktarmak hata değildir; değergeç basitçe yoksayılır.

Bu örnekte, sayı biçimini denetleyen bir değergeçe sahip numbered-block isminde bir örneklenim, değergeçine değer aktarılarak çağrılmaktadır:

<xsl:template name="numbered-block">
  <xsl:param name="format">1. </xsl:param>
  <fo:block>
    <xsl:number format="{$format}"/>
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>

<xsl:template match="ol//ol/li">
  <xsl:call-template name="numbered-block">
    <xsl:with-param name="format">a. </xsl:with-param>
  </xsl:call-template>
</xsl:template>

ÖncekiYukarıSonraki
SıralamaBir Linux Kitaplığı SayfasıEk İşlevler