| XSL Dönüşümleri (XSLT) Sürüm 1.0 | ||
|---|---|---|
| Önceki | Yukarı | Sonraki |
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.
Ö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:
para örüntüsü herhangi bir para elemanıyla eşleşir
* örüntüsü herhangi bir elemanla eşleşir
chapter|appendix örüntüsü herhangi bir chapter veya appendix elemanıyla eşleşir
olist/item örüntüsü ebeveyni olist olan herhangi bir item elemanıyla eşleşir
appendix//para örüntüsü üstseli appendix olan herhangi bir para elemanıyla ile eşleşir
/ örüntüsü sadece kök düğümle eşleşir
text() örüntüsü herhangi bir metin düğümü ile eşleşir
processing-instruction() örüntüsü herhangi bir işlem yönergesi ile eşleşir
node() örüntüsü bir öznitelik düğümü veya kök düğüm olmayan herhangi bir düğümle eşleşir
id("W11") örüntüsü eşsiz ID'si W11 olan elemanla eşleşir
para[1] örüntüsü ilk para çocukla eşleşir
*[position()=1 and self::para] örüntüsü çocuklardan para türündekilerin ilkiyle eşleşir
para[last()=1] örüntüsü sonuncu para çocukla eşleşir
items/item[position()>1] örüntüsü ebeveynleri items olan item elemanlarından ilki hariç hepsiyle eşleşir
item[position() mod 2 = 1] örüntüsü çift numaralı item çocuklarla eşleşir
div[@class="appendix"]//p örüntüsü appendix değerli bir class özniteliğine sahip div üstseli olan herhangi bir p elemanıyla eşleşir
@* örüntüsü herhangi bir öznitelikle eşleşir
@class örüntüsü herhangi bir class özniteliği ile eşleşir
*[@class] örüntüsü class özniteliğine sahip herhangi bir elemanla eşleşir
code[starts-with(normalize-space(text()), 'xsl:')] örüntüsü metin düğümünün normalleştirilmiş değeri 'xsl:' dizgesi ile başlayan herhangi bir code elemanıyla eşleşir (Ç.N. - Bu örüntü, bu belirtimin XML belgesini XHTML'ye dönüştürmekte kullanılan örneklenimlerden birinde kullanılmıştır.)
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.
| [1] | Örüntü | ::= | |
| | |||
| [2] | KonumsalYolÖrüntüsü | ::= | '/' |
| | |||
| '//'? | |||
| [3] | IdKeyÖrüntüsü | ::= | 'id' '(' |
| 'key' '(' | |||
| [4] | GöreliYolÖrüntüsü | ::= | |
| | |||
| | |||
| [5] | KonumÖrüntüsü | ::= |
|
| [6] | ÇocukVeyaÖznitelikBelirteci | ::= | |
| ('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.
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:
item DüğümSınaması düğüm için doğru olmalı ve düğüm bir öznitelik olmamalıdır; başka bir deyişle düğüm bir item elemanı olmalıdır.
position()=1 Dayanakİfadesinin bağlamsal düğüm olarak düğümle ve bağlamsal düğüm listesi olarak düğümün item kardeşleriyle değerlendirilmesinin sonucu doğru olmalıdır.
düğümün appendix//ulist ile eşleşen bir ebeveyni olmalıdır; ebeveyn, appendix üstsele sahip bir ulist elemanı ise bu doğru olacaktır.
<!-- Grubu: tepe-seviyeden-eleman --> <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>
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.
<!-- Grubu: yönerge --> <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><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.
<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.
Bir kaynak düğümün birden fazla örneklenim kuralı ile eşleşmesi olasıdır.Kullanılacak örneklenim kuralı şöyle belirlenir:
Önce tüm eşleşen kurallardan düşük ithal önceliğine sahip olanlar elenir.
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:
Eğer bir örüntü | imleri le birbirlerinden ayrılmış çok sayıda seçenek içeriyorsa, bunların her birinin işlem önceliği bir diğerine denk ele alınır.
Eğer bir örüntü önüne bir ÇocukVeyaÖznitelikBelirteci getirilmiş bir NitelAd ya da önüne bir ÇocukVeyaÖznitelikBelirteci getirilmiş processing-instruction(DizgeselSabit) biçiminde ise işlem önceliği 0'dır.
Eğer bir örüntü önüne bir ÇocukVeyaÖznitelikBelirteci getirilmiş bir KısaAd:* biçiminde ise işlem önceliği -0.25'tir.
Aksi takdirde, eğer bir örüntü önüne bir ÇocukVeyaÖznitelikBelirteci getirilmiş bir DüğümSınaması biçimindeyse işlem önceliği -0.5'tir.
Aksi takdirde, işlem önceliği 0.5'tir.
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.
<!-- 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>
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.
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.
| Önceki | Yukarı | Sonraki |
| İfadeler | Bir Linux Kitaplığı Sayfası | İsimli Örneklenimler |