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İfadesi
nin 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 |