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

5 Örneklenim Kuralları

İçindekiler

    5.1 İşlem Modeli
    5.2 Örüntüler
    5.3 Örneklenim Kurallarının Tanımlanması
    5.4 Örneklenim Kurallarının Uygulanması
    5.5 Şablon Kuralları için Uyuşmazlıkların Çözümlenmesi
    5.6 Örneklenim Kurallarının Geçerli Kılınması
    5.7 Kipler
    5.8 Yerleşik Örneklenim Kuralları

5.1 İşlem Modeli

Bir kaynak düğümleri listesi işlendiğinde hedef ağacın bir bölümü oluşturulmuş olur. Hedef ağacı oluşturmak için kök düğümü içeren ana listeyi işlemek gerekir. Bir kaynak düğümleri listesi, ana listenin her üyesi sırayla işlenerek oluşturulan hedef ağaç yapısına eklenerek işlenir. Bir düğüm ise, düğümle eşleşen örüntülere sahip tüm örneklenim kuralları bulunarak ve bunların en uygunu seçilerek işlenir; seçilen kuralın örneklenimi, kaynak düğüm geçerli düğüm olarak, kaynak düğüm listesi geçerli düğüm listesi olarak ele alınarak örneklenir. Bir örneklenim genelde, işlem için ek kaynak düğümü listesini seçmekte kullanılan yönergelerden oluşur. Eşleştirme, örnekleme ve seçim işlemleri işlem için seçilecek kaynak düğümü kalmayıncaya kadar ardışık olarak sürer.

Gerçeklenimler, kaynak belgeyi, bu işlem modeli kullanılarak elde edilen sonucun aynısını üretecek şekilde işleyecek yöntemi seçmekte özgürdürler.

5.2 Örüntüler

Örneklenim kuralları düğümlerle bir örüntü aracılığıyla özdeşleşir. Örüntüler, örneklenim kurallarından başka, numaralama (Numaralama) ve anahtar bildirimi (Anahtarlar) için de kullanılırlar. Bir örüntü, bir düğüme uygulanacak koşul kümesini belirtir. Bu koşulları yerine getiren bir düğüm örüntüyle eşleşir; yerine getirmiyorsa eşleşmez. Örüntü sözdizimi, ifade sözdiziminin bir alt kümesidir. Özellikle, belli şartları sağladığı takdirde bir konumsal yol örüntü olarak kullanılabilir. Bir ifade ayrıca, daima düğüm kümesi türünde bir nesne olarak değerlendirilen bir örüntüdür. Bir düğüm, bir örüntünün belli bir bağlamla ilgili bir ifade olarak değerlendirilmesinin sonucunda elde edilen düğüm kümesinin bir üyesiyse, düğüm örüntüyle eşleşir; sözkonusu bağlam, bu düğüm veya üstsellerinden birinin eşleştiği bağlamsal düğümlerdir.

Bazı örüntü örnekleri:

Bir örüntünün Örüntü sözdizimi ile eşleşmesi gerekir. Bir Örüntü, | imleriyle ayrılmış konumsal yol örüntülerinden oluşur. Bir konumsal yol örüntüsü, konumlarının her birinde child veya attribute dallarının kullanıldığı bir konumsal yoldur. descendant-or-self dalının kullanımının gerekli olmadığı yerlerde // veya / işleci kullanılabilir. Konumsal yol örüntüleri ayrıca, bir dizgesel sabit argümana sahip id veya key işlev çağrıları ile başlayabilir. Bir örüntüdeki dayanaklarda da bir konumsal yoldaki dayanaklarda olduğu gibi keyfî ifadeler kullanılabilir.

Örüntüler
[1]   Örüntü   ::=   KonumsalYolÖrüntüsü
| Örüntü '|' KonumsalYolÖrüntüsü
[2]   KonumsalYolÖrüntüsü   ::=   '/' GöreliYolÖrüntüsü?
| IdKeyÖrüntüsü (('/' | '//') GöreliYolÖrüntüsü)?
| '//'? GöreliYolÖrüntüsü
[3]   IdKeyÖrüntüsü   ::=   'id' '(' DizgeselSabit ')'
| 'key' '(' DizgeselSabit ',' DizgeselSabit ')'
[4]   GöreliYolÖrüntüsü   ::=   KonumÖrüntüsü
| GöreliYolÖrüntüsü '/' KonumÖrüntüsü
| GöreliYolÖrüntüsü '//' KonumÖrüntüsü
[5]   KonumÖrüntüsü   ::=    ÇocukVeyaÖznitelikBelirteci DüğümSınaması Dayanak*
[6]   ÇocukVeyaÖznitelikBelirteci   ::=   KısaKonumBelirteci
| ('child' | 'attribute') '::'

Bir örüntünün bir düğümle eşleşmesi için gerek ve yeter koşul, örüntünün bir ifade olarak değerlendirildiği olası bir bağlamda, düğümün bu değerlendirme sonucunda elde edilen düğüm kümesinin bir üyesi olmasıdır. Bir düğüm eşleştiği takdirde, olası bağlamlar, bu düğümün veya bir üstselinin eşleştiği bir bağlamsal düğüme ve bu bağlamsal düğümü içeren bir bağlamsal düğüm listesine sahip bağlamlar olur.

Örneğin, p örüntüsü herhangi bir p elemanı ile eşleşir; p ifadesi, bağlamsal düğüm olarak p'nin ebeveyni ile değerlendirilirse, elde edilen düğüm kümesi p elemanını üyesi olarak içerecektir.

Not:
Bu örüntü, p elemanı belge elemanı olsa bile elemanla eşleşir, çünkü belge elemanının ebeveyni kök düğümdür.

Örüntülerin anlambilgisi dolaylı olarak ifade değerlendirme kuralları ile belirtiliyor olsa da, bir örüntünün ne anlam geldiğini ifade değerlendirme kurallarıyla düşünmeksizin doğrudan doğruya anlamak daha kolaydır. Bir örüntüde | imi seçenekleri belirtir; eğer bir örüntüde bir veya daha fazla sayıda | imi ile ayrılmış seçenek varsa, seçeneklerden birinin eşleşmesi halinde örüntü eşleşmiş olur.

/ veya // ayraçları ile ayrılmış çok sayıda KonumÖrüntüsüden oluşmuş bir örüntü sağdan sola doğru eşleşir. Örüntünün eşleşmesi için en sağdaki KonumÖrüntüsünün düğümle eşleşip örüntünün kalanının da uygun bir elemanla eşleşmesi yeterlidir; uygun eleman, ayraç olarak // kullanılmışsa düğümün üstsellerden biri, / kullanılmışsa düğümün ebeveyni olacaktır.

Çocuk dal kullanan bir KonumÖrüntüsü, eğer DüğümSınamasının sonucu düğüm için doğruysa ve düğüm bir öznitelik düğümü ise eşleşir.

İfade [] içerdiği takdirde, KonumÖrüntüsündeki ilk Dayanakİfadesi bağlamsal düğüm olarak düğümle ve eşleştirilecek düğüm bir öznitelik düğümü olmadıkça, DüğümSınaması bağlamsal düğüm listesi olarak bağlamsal düğümün kardeşleri ile eşleşecek şekilde değerlendirilir; eşleştirilecek düğüm bir öznitelik düğümü olduğu takdirde, bağlamsal düğüm listesi, tamamen, eşleşen öznitelikle aynı düğümde olan özniteliklerden oluşur ve bu AdSınaması ile eşleşir.

Örneğin, bu ifadenin,

appendix//ulist/item[position()=1]

bir düğümle eşleşmesi için gerek ve yeter koşullar şunlardır:

5.3 Örneklenim Kurallarının Tanımlanması

<!-- Grubu: tepe-seviyeden-eleman -->
<xsl:template
  match = örüntü
  name = nitelikli-ad
  priority = sayı
  mode = nitelikli-ad >
  <!-- İçeriği: (<xsl:param>*, örneklenim) -->
</xsl:template>
eleman

Bir örneklenim kuralı xsl:template elemanı ile belirtilir. match özniteliği, kuralın uygulanacağı kaynak düğüm ya da düğümleri tanımlayan bir Örüntüdür. match özniteliği xsl:template elemanı bir name özniteliğine sahip olmadıkça gereklidir (İsimli Örneklenimler bölümüne bakınız). match özniteliğinin değer olarak bir DeğişkenGönderimi içermesi bir hatadır. xsl:template elemanının içeriği, örneklenim kuralı uygulandığında nesnelleşmiş olacak olan örneklenimdir.

Örneğin bir XML belge şunu içersin:

Bu <emph>önemli</emph> bir noktadır.

Aşağıdaki örneklenim kuralı emph elemanı ile eşleşir ve font-weight özniteliğinin değeri bold olan bir fo:inline-sequence biçimleme nesnesini üretir.

<xsl:template match="emph">
  <fo:inline-sequence font-weight="bold">
    <xsl:apply-templates/>
  </fo:inline-sequence>
</xsl:template>

Not:
Bu belgedeki örneklerde, [XSL]'de tanımlanmış olan biçimleme nesnelerinin isim-alanı olan http://www.w3.org/1999/XSL/Format için fo: öneki kullanılmıştır.

Biraz sonra açıklanacağı gibi xsl:apply-templates elemanı kaynak elemanın çocuklarını peşpeşe işleyecektir.

5.4 Örneklenim Kurallarının Uygulanması

<!-- Grubu: yönerge -->
<xsl:apply-templates
  select = düğüm-kümesi-ifadesi
  mode = nitelikli-ad >
  <!-- İçeriği: (<xsl:sort> | <xsl:with-param>) -->
</xsl:apply-templates>
eleman

Bu örnek bir chapter elemanı için bir blok oluşturup ardından çocukları işler.

<xsl:template match="chapter">
  <fo:block>
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>

select özniteliğinin yokluğunda xsl:apply-templates yönergesi geçerli düğümün tüm çocuklarını, metin düğümleri de dahil olmak üzere işler. Bununla birlikte, Boşluk Ayıklama bölümünde belirtildiği gibi ayıklanan metin düğümleri işlenmeyecektir. Eğer bir eleman için boşluk düğümlerinin ayıklanması etkin kılınmamışsa, eleman içeriğindeki bütün boşluk karakterleri metin olarak işlenecektir ve bu bakımdan position işlevi tarafından döndürülen bir çocuk elemanın yakınlık derecesi saptanırken, çocuk elemanların arasındaki boşluklar da sayılacaktır.

select özniteliğinde belirtilecek bir ifadeyle, tüm çocukların değil de sadece seçilen çocukların işlenmesi sağlanabilir. select özniteliğinin değeri bir ifadedir. İfade bir düğüm kümesiyle sonuçlanacak şekilde değerlendirilmelidir. Seçilen düğüm kümesi, bir sıralama (Sıralama) belirtilmemişse belgedeki sıraya göre işlenecektir. Aşağıdaki örnekte, yazar-grubu'nun tüm yazar çocukları işlenmektedir:

<xsl:template match="yazar-grubu">
  <fo:inline-sequence>
    <xsl:apply-templates select="yazar"/>
  </fo:inline-sequence>
</xsl:template>

Aşağıdaki örnekte ise, yazar-grubu'nun yazar çocuklarının tüm verilen-ad'ları işlenmektedir:

<xsl:template match="yazar-grubu">
  <fo:inline-sequence>
    <xsl:apply-templates select="yazar/verilen-ad"/>
  </fo:inline-sequence>
</xsl:template>

Bu örnekte, book elemanının tüm heading astsalları işlenir:

<xsl:template match="book">
  <fo:block>
    <xsl:apply-templates select=".//heading"/>
  </fo:block>
</xsl:template>

Ayrıca, geçerli düğümün astsalı olmayan elemanları da işlemek mümkündür. Bu örnekte ekip çocuklara ve personel torunlara sahip bir bölüm ele alınmaktadır. Bir personelin bölümü bulunmakta ve bölüm'ün ekip çocukları işleme sokulmaktadır:

<xsl:template match="personel">
  <fo:block>
    <xsl:apply-templates select="name"/> ismindeki çalışanımız
    <xsl:apply-templates select="ancestor::bölüm/ekip"/> ekibindedir.
  </fo:block>
</xsl:template>

Basit bir baştan sıralama yapmak için tek bir örüntünün içinde çok sayıda xsl:apply-templates elemanı kullanılabilir. Aşağıdaki örnekte iki HTML tablosu oluşturulmaktadır. İlk tablo yurtiçi satışlarla, ikinci tablo yurtdışı satışlarla doldurulmaktadır.

<xsl:template match="ürün">
  <table>
    <xsl:apply-templates select="satışlar/yurtiçi"/>
  </table>
  <table>
    <xsl:apply-templates select="satışlar/yurtdışı"/>
  </table>
</xsl:template>

Not:
Biri diğerinin astsalı olan iki astsalla eşleşim mümkündür. Bu özel bir durum olarak ele alınmaz: her iki astsal normal olarak işlenir. Şöyle bir kaynak belgemiz olsun:

<doc><div><div></div></div></doc>

Bu kuralla,

<xsl:template match="doc">
  <xsl:apply-templates select=".//div"/>
</xsl:template>

hem dış div hem de iç div işlenecektir.

Not:
Genellikle, xsl:apply-templates sadece geçerli düğümün astsal düğümlerini işlemekte kullanılır. xsl:apply-templates'in böyle kullanımı bitmeyen işlem döngüleriyle sonuçlanamaz. Bununla birlikte, xsl:apply-templates geçerli düğümün astsalları olmayan elemanları işlemek için kullanıldığında bitmeyen döngülere yol açılması olasıdır. Örnek:

<xsl:template match="foo">
  <xsl:apply-templates select="."/>
</xsl:template>

Gerçeklenimler böyle döngüleri bazı durumlarda saptayabilir, fakat bir biçembentin bir gerçeklenimin saptayamadığı bitmeyen döngülere girme olasılığı mevcuttur. Bu bir hizmet reddi şeklinde bir güvenlik açığını yol açabilir.

5.5 Şablon Kuralları için Uyuşmazlıkların Çözümlenmesi

Bir kaynak düğümün birden fazla örneklenim kuralı ile eşleşmesi olasıdır.Kullanılacak örneklenim kuralı şöyle belirlenir:

  1. Önce tüm eşleşen kurallardan düşük ithal önceliğine sahip olanlar elenir.

  2. Sonra, kalan eşleşen kurallardan düşük işlem önceliğine sahip olanlar elenir. Bir örneklenim kuralının işlem önceliği o örneklenim kuralı üzerinde priority özniteliği ile belirtilir. Değeri bir gerçel sayı (pozitif veya negatif) olmalı ve isteğe bağlı bir eksi imi (-) ile öncelenmiş olarak Sayı sözdizimi ile eşleşmelidir. Öntanımlı işlem önceliği şöyle hesaplanır:

    Bu bakımdan, en bilinen örüntü çeşidinin (bir düğümü belli bir tür veya genişletilmiş isimle sınayan) işlem önceliği 0'dır. Sonraki en özel örüntü çeşidinin (bir düğümü belli bir isim-alanındaki belli bir tür veya genişletilmiş isimle sınayan) işlem önceliği -0.25'tir. Bundan daha az özel (düğümleri sadece belli bir türle sınayan) örüntülerin işlem önceliği -0.5'tir. En bilinen örüntü çeşidinden daha özel örüntülerin işlem önceliği ise 0.5'tir.

Eğer bu elemeden geriye birden fazla eşleşmiş örneklenim kuralı kalıyorsa bu bir hatadır. Bir XSLT işlemci hatayı raporlayabilir; eğer raporlamıyorsa, kalanlardan biçembentte daha sonlarda yer alan örneklenim kuralını seçerek hatadan kurtulmalıdır.

5.6 Örneklenim Kurallarının Geçerli Kılınması

<!-- Grubu: yönerge -->
<xsl:apply-imports />
eleman

İthal edilmiş bir biçembentteki bir örneklenim kuralını geçersiz kılmak için kullanılmış bir örneklenim kuralı (bkz, Şablon Kuralları için Uyuşmazlıkların Çözümlenmesi) geçersiz kılınan örneklenim kuralını xsl:apply-imports elemanını kullanarak çağırabilir.

Bir biçembentin işlenmesi sırasında, herhangi bir anda tek bir geçerli örneklenim kuralı vardır. Bir örneklenim kuralı örüntü eşleştirerek her seçilişinde, kuralın örnekleniminin nesnelleştirilmesi için geçerli örneklenim kuralı haline gelir. Bir xsl:for-each elemanı işleme sokulduğunda geçerli örneklenim kuralı xsl:for-each elemanının içeriğinin nesnelleştirilmesi için tanımsız hale gelir.

xsl:apply-imports elemanı sadece, geçerli örneklenim kuralını içeren biçembente ithal edilmiş olan örneklenim kuralının kullanılarak geçerli düğümün işlenmesini sağlar; düğüm geçerli örneklenim kuralının kipinde işlenir. Geçerli örneklenim kuralı tanımsızken xsl:apply-imports nesnelleştirme için kullanılmaya çalışılırsa bu bir hatadır.

Örneğin, doc.xsl biçembenti example elemanları için şöyle bir örneklenim kuralı içeriyor olsun:

<xsl:template match="example">
  <pre><xsl:apply-templates/></pre>
</xsl:template>

Başka bir biçembent de doc.xsl'i ithal edip example elemanını şöyle ele alıyor olsun:

<xsl:import href="doc.xsl"/>

<xsl:template match="example">
  <div style="border: solid red">
     <xsl:apply-imports/>
  </div>
</xsl:template>

Dönüşümün birleşik etkisi bir example elemanını şu biçime getirir:

<div style="border: solid red"><pre>...</pre></div>

5.7 Kipler

Kipler bir elemanın her seferinde farklı bir sonuç üretmek üzere defalarca işlenmesini mümkün kılar.

xsl:template ve xsl:apply-templates elemanlarının ikisi de isteğe bağlı bir mode özniteliğine sahiptir. mode özniteliğinin değeri bir NitelAd olup Nitelikli Adlar bölümünde açıklandığı gibi yorumlanır. Eğer bir xsl:template elemanı bir match özniteliğine sahip değilse bir mode özniteliğine sahip olmamalıdır. Eğer bir xsl:apply-templates elemanı bir mode özniteliğine sahipse sadece kendi mode özniteliğinin değeriyle aynı mode özniteliğine sahip xsl:template elemanlarındaki örneklenim kuralları uygulanır; eğer bir xsl:apply-templates elemanı bir mode özniteliğine sahip değilse sadece mode özniteliğine sahip olmayan xsl:template elemanlarındaki örneklenim kuralları uygulanır.

5.8 Yerleşik Örneklenim Kuralları

Biçembentte örtük bir örneklenim kuralıyla eşleşen başarılı bir örüntünün yokluğunda işlemlerin ardışık olarak sürmesini sağlayan bir yerleşik örneklenim kuralı vardır. Bu örneklenim kuralı hem eleman düğümlerine hem de kök düğüme uygulanır. Yerleşik örneklenim kuralının eşdeğeri şöyle birşey olurdu:

<xsl:template match="*|/">
  <xsl:apply-templates/>
</xsl:template>

Ayrıca, her kip için de benzer şekilde, biçembentte örtük bir örneklenim kuralıyla eşleşen başarılı bir örüntünün yokluğunda işlemlerin ardışık olarak sürmesini sağlayan bir yerleşik örneklenim kuralı vardır. Bu örneklenim kuralı hem eleman düğümlerine hem de kök düğüme uygulanır. Örneğin, m kipi için yerleşik örneklenim kuralının eşdeğeri şöyle birşey olurdu:

<xsl:template match="*|/" mode="m">
  <xsl:apply-templates mode="m"/>
</xsl:template>

Ayrıca, metin ve öznitelik düğümleri için metinlerin kopyalanmasını sağlayan bir yerleşik örneklenim kuralı vardır:

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

İşlem yönergeleri ve açıklamalar için olan yerleşik örneklenim kuralı hiçbir şey yapmaz:

<xsl:template match="processing-instruction()|comment()"/>

İsim-alanı düğümleri için olan yerleşik örneklenim kuralı da hiçbir şey yapmaz. Bir isim-alanı düğümüyle eşleşen bir örüntü olmayacağı için isim-alanı düğümlerine uygulanan yegane örneklenim kuralı bu yerleşik örneklenim kuralıdır.

Yerleşik örneklenim kuralları biçembentten önce örtük olarak ithal edilmişler gibi ele alınırlar, dolayısıyla tüm diğer örneklenim kurallarından daha düşük ithal önceliğine sahip olurlar. Bu bakımdan biçembent yazarları bir yerleşik örneklenim kuralını biçimbente açıkça bir örneklenim kuralı ekleyerek geçersiz kılabilirler.

ÖncekiYukarıSonraki
İfadelerBir Linux Kitaplığı Sayfasıİsimli Örneklenimler