Copyright © 1999 W3C® (MIT, INRIA, Keio), All Rights Reserved. W3C liability, trademark, document use and software licensing rules apply.
Bu çeviri de diğer belirtim çevirileri gibi bilgilendirici mahiyettedir, hiçbir bağlamda belirleyici değildir. Bu belge anadili Türkçe olan Genel ağ kullanıcılarının bu belirtim hakkında fikir edinebilmelerini sağlamak amacıyla Türkçeye çevrilmiştir. Bu belirtimin belirleyici tek sürümü W3C tarafından yayımlanan İngilizce sürümüdür.
Telif Hakkı © 1999 W3C® (MIT, INRIA, Keio), Tüm hakları saklıdır. W3C sorumluluk reddi, ticari marka, belge kullanımı ve yazılım lisanslama kuralları uygulanır.
Bu belirtim, XML belgeleri başka XML belgelere dönüştürmekte kullanılan bir dil olan XSLT'nin sözdizimini ve anlamlandırmasını tanımlar.
XSLT, XML için bir biçembent (İng: stylesheet) dili olan XSL'nin bir parçası olarak kullanılmak üzere tasarlanmıştır. XSL, biçimleme belirtmek için XSLT'ye ilaveten bir XML söz varlığına sahiptir. XSL, bir XML belgenin, biçimleme söz varlığını kullanan başka bir XML belgeye nasıl dönüştürüleceğini açıklayan XSLT'yi kullanarak XML belgenin biçemini belirtir.
XSLT, ayrıca, XSL'den bağımsız olarak kullanmak için de tasarlanmışsa da bir genel amaçlı XML dönüşüm dili olarak düşünülmemiştir. Daha çok, asıl olarak XSLT XSL'nin parçası olarak kullanıldığında gereken dönüşüm çeşitleri için tasarlanmıştır.
Bu belge W3C üyeleri ve diğer ilgili taraflarca gözden geçirilmiş ve W3C Yönetimi tarafından bir W3C Önergesi olarak onaylanmıştır. Kararlı bir belge olup başka belgelerden uyulması gerekli bir kaynak olarak atıfta bulunarak veya bir başvuru malzemesi olarak kullanılabilir. W3C'nin Önergedeki rolü, belirtime dikkatleri çekmek ve geniş bir alanda kullanımını yaygınlaştırmaktır. Bu, Web'in işlevselliğini ve birlikte çalışabilirliğini arttırmaktadır.
Bu belgede tespit edilmiş hatalar http://www.w3.org/1999/11/REC-xslt-19991116-errata adresinde listelenmiştir. Bunlardan 2 Kasım 2005'e (E39'a) kadar bilinen hatalarla ilgili değişiklikler çeviriye yansıtılmıştır.
Bu belirtimle ilgili yorumlar [email protected] adresine gönderilebilir; yorum arşivleri de mevcuttur. XSL'nin, XSLT'yi de içererek halka açık tartışma alanı olarak XSL-List eposta listesi vardır.
Bu belirtimin İngilizce sürümü uyulması gerekli tek sürümdür. Bununla birlikte bu belgenin (bilgilendirici mahiyette) çevirileri de mevcuttur.
W3C Önergelerinin ve diğer teknik belgelerinin bir listesi http://www.w3.org/TR adresinde bulunabilir.
Bu belirtim W3C Biçem etkinliğinin bir parçası olarak üretilmiştir.
1 Giriş
2 Biçembent Yapısı
2.1 XSLT İsim-alanı
2.2 stylesheet Elemanı
2.3 Birebir Hedef Eleman olarak Biçembent
2.4 Nitelikli Adlar
2.5 İleriye Uyumlu İşlem
2.6 Biçembentlerin Birleştirilmesi
2.6.1 Biçembentlerin İçerilmesi
2.6.2 Biçembent İthali
2.7 Gömülü Biçembentler
3 Veri Modeli
3.1 Kök Düğümün Çocukları
3.2 Temel Tanım-yeri
3.3 Çözümlenmemiş Öğeler
3.4 Boşluk Ayıklama
3.5 XML Sürümü
4 İfadeler
5 Örneklenim Kuralları
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ı
6 İsimli Örneklenimler
7 Hedef Ağacın Oluşturulması
7.1 Elemanların ve Özniteliklerin Oluşturulması
7.1.1 Birebir Hedef Elemanlar
7.1.2 Elemanların xsl:element ile Oluşturulması
7.1.3 Özniteliklerin xsl:attribute ile Oluşturulması
7.1.4 İsimli Öznitelik Kümeleri
7.2 Metin Oluşturma
7.3 İşlem Yönergelerinin Oluşturulması
7.4 Açıklamaların Oluşturulması
7.5 Kopyalama
7.6 Üretilen Metnin Hesaplanması
7.6.1 Metnin xsl:value-of ile Üretilmesi
7.6.2 Öznitelik Değeri Örneklenimleri
7.7 Numaralama
7.7.1 Sayıdan Dizgeye Dönüşüm Öznitelikleri
8 Yineleme
9 Koşullu İşlem
9.1 xsl:if ile Koşullu İşlem
9.2 xsl:choose ile Koşullu İşlem
10 Sıralama
11 Değişkenler ve Değergeçler
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ı
12 Ek İşlevler
12.1 Çok Kaynaklı Belgeler
12.2 Anahtarlar
12.3 Sayı Biçimleme
12.4 Çeşitli Ek İşlevler
13 İletiler
14 Eklentiler
14.1 Eklenti Elemanlar
14.2 Eklenti İşlevler
15 Son Çare
16 Çıktı
16.1 XML Çıktılama Yöntemi
16.2 HTML Çıktılama Yöntemi
16.3 Metin Çıktılama Yöntemi
16.4 Çıktı Önceleniminin İptal Edilmesi
17 Uyumluluk
18 Gösterim
A Kaynakça
A.1 Uyulması Gerekenler
A.2 Diğerleri
B Elemanların Özet Sözdizimleri
C XSLT Biçembentlerinde DTD Bölümü (Bilgilendirici)
D Örnekler (Bilgilendirici)
D.1 Belge Örneği
D.2 Veri Örneği
E Teşekkür (Bilgilendirici)
F Önerge Adaylığından beri Değişenler (Bilgilendirici)
G XSLT'nin gelecek sümlerinde ele alınacak özellikler (Bilgilendirici)
Bu belirtim, XSLT dilinin sözdizimini ve anlamlandırmasını tanımlar. XSLT dilinde bir dönüşüm, XSLT tarafından tanımlanmış olsun olmasın bütün elemanları içererek, [XML Adları] veya [XML Adları 1.1] İsim-alanları Önergesine uygun ve iyi biçimlenmiş bir [XML] veya [XML 1.1] belge olarak ifadesini bulur. Kolaylık olsun diye, XML 1.0 ve XML Adları 1.0 Önergelerine atıf yapılmıştır. Bu bakımdan, tek biçimli tanım-yeri başvuruları kullanılmışsa da uluslararası tanım-yeri başvuruları da ayrıca desteklenebilir. Bazı durumlarda XML 1.0 ve XML 1.1 tanımları tamamen aynı olabilir. XSLT tarafından tanımlanmış elemanlar belli bir XML isim-alanına karşılık olmakla diğerlerinden ayrılırlar (bkz, XSLT İsim-alanı); bu belirtimde bu isim-alanından XSLT isim-alanı olarak bahsedilecektir. Bu belirtim aynı zamanda, XSLT isim-alanı sözdiziminin ve anlamlandırmasının bir tanımıdır.
XSLT'de ifadesini bulan bir dönüşüm, bir kaynak ağacı bir hedef ağaca dönüştürecek kuralları açıklar. Dönüşüm, örüntüler örneklerle ilişkilendirilerek elde edilir. Bir örüntü kaynak ağacındaki elemanlarla eşleşirken, bir örnek hedef ağacın elemanlarını oluşturur. Hedef ağaç, kaynak ağaçtan ayrıdır. Hedef ağacın yapısı kaynak ağacın yapısından tamamen farklı olabilir. Hedef ağaç oluşturulurken, kaynak ağaçtaki elemanlar süzülebilir, yeni bir sırayla dizilebilir ve hatta ağaca tamamen keyfi bir yapı eklenebilir.
XSLT'de ifadesini bulan dönüşüme biçembent (İng: stylesheet) denir. Çünkü, XSLT'nin XSL biçimleme söz varlığına dönüştüğü durumda dönüşüm bir biçembent (biçem demeti) olarak iş görür.
Bu belge bir XSLT biçembendinin bir XML belgesi ile nasıl ilişkilendirileceğini açıklamaz. XSL işlemcilerinin [XML Stylesheet]'te açıklanan mekanizmayı desteklemeleri önerilir. Bu veya herhangi bir başka mekanizma, bir XML belgeye aynı anda uygulanacak bir XSLT biçembent silsilesinden oluştuğunda, etkisi, silsileyi oluşturan üyeleri aynı sırayla içeren (bkz, Biçembent İthali) tek bir biçembendin uygulanmasına eşit olmalıdır.
Bir biçembent, örneklenim kurallarından oluşan bir küme içerir. Bir örneklenim kuralı iki parçadan oluşur: kaynak ağacındaki düğümlere karşılık olan bir örüntü ve hedef ağacın biçimlenecek parçasının biçimleme örneğini içeren bir örneklenim (İng: template). Bu, bir biçembendin kaynak ağaç yapıları birbirine benzeyen geniş bir belge sınıfına uygulanabilmesini mümkün kılar.
Bir örneklenim, hedef ağacın bir bölümünü oluşturacak belli bir kaynak eleman için bir örneklenimdir. Bir örneklenim, hedef eleman yapısını birebir belirten elemanlar içerebileceği gibi, hedef ağaç yapısını oluşturacak yönergeler olarak XSLT isim-alanındaki elemanları da içerebilir. Bir örneklenim işleme sokulduğunda, içerdiği her yönerge yorumlanır ve oluşturacağı hedef ağaç bölümüyle değiştirilir. Yönergeler astsal kaynak elemanlarını seçebilir ve işleyebilir. Bir astsal elemanın işlenmesi, uygun örneklenim kuralının bulunması ve bu kuraldaki örneklenimin işleme sokularak hedef ağacın bir bölümünün oluşturulması anlamına gelir. Elemanların sadece bir yönergenin yorumlanmasıyla seçildikleri takdirde işleme sokulabileceğine dikkat ediniz. Hedef ağaç, kök düğümü için hazırlanmış örneklenim kuralı bulunup onun örneklenimi işleme sokularak oluşturulur.
Uygun örneklenim kuralını bulma işleminde, birden fazla örneklenim kuralı belirtilen elemanla eşleşen örüntüye sahip olabilir. Ancak, sadece bir örneklenim kuralı uygulanacaktır. Hangi örneklenim kuralının uygulanacağına karar verme yöntemi Şablon Kuralları için Uyuşmazlıkların Çözümlenmesi bölümünde açıklanmıştır.
Bir örneklenim tek başına oldukça güçlü sayılır: az veya çok karmaşıklıkta yapılar oluşturabilir; kaynak ağacın çeşitli yerlerindeki dizge değerlerini çekip çıkarabilir; elemanların kaynak ağaçta yer alışlarına bağlı olarak yinelenen yapılar üretebilir. Basit dönüşümler bakımından, hedef ağacın yapısı kaynak ağacın yapısından bağımsız olduğunda, bir biçembent çoğunlukla kaynak ağacın tamamı için işlem yapan tek bir örneklenimden meydana gelir. İçeriği verilerden oluşan XML belgeler üzerindeki dönüşümler çoğunlukla bu türdendir (bkz, Veri Örneği). XSLT bu tür biçembentler için basitleştirilmiş bir sözdizimi sağlar (bkz, Birebir Hedef Eleman olarak Biçembent).
Bir örneklenim işleme sokulduğunda daima bir geçerli düğüm ve bir geçerli düğüm listesi ile ilgili olarak işlem yapar. Geçerli düğüm daima geçerli düğüm listesinin bir üyesidir. XSLT'deki işlemlerin çoğu geçerli düğüme göredir. Pek az yönerge geçerli düğüm listesini veya geçerli düğümü değiştirir (bkz, Örneklenim Kuralları ve Yineleme); bu yönergeler işlem yaptığı sırada, geçerli düğüm listesi yerini yeni düğüm listesine bırakır; yani yeni listenin her üyesi geçerli düğüm haline gelir; yönergenin işi bittiğinde geçerli düğüm listesi veya geçerli düğüm tekrar yönerge öncesinde geçerli olan düğüm listesi ve düğüm olur.
XSLT metin üretmek ve koşullu işlemler için eleman seçerken [XPath] tarafından tanımlanmış ifade dilini kullanır.
XSLT, dili genişletmek için kullanıcı tarafından değiştirilerek kullanılmak üzere iki özellik sağlar, biri örneklenimlerde kullanılan yönerge elemanları kümesini, diğeri XPath ifadelerinde kullanılan işlev kümesini genişletir. Bu özelliklerin her ikisi de XML isim-alanlarına dayandırılmıştır. XSLT'nin bu sürümü bu özellikleri gerçeklemek için bir mekanizma tanımlamamıştır (bkz, Eklentiler).
XSLT tarafından tanımlanmış elemanların sözdizimlerini belirleyen eleman sözdizimi gösterim özeti Gösterim bölümünde açıklanmıştır.
XSLT biçembentleri için MIME ortam türleri olarak text/xml
ve
application/xml
[RFC2376] kullanılmalıdır. Özellikle XSLT biçembentleri için kayda geçirilmiş bir ortam türü olduğunda, bu ortam türü de kullanılabilir.
XSLT isim-alanı tanımı http://www.w3.org/1999/XSL/Transform
adresinde bulunmaktadır.
1999
ibaresi, bu tanım-yerinin (URI) W3C tarafından tahsis edildiği yılı belirtir. XSLT'nin kullanılmakta olan sürümünü göstermez (kullanılmakta olan XSLT sürümü özniteliklerle belirtilir (bkz, stylesheet Elemanı ve Birebir Hedef Eleman olarak Biçembent).XSLT işlemcileri bu isim-alanındaki elemanları ve öznitelikleri tanımak için XML isim-alanları mekanizmasını [XML Adları] kullanmalıdır. XSLT isim-alanındaki elemanlar sadece biçembent içinde tanınırlar, kaynak belge içinde tanınmazlar. XSLT tarafından tanımlanmış elemanların tam listesi Elemanların Özet Sözdizimleri bölümündedir. Üreticiler XSLT isim-alanını yeni elemanlar ve öznitelikler ekleyerek genişletmemelidirler. Böyle bir genişletme yapılacaksa, bu ayrı bir isim-alanında yapılmalıdır. Ek yönerge elemanları için kullanılacak bir isim-alanı Eklenti Elemanlar bölümünde belirtilmiş olan eleman ekleme mekanizmasına göre tanımlanmalıdır.
Bu belirtimde, XSLT isim-alanındaki elemanlara atıfta bulunmak için xsl: öneki kullanılmıştır. Ancak, XSLT biçembentleri, XSLT isim-alanının tanım-yerine (URI) önek belirten bir isim-alanı bildirimi yaparak başka bir önek kullanmakta özgürdürler.
XSLT isim-alanındaki bir eleman XSLT isim-alanında bulunmayan bir özniteliği, boş olmayan bir isim-alanı tanım-yerine sahip öznitelik genişletilmiş ismi belirterek içerebilir. Böyle özniteliklerin varlığı, XSLT elemanlarının ve işlevlerinin bu belgede tanımlanmış davranışını değiştirmemelidir. Bu bakımdan, bir XSLT işlemci böyle öznitelikleri yoksaymakta daima özgürdür ve isim-alanı tanım-yerini bulamıyorsa bunları bir hata vermeksizin yoksaymalıdır. Bu tür özniteliklerle, örneğin, eşsiz tanıtıcılar, eniyileme ipuçları veya belgeleme içerilebilir.
XSLT isim-alanından bir eleman için, bu belgede o eleman için tanımlananlardan başka, boş isim-alanı tanım-yeri belirten genişletilmiş isimli özniteliklere sahip olmak bir hatadır.
stylesheet
Elemanı<xsl:stylesheet | eleman |
<xsl:transform | eleman |
Bir biçembent, bir XML belgede bir xsl:stylesheet elemanı tarafından ifade edilir. xsl:transform elemanı xsl:stylesheet elemanının yerine (eşanlamlı) kullanmak içindir.
Bir xsl:stylesheet elemanı, biçembendin gerekirdiği XSLT sürümünün belirtildiği bir version
özniteliğine sahip olmak zorundadır ve XSLT'nin bu sürümü için değeri 1.0
olmalıdır. Değer 1.0
olmadığı takdirde, ileriye uyumlu işlem kipi etkin olur (bkz, İleriye Uyumlu İşlem).
xsl:stylesheet elemanı şu elemanları içerebilir:
Bir xsl:stylesheet
elemanının çocuğu olan bir elemana tepe-seviyeden eleman denir.
Bu örnekte bir biçembendin yapısı gösterilmiştir. Üç nokta imleri (...
) içeriği veya öznitelik değerini betimler. Bu örnek olası elemanların her birinden sadece bir tane içeriyorsa da biçembentler bu elemanların birden fazlasını içerebileceği gibi hiç içermeyebilir de.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="..."/> <xsl:include href="..."/> <xsl:strip-space elements="..."/> <xsl:preserve-space elements="..."/> <xsl:output method="..."/> <xsl:key name="..." match="..." use="..."/> <xsl:decimal-format name="..."/> <xsl:namespace-alias stylesheet-prefix="..." result-prefix="..."/> <xsl:attribute-set name="..."> ... </xsl:attribute-set> <xsl:variable name="...">...</xsl:variable> <xsl:param name="...">...</xsl:param> <xsl:template match="..."> ... </xsl:template> <xsl:template name="..."> ... </xsl:template> </xsl:stylesheet>
xsl:stylesheetelemanının çocuklarının yer alış sırası hata takibi ve xsl:import elemanları dışında önemsizdir. Kullanıcılar elemanları istedikleri sırada kullanmakta özgürdürler ve biçembent oluşturma araçları, elemanların yer alış sırası üzerinde bir denetime sahip olmamalıdır.
Bundan başka, xsl:stylesheet elemanı XSLT isim-alanında bulunmayan elemanlar (isim-alanının tanım-yerine (URI) önek belirten bir isim-alanı bildirimi yaparak ve bu öneki isminde içererek) içerebilir. Bu tür üst seviyeden elemanların varlığı, XSLT elemanlarının ve işlevlerinin bu belgede tanımlanmış davranışını değiştirmemelidir; örneğin, çelişkileri çözümlemede farklı kuralların kullanıldığı xsl:apply-templates'ler belirten bu türden bir üst seviyeden elemana izin verilmemelidir. Dolayısıyla, bir XSLT işlemci bu türden üst seviyeden elemanları yoksaymakta daima özgürdür ve isim-alanı tanım-yerini bulamıyorsa bunları bir hata vermeksizin yoksaymalıdır. Bu tür elemanlar şunlar için gerekebilir:
Basitleştirilmiş sözdizimi, bir biçembentin kök düğüme denk gelen tek bir örneklenimle oluşturulmasını mümkün kılar. Yani, biçembentin kendisi hedef elemandan oluşabilir (bkz, Birebir Hedef Elemanlar). Böyle bir biçembent, içeriği birebir hedef eleman olan bir örneklenim kuralını içeren xsl:stylesheet elemanlı bir biçembente eşdeğerdir; örneklenim kuralı /
örüntüsü ile eşleşir. Örneğin,
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict"> <head> <title>Harcama Raporu Hülâsası</title> </head> <body> <p>Toplam Miktar: <xsl:value-of select="harcama-raporu/toplam"/></p> </body> </html>
ile
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict"> <xsl:template match="/"> <html> <head> <title>Harcama Raporu Hülâsası</title> </head> <body> <p>Toplam Miktar: <xsl:value-of select="harcama-raporu/toplam"/></p> </body> </html> </xsl:template> </xsl:stylesheet>
eşdeğerdir.
Bir biçembendin belge elemanı olan bir birebir hedef eleman, biçembendin gerektirdiği XSLT sürümünü belirten bir xsl:version özniteliğine sahip olmak zorundadır. XSLT'nin bu sürümü için bu değer 1.0
olup değer bir Sayı
olmalıdır. Diğer birebir hedef elemanlar ayrıca birer xsl:version özniteliğine sahip olabilir. xsl:version özniteliğinin değeri 1.0
olmadığı takdirde, ileriye uyumlu işlem kipi etkin olur (bkz, İleriye Uyumlu İşlem).
Bir biçembent olarak kullanıldığında bir birebir hedef elemanın içeriği, biçembendin içinde kullanılandakinden farklı değildir. Bu bakımdan, bir biçembent olarak kullanılmış olan bir birebir hedef eleman tepe-seviyeden elemanlar içeremez.
Bazı durumlarda, sistemin bir XML belgenin bir XSLT biçembendi olarak bir XSLT işlemcisi tarafından işlenmesinin gerektiğini anlamasının tek yolu XML belgenin kendisini incelemesi olabilir. Basitleştirilmiş sözdiziminin kullanılması bu süreci daha da zorlaştıracaktır.
bxd:version
özniteliği kullanmış olsun. Eğer bir belge hem bxd:version
hem de xsl:version özniteliklerine sahipse belgenin bir BXD işlemci tarafından mı yoksa bir XSLT işlemci tarafından mı işleneceği belli olmayacaktır.Diğer taraftan, böyle bir durumda, XSLT biçembendinde basitleştirilmiş sözdiziminin kullanılmaması gerekir. Bu durum, örneğin, içeriğini işlemek için iletinin MIME ortam türüne bakan bir alıcıya, bir XSLT biçembendinin text/xml
veya application/xml
MIME ortam türünde bir ileti olarak aktarıldığı bir durum olarak karşımıza çıkabilir.
Bir dahili XSLT nesnesinin ismi, özellikle bir isimli örneklenim (İsimli Örneklenimler), bir kip (Kipler), bir öznitelik kümesi (İsimli Öznitelik Kümeleri), bir anahtar (Anahtarlar), bir onluk sayı biçimi (Sayı Biçimleme), bir değişken veya değergeç (Değişkenler ve Değergeçler) birer NitelAd
olarak belirtilir. Eğer nitelikli ad bir öneke sahipse, önek bir tanım-yeri başvurusuna genişletilir; bu tanım-yerine başvurusuna genişletme işlemi, ismin yer aldığı öznitelik üzerinden etkili olan isim-alan bildirimleri kullanılarak yapılır.
Genişletilmiş isim ismin yerel kısmı ile nesne ismi olarak kullanılan ve boş olabilen bir tanım-yeri başvurusundan oluşur. Öntanımlı isim-alanı öneksiz isimler için kullanılMAZ.
Bir eleman ileriye uyumlu kipi kendisi, öznitelikleri, astsalları için şunlardan birinin varlığı halinde etkinleştirir:
version
özniteliği 1.0
'dan farklı bir xsl:stylesheet elemanıdır.1.0
'dan farklı bir değerde olan bir birebir hedef elemandır.Değeri 1.0
olan bir xsl:version özniteliğine sahip bir birebir hedef eleman ileriye uyumlu kipi kendisi, öznitelikleri, astsalları ve astsallarının öznitelikleri için etkinleştirmeyecektir.
Eğer bir eleman ileriye uyumlu kipte işlem yapıyorsa:
Eleman, bir tepe-seviyeden elemansa ve XSLT 1.0 böyle elemanlara tepe seviyeden elemanlar olarak izin vermiyorsa, eleman içeriğiyle birlikte yoksayılmalıdır.
Eleman bir örneklenim içindeyse ve XSLT 1.0 böyle elemanların bir örneklenim içinde bulunmasına izin vermiyorsa, eleman işleme sokulamadığı takdirde bir hata oluşmalı, aksi takdirde XSLT, eleman için Son Çare bölümünde belirtildiği gibi bir son çareye başvurmalıdır.
Eleman, XSLT 1.0 tarafından bir elemanın sahip olmasına izin verilmeyen bir özniteliğe sahipse ya da XSLT 1.0 tarafından bir seçimlik özniteliğin sahip olmasına izin verilmeyen bir değere sahip bir özniteliğe sahipse, öznitelik yoksayılmalıdır.
Bu bakımlardan, bir XSLT işlemci aşağıdaki biçembenti, bu belirtimde tanımlanmamış bir XSLT isim-alanından elemanlar içerse bile hatasız işleyebilmelidir.
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:choose> <xsl:when test="system-property('xsl:version') >= 1.1"> <xsl:yeni-heyecan-verici-1.1-özelliği/> </xsl:when> <xsl:otherwise> <html> <head> <title>XSLT 1.1 gerekli</title> </head> <body> <p>Bu biçembent XSLT 1.1 gerektiriyor.</p> </body> </html> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
terminate="yes"
özniteliği ile kullanabilir (bkz, İletiler). Örnek:<xsl:stylesheet version="1.5" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:etkili-yeni-1.1-bildirimi/> <xsl:template match="/"> <xsl:choose> <xsl:when test="system-property('xsl:version') < 1.1"> <xsl:message terminate="yes"> <xsl:text>Bu biçembent XSLT 1.1 gerektiriyor.</xsl:text> </xsl:message> </xsl:when> <xsl:otherwise> ... </xsl:otherwise> </xsl:choose> </xsl:template> ... </xsl:stylesheet>
Eğer bir ifade ileriye uyumlu kipte işlem yapan bir öznitelikte bulunuyorsa, XSLT işlemci ifadedeki bazı hatalar için şöyle davranmalıdır:
Eğer ifade XPath dilbilgisine göre izin verilen sözdizimine uygun değilse, ifade gerçekten değerlendirilemedikçe bir hata üretilmemelidir.
Eğer ifade XSLT kütüphanesinin bir parçası olmayan ve ismi öneksiz olan bir işlevi çağırıyorsa, işlev gerçekten çağrılamadıkça bir hata üretilmemelidir.
Eğer ifade bir işlevi, XSLT tarafından izin verilmeyen sayıda argümanla veya XSLT tarafından izin verilmeyen türdeki argümanlarla çağırıyorsa, işlev gerçekten çağrılamadıkça bir hata üretilmemelidir.
XSLT biçembentlerin birleştirilmesi için iki mekanizmaya sahiptir:
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:include href = tanım-yeri-başvurusu /> | eleman |
Bir XSLT biçembendi başka bir XSLT biçembendini bir xsl:include elemanı kullanarak içerebilir. xsl:include elemanı, değeri içerilecek biçembendin tanım-yerine bir başvuru olan bir href
özniteliğine sahiptir. Göreli bir tanım-yeri xsl:include elemanını içeren biçembendin tanım-yerine göre çözümlenir (bkz, Temel Tanım-yeri).
xsl:include elemanına sadece tepe-seviyeden bir eleman olarak izin verilir.
İçerme işlemi XML ağaç seviyesinde gerçekleşir. href
özniteliğinin değeriyle yeri belirlenen kaynak bir XML belge olarak ele alınır ve bu belgedeki xsl:stylesheet elemanının çocukları xsl:include elemanının yerine yerleştirilirler. İçerilen örneklenim kuralları ve tanımları işlem sırasını fiilen etkilemezler.
İçerilen biçembent Birebir Hedef Eleman olarak Biçembent bölümünde açıklanan basitleştirilmiş sözdizimini kullanıyor olabilir ve böyle bir durumda biçembent eşdeğer xsl:stylesheet elemanı ile aynı şekilde ele alınır.
Bir biçembendin doğrudan veya dolaylı kendi kendini içeriyor olması bir hatadır.
<xsl:import href = tanım-yeri-başvurusu /> | eleman |
Bir XSLT biçembendi başka bir XSLT biçembendini bir xsl:import elemanı kullanarak ithal edebilir. İthal edilen biçembentteki örneklenim kurallarının ve tanımlarının ithal eden biçembenttekilerin önüne geçmesi dışında ithal işlemi içerme işlemine (bkz, Biçembentlerin İçerilmesi) benzer; işlem aşağıda daha ayrıntılı olarak açıklanmıştır. xsl:import elemanı, değeri ithal edilecek biçembendin tanım-yerine bir başvuru olan bir href
özniteliğine sahiptir. Göreli bir tanım-yeri xsl:import elemanını içeren biçembendin tanım-yerine göre çözümlenir (bkz, Temel Tanım-yeri).
xsl:import elemanına sadece tepe-seviyeden bir eleman olarak izin verilir.
xsl:import elemanının çocukları, bir xsl:stylesheet elemanının diğer bütün çocuklarının ve varsa xsl:include elemanlarının herbirinin çocuklarının öncesine geçmelidir. xsl:include bir biçembendi içermek üzere kullanıldığında, içerilen belgedeki xsl:import elemanları yine yukarıya ama, içeren belgedeki xsl:import elemanlarının sonrasına gider. Örnek:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="article.xsl"/> <xsl:import href="bigfont.xsl"/> <xsl:attribute-set name="note-style"> <xsl:attribute name="font-style">italic</xsl:attribute> </xsl:attribute-set> </xsl:stylesheet>
xsl:import elemanları içeren bir biçembentin işlenmesi sırasında karşılaşılan xsl:stylesheet elemanları bir ithal ağaç olarak ele alınır. İthal ağaçtaki her xsl:stylesheet elemanı, içerdiği her xsl:import elemanı için bir ithal çocuğa sahip olur. xsl:include elemanları ithal ağaç oluşturulmadan önce çözümlenir. İthal ağaçtaki bir xsl:stylesheet elemanına, ithal ağacın çocuğu olarak işleme alınacak bir xsl:stylesheet elemanından önce ziyaret edilmiş diğer bir xsl:stylesheet elemanından daha düşük bir ithal önceliği tanınır. (Türkçesi, bir sülaledeki bir evlatlığın öz evlatları evlatlıklarından sonra ziyaret edilir.) Her tanımın ve örneklenim kuralının ithal önceliği kendini içeren xsl:stylesheet elemanına göre belirlenir.
Varsayalım,
İthal önceliği sırası D, B, E, C, A olacaktır.
Genel olarak, daha yüksek önceliğe sahip bir tanım veya örneklenim kuralı, daha düşük ithal önceliğine sahip bir tanım veya örneklenim kuralından öncelikli olur. Bu, her tanım veya örneklenim kuralı çeşidi için ayrı ayrı tanımlanır.
Bir biçembendin doğrudan veya dolaylı kendi kendini ithal ediyor olması bir hatadır. Bundan kaçınmak için, belli bir tanım-yeri ile bir biçembendin birden fazla yerde ithal edilmesi durumunda, biçembent özel olarak ele alınmaz. İthal ağaç, ithal edildiği her noktada ayrı bir xsl:stylesheet'e sahip olur.
Normalde bir biçembent, belge elemanı xsl:stylesheet elemanı olan eksiksiz bir XML belgedir. Buna rağmen, bir XSLT biçembenti başka bir kaynağa da gömülebilir. İki çeşit gömülüm mümkündür:
İkinci şeklini kolaylaştırmak için, xsl:stylesheet elemanının eşsiz bir betimleyici içeren bir ID özniteliğine sahip olması mümkün kılınmıştır.
id
işlevi ile kullanılabilmesi için gerçekten de ID türünden bir öznitelik olarak DTD'de bildirilmiş olması gerekir.Aşağıdaki örnekte xml-stylesheet
işlem yönergesinin [XML Stylesheet] bir belgenin kendi biçembendini içermesini mümkün kılmak için nasıl kullanılabileceği gösterilmiştir. Tanım-yeri başvurusunda xsl:stylesheet elemanının yeri olarak bölüm betimleyicili bir göreli tanım-yeri kullanılmıştır:
<?xml-stylesheet type="text/xml" href="#style1"?> <!DOCTYPE doc SYSTEM "doc.dtd"> <doc> <head> <xsl:stylesheet id="style1" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:import href="doc.xsl"/> <xsl:template match="id('foo')"> <fo:block font-weight="bold"> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="xsl:stylesheet"> <!-- ignore --> </xsl:template> </xsl:stylesheet> </head> <body> <para id="foo"> ... </para> </body> </doc>
XSLT tarafından kullanılan veri modeli, bu bölümdeki açıklananlar dışında XPath veri modeli ile aynıdır. XSLT aynı veri modelini kullanan kaynak, hedef ve biçembent belgeleri üzerinde işlem yapar. Aynı ağaca sahip herhangi iki XML belge XSLT'ye göre aynı belgedir.
Biçembentteki işlem yönergeleri ve açıklamalar yoksayılır: biçembent, ağacında ne işlem yönergesi (İng: processing instruction) ne de açıklama varmış gibi ele alınır.
Kök düğümün çocukları üzerindeki normal kısıtlamalar hedef ağaç için esnetilir. Hedef ağacın çocukları bir eleman düğümü için olası herhangi bir sırada olabilir. Özellikle, metin düğümü çocuklara sahip olabileceği gibi istenen sayıda eleman düğümü çocuğa sahip olabilir. xsl:output yöntemi (bkz, Çıktı) XML çıktı için kullanıldığında hedef ağacın iyi biçimlenmiş bir XML belgesi olması gerekmeyebilir; yine de, çıktı daima iyi biçimlenmiş haricen çözümlenebilir bir öğe olacaktır.
Kaynak ağacı iyi biçimlenmiş bir XML belge çözümlenerek oluşturulduğunda, kaynak ağacın kök düğümü, bir metin düğümüne sahip olmamak ve tek bir çocuk elemana sahip olmak gibi normal kısıtlamaları kendiliğinden yerine getirecektir. Kaynak ağacı, DOM kullanımı gibi başka bir yöntemle oluşturulduğunda geçerli kısıtlamalar kaynak ağaç için hedef ağaçtaki kadar esnektir.
Her düğümün kendisiyle ilişkili tanım-yerine o düğümün temel tanım-yeri denir ve göreli tanım-yerlerini mutlak tanım-yerleri haline getirmek için öznitelik değerlerini çözümlemekte kullanılır. Eğer bir eleman veya işlem yönergesi harici bir öğe içinde yer alıyorsa, bu elemanın veya işlem yönergesinin temel tanım-yeri harici öğenin tanım-yeri olur; aksi takdirde, temel tanım-yeri, belgenin tanım-yeridir. Belge düğümünün temel tanım-yeri belge öğesinin tanım-yeridir. Bir metin, açıklama, öznitelik veya bir isim-alanı düğümümünün temel tanım-yeri ise, ebeveyn düğümün temel tanım-yeridir.
Kök düğüm, belgenin DTD'sinde bildirilmiş her çözümlenmemiş öğe için tanım-yeri veren bir eşleme sahiptir. Tanım-yeri, öğe bildiriminde belirtilen sistem betimleyici ve genel betimleyiciden üretilir. XSLT işlemci, tanım-yerini üretmek için sistem betimleyicide belirtilen tanım-yerini bırakıp genel betimleyiciyi kullanabilir. Eğer XSLT işlemci tanım-yerini üretmek için genel betimleyiciyi kullanmıyorsa, sistem betimleyiciyi kullanmalıdır; eğer sistem betimleyici bir göreli tanım-yeri ise, temel tanım-yeri [RFC2396] olarak öğe bildirimini içeren kaynağın tanım-yerini kullanarak onu bir mutlak tanım-yeri olarak çözümlemelidir.
Kaynak belge veya biçembent belgesi için ağaç oluşturulup, XSLT tarafından bir şekilde işleme sokulmadan önce bazı metin düğümleri ayıklanabilir. Bir metin düğümü salt boşluk karakterlerini içeriyor olmadıkça asla ayıklanamaz. Metin düğümünün ayıklanması metin düğümünü ağaçtan siler. Ayıklama işleminde boşlukları korunması gereken elemanların isimlerinden oluşan bir küme girdi olarak alınır. Ayıklama işlemi biçembentlerin ve kaynak belgelerin her ikisine de uygulanır, ancak boşlukları korunması gereken elemanlar saptanırken uygulama farklı olur.
Aşağıdakilerin herhangi biri uygulanabiliyorsa bir metin düğümü korunur:
Metin düğümünün ebeveyninin eleman ismi boşlukları korunması gereken eleman isimleri arasındadır.
Metin düğümü en azından bir tane boşluk olmayan karakter içeriyordur. XML'deki gibi, bir boşluk karakteri #x20
, #x9
, #xD
veya #xA
olabilir.
Metin düğümünün bir üstsel elemanı preserve
değerli bir xml:space
özniteliğine sahiptir ve üstsel elemanları arasında default
değerli xml:space
özniteliğine sahip eleman hiç yoktur.
Aksi takdirde, metin düğümü ayıklanır.
xml:space
öznitelikleri ağaçtan ayıklanmaz.
xml:space
özniteliği belirtilmişse, bu uygulanır ve sonuç özniteliği içerir.Biçembentler bakımından, boşlukları korunması gereken eleman isimleri kümesi sadece xsl:text içerir.
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:strip-space elements = dizgecikler /> | eleman |
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:preserve-space elements = dizgecikler /> | eleman |
Kaynak belgeler için, boşlukları korunması gereken eleman isimleri tepe-seviyeden elemanlar olan xsl:strip-space ve xsl:preserve-space ile belirtilir.
Bir eleman isminin boşlukları korunması gereken isimler arasında bulunup bulunmadığı en iyi xsl:strip-space veya xsl:preserve-space elemanlarında belirtilmiş isimlerden saptanır. Bir eleman isminin boşlukları korunması gereken isimler arasında bulunması için gerek ve yeter koşul, bir xsl:preserve-space elemanında belirtilen isimlerden biri ile bir eşleşmenin varlığıdır. xsl:strip-space ve xsl:preserve-space elemanların ikisi de değeri boşluk ayraçlı AdSınaması
listesi olan birer elements
özniteliğine sahiptir; Bir elemanın bir xsl:strip-space veya xsl:preserve-space ile eşleşmesi AdSınamaları
ndan biri ile eşleşmesi demektir. Bir elemanın bir AdSınaması
ile eşleşmesi için gerek ve yeter koşul, AdSınaması
nın bir XPath düğüm sınaması olarak eleman için doğru olmasıdır. Birden fazla xsl:strip-space ve xsl:preserve-space elemanı ile eşleşme olduğu takdirde, en iyi eşleşen eleman, en iyi eşleşen AdSınaması
saptanarak bulunur. Bu saptama örneklenim kurallarındaki yöntemle aynıdır:
Önce, diğer eşleşmeden daha düşük ithal önceliğine sahip eşleşmeler yoksayılır.
Sonra, diğer eşleşmenin öntanımlı önceliğinden düşük öntanımlı öncelikli eşleşmeler yoksayılır.
Eğer bu yöntemle geriye birden fazla eşleşme kalırsa bu bir hatadır. Bir XSLT işlemci hatayı bildirebilir; eğer bildirmiyorsa, kalan eşleşmeler arasından biçembentte sona doğru yer alanını seçerek hatayı ortadan kaldırmalıdır.
Veri modeli, bir XML 1.0 belgeyi ([XML] ve [XML Adları] ile uyumlu) veya bir XML 1.1 belgeyi ([XML 1.1] ve [XML Adları 1.1] ile uyumlu) ifade edebilecek ve ikisi arasında bir ayrım yapmayacak yetenektedir. Bu bakımdan, ilke olarak, XSLT 1.0 bu XML sürümlerinden biri ile kullanılabilir; farklılık sadece, dönüşüme özel sınırların dışında, ya veri modeli metinsel XML'den (çözümlenerek) oluşturulurken ya da metinsel XML veri modelinden üretilirken (sırayla denk düşürerek) ortaya çıkar.
Veri modelinin oluşturulması bu belirtimin kapsamı dışındadır, dolayısıyla bir XSLT işlemcinin girdiyi bir XML 1.0 veya XML 1.1 belgeden ya da her ikisinden de kabul etmesi ile ilgili bir gereksinim yer almaz. Bu belge XML 1.0 veya XML 1.1 belgeleri çıktılama yeteneğini tanımlar. Ve yine, bir XSLT işlemcinin XML sürümlerinden birini veya ikisini de desteklemesi ile ilgili bir gereksinim yer almaz.
Kaynak belge ister XML 1.0 ister XML 1.1 olsun veri modeli aynı olduğundan, XSLT işleminin anlambilgisi kaynak belgenin XML sürümüne bağlı değildir. İlke olarak, tek bir dönüşümde kullanılan tüm girdi ve çıktı belgelerinin aynı XML sürümüne uygun olmasını gerektiren bir sebep yoktur.
XSLT, XPath [XPath] tarafından tanımlanmış ifade dilini kullanır. XSLT'de ifadeler aşağıdaki amaçlar dahil çeşitli amaçlarla kullanılırlar:
Bir ifade bir XPath İfade
sözdizimi ile eşleşmelidir.
İfadeler, XSLT tarafından tanımlanmış elemanların belirli özniteliklerinin değerlerinde ve öznitelik değeri örneklenimlerinde kaşlı ayraçların arasında karşımıza çıkarlar.
XSLT'de bağımsız (başka bir ifadenin parçası olmayan) bir ifadenin bağlamı şöyle oluşur:
Bağlam düğümü geçerli düğümden gelir.
Bağlam konumu, geçerli düğüm listesindeki geçerli düğümün konumundan gelir ve ilk konum 1'dir.
Bağlam boyu, geçerli düğüm listesinin boyutundan gelir.
Değişken bağıntıları, ifadeyi içeren özniteliğe sahip elemanın etki alanındaki bağıntılardır (bkz, Değişkenler ve Değergeçler).
İsim-alanı bildirimleri kümesi, ifadeyi içeren özniteliğe sahip elemanın etki alanındaki bildirimlerdir; bu, XML İsim-alanları Önergesi'nce [XML Adları] gereken xml
önekinin örtük bildirimini de içerir; öntanımlı isim-alanı (xmlns
tarafından bildirilmiş olarak) bu kümenin bir parçası değildir.
İşlev kütüphanesi, temel işlev kütüphanesine ek olarak Ek İşlevler bölümünde tanımlanmış işlevler ile Eklentiler bölümünde açıklanan ek işlevlerden oluşur; bir ifadeden bunlar dışında bir işleve çağrı bir hatadır.
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.
<!-- Grubu: yönerge --> <xsl:call-template name = nitelikli-ad > <!-- İçeriği: <xsl:with-param>* --> </xsl:call-template> | eleman |
Örneklenimler isimleriyle çağrılabilirler. Bir xsl:template elemanı bir name
özniteliği ile birlikte bir isimli örneklenim belirtir. name
özniteliğinin değeri bir NitelAd
olup Nitelikli Adlar bölümünde açıklandığı gibi yorumlanır. Bir xsl:template elemanının name
özniteliğine ek olarak bir de match
özniteliği olabilir ama bu gerekli değildir. xsl:call-template elemanı bir örneklenimi ismiyle çağırmak için kullanılır; çağrılacak örneklenimi belirtmek için name
özniteliğinin kullanımı zorunludur. xsl:apply-templates elemanının aksine, xsl:call-template geçerli düğümü veya geçerli düğüm listesini değiştirmez.
Bir xsl:call-template elemanı tarafından çağrıldığında match
, mode
ve priority
özniteliklerinin xsl:template üzerinde bir etkisi yoktur. Benzer şekilde, xsl:template elemanı xsl:apply-templates elemanı tarafından çağrıldığında name
özniteliğinin bir önemi yoktur.
Bir biçembentin aynı ithal önceliğine sahip birden fazla aynı isimde örneklenime sahip olması bir hatadır.
Bu bölümde hedef ağaç üzerinde düğümleri doğrudan oluşturan yönergeler açıklanmaktadır.
Bir örneklenimde, XSLT isim-alanına ait olmadığı gibi bir ek eleman da (bkz, Eklenti Elemanlar) olmayan bir eleman aynı genişletilmiş isimle bir eleman düğümü oluşturmak üzere nesnelleştirilir. Elemanın içeriği, oluşturulan eleman düğümünün içeriğini vermek için nesnelleştiren bir örneklenimdir. Oluşturulan eleman düğümü, biçembent ağacındaki eleman düğümünde mevcut ancak isimleri XSLT isim-alanından olmayan öznitelik düğümlerine sahip olacaktır.
Oluşturulan eleman düğümü, ayrıca biçembent ağacındaki eleman düğümünde mevcut olan isim-alanı düğümlerinin bir kopyasına sahip olacaktır; kopyanın içinde, dizgesel değeri XSLT isim-alanı tanım-yeri (http://www.w3.org/1999/XSL/Transform
), eklenti isim-alanı olarak bildirilmiş bir isim-alanı tanım-yeri (bkz, Eklenti Elemanlar) veya dışlanmış bir isim-alanı olarak belirtilmiş bir isim-alanı tanım-yeri olan isim-alanı düğümleri olmayacaktır. Bir isim-alanı tanım-yeri, xsl:stylesheet elemanının exclude-result-prefixes
özniteliği veya birebir hedef elemanın xsl:exclude-result-prefixes özniteliği kullanılarak, dışlanmış bir isim-alanı olarak belirtilir. Bu özniteliklerin ikisinin de değeri boş karakter ayraçlı isim-alanı önekleri listesidir. Öneklerin her birine bağlı isim-alanları birer dışlanmış isim-alanı olarak belirtilmiş olur. exclude-result-prefixes
veya xsl:exclude-result-prefixes özniteliğini taşıyan eleman üzerinde öneke bağlı bir isim-alanının olmayışı bir hatadır. Öntanımlı isim-alanı, isim-alanı önekleri listesine #default
dizgesi dahil edilerek dışlanmış bir isim-alanı olarak belirtilebilir. Bir isim-alanının dışlanmış bir isim-alanı olarak atanması, exclude-result-prefixes
veya xsl:exclude-result-prefixes özniteliğini taşıyan eleman biçembendin kök düğümü olmak üzere, biçembentin alt ağacı içinde etkilidir; kökü bir xsl:stylesheet elemanı olan bir alt ağaç, xsl:stylesheet elemanının çocukları tarafından içerilmiş veya ithal edilmiş bir biçembent içermez.
exclude-result-prefixes
özniteliğinde belirtilmesi hedef ağaçta gereksiz isim-alanı bildirimlerini ortadan kaldıracaktır.Bir birebir hedef elemanın bir özniteliğinin değeri bir öznitelik değeri örneklenimi olarak yorumlanır: kaşlı ayraçlar ({}
) içinde belirtilmiş ifadeler içerir.
Biçembent ağacında, hedef ağaçta bir isim-alanı tanım-yeri belirtmek için kullanılan bir isim-alanı tanım-yerine birebir isim-alanı tanım-yeri denir. Bu şunlara uygulanır:
biçembentte bir birebir hedef elemanın genişletilmiş isminde bir isim-alanı tanım-yerine,
biçembentte bir birebir hedef elemanında belirtilen bir özniteliğin genişletilmiş isminde bir isim-alanı tanım-yerine,
biçembentte bir birebir hedef elemanındaki bir isim-alanı düğümünün dizgesel değerine.
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:namespace-alias stylesheet-prefix = önek | "#default" result-prefix = önek | "#default" /> | eleman |
Bir biçembent xsl:namespace-alias elemanını başka bir isim-alanı tanım-yeri için takma ad olan bir isim-alanı tanım yerini bildirmek için kullanabilir. Bir birebir isim-alanı tanım-yeri başka bir isim-alanı tanım-yeri için bir takma ad olarak bildirildiğinde, hedef ağaçtaki isim-alanı tanım-yeri, birebir isim-alanı tanım-yerinin kendisi için değil onun için bir takma ad olacağı isim-alanı tanım-yeri olacaktır. xsl:namespace-alias elemanı, result-prefix
özniteliği tarafından belirtilen öneke bağlı isim-alanı tanım-yeri için bir takma ad olan stylesheet-prefix
özniteliği tarafından belirtilen öneke bağlı isim-alanı tanım-yerini bildirir. Bu bakımdan, stylesheet-prefix
özniteliği biçembentte görünecek isim-alanı tanım-yerini, result-prefix
özniteliği ise hedef ağaçta görünecek diğerinin karşılığı olan isim-alanı tanım-yerini belirtir. Öntanımlı isim-alanı (xmlns
ile bildirilen) bir önek yerine #default
kullanılarak belirtilebilir. Eğer bir isim-alanı tanım-yeri çok sayıda isim-alanı tanım-yeri için bir takma ad olarak bildirilmişse ithal önceliği en yüksek bildirim kullanılır. Birden fazla böyle bildirim olması bir hatadır. Bir XSLT işlemci hatayı bildirebilir; eğer bildirmiyorsa, en yüksek ithal öncelikli bildirimler arasından biçembendin sonlarına doğru yer alan birini seçerek hatadan kurtulmalıdır.
Birebir hedef elemanlar XSLT isim-alanı tanım-yerini kullanan eleman, öznitelik veya isim-alanı düğümleri oluşturmak için kullanıldıklarında, biçembendin bir takma ad kullanması gerekir. Örneğin,
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias"> <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/> <xsl:template match="/"> <axsl:stylesheet> <xsl:apply-templates/> </axsl:stylesheet> </xsl:template> <xsl:template match="block"> <axsl:template match="{.}"> <fo:block><axsl:apply-templates/></fo:block> </axsl:template> </xsl:template> </xsl:stylesheet>
biçembendi aşağıdaki biçimdeki bir belgeden bir biçembent üretecektir:
<elements> <block>p</block> <block>h1</block> <block>h2</block> <block>h3</block> <block>h4</block> </elements>
<!-- Grubu: yönerge --> <xsl:element name = { nitelikli-ad } | eleman |
xsl:element elemanı hesaplanmış bir isimle bir eleman oluşturmayı mümkün kılar. Oluşturulacak elemanın genişletilmiş ismi, zorunlu olan name
ile seçimlik olan namespace
öznitelikleri ile belirtilir. xsl:element elemanının içeriği oluşturulan elemanın çocukları ve öznitelikleri için bir örneklenimdir.
name
özniteliği bir öznitelik değeri örneklenimi olarak yorumlanır. Öznitelik değeri örnekleniminin nesnelleştirilmesinin sonucu olan dizgenin bir NitelAd
olmaması bir hatadır. Bir XSLT işlemci hatayı raporlayabilir; raporlamıyorsa, xsl:element elemanının nesnelleştirilmesinin sonucunu, baştaki öznitelik düğümleri hariç, xsl:element elemanının içeriğinin nesnelleştirilmesiyle oluşturulan düğüm silsilesi yaparak hatayı ortadan kaldırmalıdır. namespace
özniteliği kullanılmamışsa, NitelAd
, xsl:element elemanı için etkili olan isim-alanı bildirimleri (öntanımlı isim-alanı bildirimi dahil) kullanılarak bir genişletilmiş isme genişletilir.
Eğer namespace
özniteliği kullanılmışsa, o da ayrıca bir öznitelik değeri örneklenimi olarak yorumlanır. Öznitelik değeri örnekleniminin nesnelleştirilmesinin sonucu olan dizge bir tanım-yeri başvurusu olmalıdır. Dizgenin sözdizimsel olarak geçerli bir tanım-yeri başvurusu olmaması bir hata değildir. Eğer dizge boşsa, elemanın genişletilmiş ismi tanımsız isim-alanı tanım-yerine sahip olur. Aksi takdirde, dizge, oluşturulan elemanın genişletilmiş isminin isim-alanı tanım-yeri olarak kullanılır. NitelAd
'ın yerel kısmı, oluşturulan elemanın genişletilmiş isminin yerel kısmı olarak kullanılan name
özniteliği tarafından belirtilir.
XSLT işlemciler, oluşturulan elemanın XML olarak çıktılanması için kullanılan öneki seçerken, name
özniteliğinde belirtilen NitelAd
ın önekini kullanılır yapabilirler; yine de,bunun böyle olması gerekli değildir.
<!-- Grubu: yönerge -->
<xsl:attribute
name = { nitelikli-ad }
| eleman |
xsl:attribute elemanı biçembentteki birebir hedef elemanlar veya xsl:element gibi yönergeler tarafından oluşturulan hedef elemanlara öznitelikler eklemek için kullanılır. Özniteliğin genişletilmiş ismi belirtilmesi zorunlu name
özniteliği ile seçimlik namespace
özniteliği tarafından oluşturulur. Bir xsl:attribute elemanının nesnelleştirilmesi, hedef eleman düğümüne bir öznitelik düğümü ekler. xsl:attribute elemanının içeriği oluşturulan özniteliğin değeri için bir örneklenimdir.
name
özniteliği bir öznitelik değeri örneklenimi olarak yorumlanır. Öznitelik değeri örnekleniminin nesnelleştirilmesinin sonucu olan dizgenin bir NitelAd
olmaması veya xmlns
dizgesi olması bir hatadır. Bir XSLT işlemci hatayı raporlayabilir; raporlamıyorsa, özniteliği hedef ağaca eklemeyerek hatayı ortadan kaldırmalıdır. namespace
özniteliği kullanılmamışsa, NitelAd
, xsl:attribute elemanı için etkili olan isim-alanı bildirimleri (öntanımlı isim-alanı bildirimi hariç) kullanılarak bir genişletilmiş isme genişletilir.
Eğer namespace
özniteliği kullanılmışsa, o da ayrıca bir öznitelik değeri örneklenimi olarak yorumlanır. Öznitelik değeri örnekleniminin nesnelleştirilmesinin sonucu olan dizge bir tanım-yeri başvurusu olmalıdır. Dizgenin sözdizimsel olarak geçerli bir tanım-yeri başvurusu olmaması bir hata değildir. Eğer dizge boşsa, özniteliğin genişletilmiş ismi tanımsız isim-alanı tanım-yerine sahip olur. Aksi takdirde, dizge, oluşturulan özniteliğin genişletilmiş isminin isim-alanı tanım-yeri olarak kullanılır. NitelAd
'ın yerel kısmı, oluşturulan özniteliğin genişletilmiş isminin yerel kısmı olarak kullanılan name
özniteliği tarafından belirtilir.
XSLT işlemciler, oluşturulan özniteliğin XML olarak çıktılanması için kullanılan öneki seçerken, name
özniteliğinde belirtilen NitelAd
ın önekini kullanılır yapabilirler; yine de,bunun böyle olması gerekli değildir. Bu bakımdan,
<xsl:attribute name="xmlns:xsl" namespace="herneyse"> http://www.w3.org/1999/XSL/Transform </xsl:attribute>
hatalı olmasa da, bu işlem çıktıda bir isim-alanı bildirimi ile sonuçlanmayacaktır.
Bir özniteliğin bir elemana eklenmesi elemanın mevcut özniteliklerinden genişletilmiş ismi aynı olanını değiştirir.
Aşağıdakilerin hepsi hata ile sonuçlanır:
Bir elemana çocukları eklendikten sonra bir özniteliğin eklenmesi; gerçeklenimler bu hatayı bildirebilir ya da özniteliği yoksayabilirler.
Bir özniteliğin bir eleman olmayan bir düğüme eklenmesi; gerçeklenimler bu hatayı bildirebilir ya da özniteliği yoksayabilirler.
xsl:attribute elemanının nesnelleştirilmesi sırasında metin düğümlerinden farklı düğümlerin oluşturulması; gerçeklenimler bu hatayı bildirebilir ya da hatalı düğümleri içerikleriyle birlikte yoksayabilirler.
<xsl:attribute name="a">x y</xsl:attribute>
kodu şu çıktıyı üretecektir:
a="x
y"
(veya eşdeğeri bir karakter gönderimi ile). XML çıktı asla şöyle olamaz:
a="x y"
XML 1.0'ın öznitelik değerlerindeki satırsonu karakterlerini boşluk olarak normalleştirmesi fakat satır sonu karakterlerine yapılan gönderimleri normalleştirmemesi sebebiyle bu böyledir. Veri modelindeki öznitelik değerleri normalleştirme sonrası öznitelik değerleri olarak gösterilir. Eğer bir satırsonu karakteri çıktılanan ağaçtaki bir öznitelik değerinde bir karakter gönderimi olarak değilde kendisi olarak yer alıyorsa, ağaçtaki öznitelik değeri bir satırsonu değil de bir boşluk içerecek şekilde XML'in yeniden çözümlenerek ağacın doğru olarak çıktılanması gerekir.
<!-- Grubu: tepe-seviyeden-eleman -->
<xsl:attribute-set
name = nitelikli-ad
| eleman |
xsl:attribute-set elemanı bir isimli öznitelik kümesi tanımlar. name
özniteliği öznitelik kümesinin ismini belirtir. name
özniteliğinin değeri bir NitelAd
olup Nitelikli Adlar bölümünde açıklandığı gibi yorumlanır. xsl:attribute-set elemanının içeriği kümedeki öznitelikleri belirten sıfır veya daha fazla sayıda xsl:attribute elemanından oluşur.
Öznitelik kümeleri, bir xsl:element, xsl:copy (bkz, Kopyalama) veya xsl:attribute-set elemanının use-attribute-sets
özniteliğinde belirtilerek kullanılırlar. use-attribute-sets
özniteliğinin değeri öznitelik kümesi isimlerinin boşluk ayraçlı listesidir. Belirtilen her isim, Nitelikli Adlar bölümünde açıklandığı gibi yorumlanan birer NitelAd
olarak belirtilir. Bir use-attribute-sets
özniteliğinin belirtilmesi, özniteliğe sahip elemanın içeriğinin başlangıcında isimli öznitelik kümelerinin her birindeki özniteliklerin her biri için (use-attribute-sets
özniteliğinde belirtilen öznitelik isimleriyle aynı sırada) bir xsl:attribute elemanı belirtilmesine eşdeğerdir. use-attribute-sets
özniteliklerinin xsl:attribute-set elemanlarında doğrudan veya dolaylı olarak kendilerini öznitelik kümesi olarak kullanmaları bir hatadır.
Öznitelik kümeleri ayrıca bir birebir hedef elemanda da bir xsl:use-attribute-sets özniteliği belirterek kullanılabilir. xsl:use-attribute-sets özniteliğinin değeri öznitelik kümesi isimlerinin boşluk ayraçlı bir listesidir. xsl:use-attribute-sets özniteliği tarafından belirtilen xsl:attribute elemanlarından sonra ama asıl xsl:attribute elemanlarından önce yer alan xsl:attribute elemanları tarafından belirtilmiş gibi ele alınan birebir hedef elemanın kendi üzerindeki öznitelikler tarafından belirtilen ek kurallarla birlikte xsl:element üzerindeki use-attribute-sets
özniteliği ile xsl:use-attribute-sets özniteliği aynı etkiye sahiptir. Bu bakımdan, bir birebir hedef eleman için, bir xsl:use-attribute-sets özniteliğinde isimleri bulunan öznitelik kümelerindeki öznitelikler önce (ama kümelerin listede yer alış sırasına uygun olarak) eklenecektir; ardından birebir hedef elemanda belirtilen öznitelikler eklenecek; son olarak da, xsl:attribute elemanları tarafından belirtilen öznitelikler eklenecektir. Bir özniteliğin bir elemana eklenmesi, bu elemanın aynı isimdeki mevcut özniteliğini değiştirdiğinden, bu, öznitelik kümelerinde belirtilen öznitelikler, birebir hedef elemanın kendisinde belirtilen öznitelikler tarafından geçersiz kılınabilirler anlamına gelir.
Bir xsl:attribute-set elemanınındaki xsl:attribute elemanlarının her birindeki örneklenimler, öznitelik kümesinin her kullanılışında yeniden nesnelleştirilir; nesnelleştirme, aynı geçerli düğüm ve geçerli düğüm listesi kullanılarak, nesnelleştirme için use-attribute-sets
veya xsl:use-attribute-sets özniteliğini taşıyan eleman kullanılıyormuş gibi yapılır. Bununla birlikte, hangi değişken bağıntısının görünür (bkz, Değişkenler ve Değergeçler) olduğunu belirleyen use-attribute-sets
veya xsl:use-attribute-sets özniteliğini taşıyan elemandan ziyade biçembentteki xsl:attribute elemanının konumudur; bu bakımdan, sadece tepe-seviyeden xsl:variable ve
xsl:param elemanları ile bildirilen değişken ve değergeçler görünürdür.
Aşağıdaki örnekte title-style
isimli bir öznitelik kümesi oluşturulmakta ve bir örneklenim kuralında kullanılmaktadır:
<xsl:template match="chapter/heading"> <fo:block quadding="start" xsl:use-attribute-sets="title-style"> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:attribute-set name="title-style"> <xsl:attribute name="font-size">12pt</xsl:attribute> <xsl:attribute name="font-weight">bold</xsl:attribute> </xsl:attribute-set>
Bir özniteliğin aynı genişletilmiş isimle çok sayıda tanımı varsa bunlar birleştirilir. Yüksek ithal önceliğine sahip bir öznitelik, düşük ithal önceliğindeki bir özniteliğe göre önceliklidir. Aynı genişletilmiş isimle aynı özniteliği içeren iki öznitelik kümesinin, aynı genişletilmiş isim ve aynı öznitelikle daha yüksek ithal öncelikli bir üçüncünün yokluğunda aynı ithal önceliğine sahip olması bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, biçembentin sonuna doğru yer alan tanımlar arasından daha yüksek işlem önceliğine sahip olanını seçerek hatayı ortadan kaldırabilir. Bir öznitelik kümesinde belirtilen özniteliklerin yeri kümedeki öznitelikler bir birleşmeye konu olduklarında önem kazanır; öznitelik kümeleri kullanılırken bunun bir önemi yoktur. Bir xsl:attribute-set elemanının use-attribute-sets
özniteliğinde yer alan her öznitelik kümesi ismi için, aynı isimdeki bir öznitelik kümesinin bütün tanımlarının, use-attribute-sets
özniteliği, eşdeğeri olan xsl:attribute çocuk elemanlarıyla değiştirilmeden önce birleştirilmesi gerekir. Bir xsl:attribute-set elemanının use-attribute-sets
özniteliğinin eşdeğeri olan xsl:attribute çocuk elemanlarıyla, bu xsl:attribute-set elemanı, aynı genişletilmiş isimli başka bir xsl:attribute-set elemanı ile birleştirilmeden önce değiştirilmesi gerekir. xsl:attribute-set elemanları aynı genişletilmiş isimli olanlarla birleştirildiğinde, bir use-attribute-sets
özniteliğine değiştirilmek için eklenen her xsl:attribute çocuk elemanı, biçembentte gerçekten bir çocuk eleman olarak belirtilmiş gibi ele alınır.
Bir örneklenim ayrıca metin düğümleri de içerebilir. Bir örneklenimdeki her metin düğümünün boşluk karakterleri Boşluk Ayıklama bölümünde belirtildiği gibi ayıklandıktan sonra kalan dizgeyle hedef ağaçtaki metin düğümü oluşturulur. Bitişik metin düğümleri hedef ağaçta kendiliğinden birleşir.
Metnin ağaç seviyesinde işlendiğine dikkat ediniz. Bu bakımdan, bir örneklenimdeki <
imlenimi biçembent ağacında <
karakterini içeren bir metin düğümüyle gösterilecektir. Bu, hedef ağaç bir XML belge olarak çıktılandığında, hedef ağaçta (<
imlenimi -veya eşdeğeri karakter gönderimi- ile gösterilecek olan) <
karakterini içeren bir metin düğümü oluşturacaktır (Çıktı Önceleniminin İptal Edilmesi bölümünde belirtildiği gibi çıktı öncelenimi iptal edilmiş olmadıkça).
<!-- Grubu: yönerge -->
<xsl:text
| eleman |
Dizgesel sabit veri karakterleri bir xsl:text elemanında satır katlamaya konu olabilir. Satır katlama, boşluk karakterleri ayıklanarak (bkz, Boşluk Ayıklama) değiştirilebilir fakat karakterlerin XSLT işlemci tarafından sonradan nasıl elde edileceğine bir etkisi yoktur.
xml:lang
ve xml:space
öznitelikleri XSLT tarafından özel olarak ele alınmaz. Özellikle,xml:lang
veya xml:space
özniteliklerinin üretmesi gerekeni belirtmek doğrudan doğruya biçembent yazarının sorumluluğundadır;xml:lang
veya xml:space
özniteliğinin belirtilmesi bu özniteliklerin hedefte de yer almasına sebep olmayacaktır.<!-- Grubu: yönerge --> <xsl:processing-instruction name = { kısa-ad } > <!-- İçeriği: örneklenim --> </xsl:processing-instruction> | eleman |
xsl:processing-instruction elemanı, bir işlem yönergesi düğümü oluşturmak için nesnelleştirilir. xsl:processing-instruction elemanının içeriği işlem yönergesi düğümünün dizgesel değeri için bir örneklenimdir. xsl:processing-instruction elemanının, işlem yönergesi düğümünün ismini belirtmek için kullanımı zorunlu olan bir name
özniteliği vardır. name
özniteliğinin değeri bir öznitelik değeri örneklenimi olarak yorumlanır.
Örneğin, bu:
<xsl:processing-instruction name="xml-stylesheet"> href="book.css" type="text/css" </xsl:processing-instruction>
şu işlem yönergesini oluşturacaktır:
<?xml-stylesheet href="book.css" type="text/css"?>
name
özniteliğinin nesnelleştirilmesinin sonucu olan dizgenin hem bir KısaAd
hem de bir PIHedefi
olmaması bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, işlem yönergesini hedef ağaca ekleyerek hatayı ortadan kaldırabilir.
xsl:processing-instruction içeriğinin nesnelleştirilmesinin metin düğümünden farklı bir düğüm oluşturması bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, hatalı düğümleri içerikleriyle birlikte yoksayarak hatayı ortadan kaldırabilir.
xsl:processing-instruction içeriğinin nesnelleştirilme sonucunun ?>
dizgesini içermesi bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, ?
karakteri ile >
karakteri arasına bir boşluk yerleştirerek hatayı ortadan kaldırabilir.
<!-- Grubu: yönerge --> <xsl:comment> <!-- İçeriği: örneklenim --> </xsl:comment> | eleman |
xsl:comment elemanı hedef ağaçta bir açıklama oluşturmak için nesnelleştirilir. xsl:comment elemanının içeriği, açıklama düğümünün dizgesel değeri için bir örneklenimdir.
Örneğin, bu:
<xsl:comment>This file is automatically generated. Do not edit!</xsl:comment>
şu açıklamayı üretecektir:
<!--This file is automatically generated. Do not edit!-->
xsl:comment içeriğinin nesnelleştirilmesinin metin düğümünden farklı bir düğüm oluşturması bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, hatalı düğümleri içerikleriyle birlikte yoksayarak hatayı ortadan kaldırabilir.
xsl:comment içeriğinin nesnelleştirilme sonucunun --
dizgesini içermesi bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, -
karakterlerinin arasına bir boşluk yerleştirerek hatayı ortadan kaldırabilir.
<!-- Grubu: yönerge -->
<xsl:copy
| eleman |
xsl:copy elemanı, geçerli düğümün kopyalanmasını kolaylaştıran bir yol sağlar. xsl:copy elemanının nesnelleştirilmesi, geçerli düğümün bir kopyasını oluşturur. Geçerli düğümün isim-alanı düğümleri de kendiliğinden kopyalanır, fakat öznitelikler ve düğümün çocukları kendiliklerinden kopyalanmazlar. xsl:copy elemanının içeriği, oluşturulan düğümün öznitelikleri ve çocukları için bir örneklenimdir; içerik sadece özniteliklerin ve çocukların sahip olabileceği türdeki düğümler için nesnelleştirilir (örn, kök düğüm ve eleman düğümleri için).
xsl:copy elemanı bir use-attribute-sets
özniteliğine sahip olabilir (bkz, İsimli Öznitelik Kümeleri). Bu sadece eleman düğümleri kopyalanırken kullanılır.
Kök düğüm özel olarak ele alınır, çünkü hedef ağacın kök düğümü örtük olarak oluşturulur. Geçerli düğüm, kök düğüm olduğu takdirde, xsl:copy bir kök düğüm oluşturmayacak, sadece içerik örneklenimini kullanacaktır.
Örneğin, özdeşlik dönüşümü xsl:copy kullanılarak şöyle yazılabilir:
<xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template>
Geçerli düğüm bir öznitelik olduğunda, geçerli düğümle aynı isimde bir öznitelik oluşturmak için xsl:attribute kullanmak bir hata olsaydı, xsl:copy kullanmak da bir hata olurdu (bkz, Özniteliklerin xsl:attribute ile Oluşturulması).
Aşağıdaki örnekte, xml:lang
özniteliklerinin nasıl kolayca kaynaktan hedefe kopyalanabileceği gösterilmiştir. Bir biçembent şöyle bir isimli örneklenim tanımlasaydı:
<xsl:template name="apply-templates-copy-lang"> <xsl:for-each select="@xml:lang"> <xsl:copy/> </xsl:for-each> <xsl:apply-templates/> </xsl:template>
xml:lang
özniteliği kopyalanmak istendiği takdirde, bunun yerine:
<xsl:apply-templates/>
bu daha basit olurdu:
<xsl:call-template name="apply-templates-copy-lang"/>
Geçerli düğüm bir isim-alanı düğümü olduğu takdirde, kopyalama işlemi, hedef ağaçta içerilen düğüme bir isim-alanı düğümü ekler. Bunun içerildiği düğümün bir eleman olmaması bir hatadır; gerçeklenimler hatayı raporlayabilir veya isim-alanı düğümünü yoksayabilir. Bir isim-alanı düğümünü bir elemana çocuklarını veya özniteliklerini eklendikten sonra eklemek bir hatadır; gerçeklenimler hatayı raporlayabilir veya isim-alanı düğümünü yoksayabilir. Bir isim-alanı düğümünü, aynı isimde bir isim-alanına zaten sahip olan bir elemana eklemek, her iki isim-alanı düğümü aynı dizgesel değere sahip olmadıkça (bu durumda yineleme yok sayılır), bir hatadır. Bir isim-alanı düğümünü bir elemana eklemek, eğer isim-alanı düğümünün ismi tanımsızsa ve eleman bir tanımsız isim-alanı tanım-yerine sahipse, bir hatadır.
Bir örneklenim içinde, xsl:value-of elemanı üretilen metni hesaplamakta kullanılabilir; örneğin, metni kaynak ağaçtan çekip çıkarmak veya bir değişkene bir değer yerleştirmek için kullanılabilir. xsl:value-of elemanı bunu, select
özniteliğine değer olarak belirtilen bir ifade ile yapar. İfadeler ayrıca, birebir hedef elemanların öznitelikleri içinde kaşlı ayraçlarla ({}
) sarmalanarak kullanılabilir.
<!-- Grubu: yönerge -->
<xsl:value-of
select = dizgesel-ifade
| eleman |
xsl:value-of elemanı hedef ağaçta bir metin düğümü oluşturmak için nesnelleştirilir. Belirtilmesi zorunlu olan select
özniteliği bir ifade olup değerlendirilmesiyle elde edilen nesne string
işlevi çağrılmış gibi bir dizgeye dönüştürülür. Bu dizge oluşturulan metin düğümünün dizgesel değerini belirtir. Dizge boşsa bir metin düğümü oluşturulmaz. Oluşturulan metin düğümü bitişik metin düğümü komşuları ile birleşir.
xsl:copy-of elemanı bir düğüm kümesini bir dizgeye dönüştürmeksizin hedef ağaca kopyalamak için kullanılabilir. Daha fazla bilgi için Değişken ve Değergeçlerin Değerlerinin xsl:copy-of ile Kullanımı bölümüne bakınız.
Aşağıdaki örnekte, adı
ve soyadı
özniteliklerine sahip kişi
elemanından bir HTML paragrafı oluşturulmaktadır. Paragraf geçerli düğümün adı
ve soyadı
özniteliklerinin değerleri arasında bir boşluk karakteri içerecektir.
<xsl:template match="kişi"> <p> <xsl:value-of select="@adı"/> <xsl:text> </xsl:text> <xsl:value-of select="@soyadı"/> </p> </xsl:template>
Başka bir örnek olarak aşağıda aynı paragraf kişi
elemanının adı
ve soyadı
çocuk elemanlarının dizgesel değerleri ile oluşturulmaktadır.
<xsl:template match="kişi"> <p> <xsl:value-of select="adı"/> <xsl:text> </xsl:text> <xsl:value-of select="soyadı"/> </p> </xsl:template>
Aşağıdaki örnekte, her işlem
elemanı için metnin başına işlemin güvenlik seviyesini belirten bir paragraf yerleştirilmektedir. Burada, işleme uygulanacak güvenlik seviyesinin işlem
elemanının kendisindeki veya bir üstselindeki güvenlik
özniteliğinden elde edildiği kabul edilmektedir. Eğer birden fazla güvenlik
özniteliği belirtilmişse işleme en yakın elemanın güvenlik
özniteliğinin değeri kullanılmaktadır.
<xsl:template match="işlem"> <fo:block> <xsl:value-of select="ancestor-or-self::*[@güvenlik][1]/@güvenlik"/> </fo:block> <xsl:apply-templates/> </xsl:template>
Bir öznitelik değeri örneklenimi olarak yorumlanan bir öznitelik değerinde, örneğin, bir birebir hedef elemanın bir özniteliğinin değeri olarak, bir ifade kaşlı ayraçlar ({}
) arasında kullanılabilir. Öznitelik değeri örneklenimi, kaşlı ayraçlarla birlikte ifadenin yerine, ifadenin değerlendirilme sonucunun string
işlevi çağrılmış gibi bir dizgeye dönüştürülmesiyle elde edilen dizge yerleştirilerek nesnelleştirilir. Bir XSLT biçembendinde bir öznitelik değerindeki kaşlı ayraçların, öznitelik özellikle, bir öznitelik değeri örneklenimi olarak yorumlanan bir öznitelik olmadıkça özel bir anlamı yoktur; eleman sözdizimi özetinde, böyle özniteliklerin değeri kaşlı ayraçlarla sarmalanır.
xmlns
öznitelikleri de öznitelik değeri örneklenimi olarak yorumlanmaz; çünkü yorumlansaydı XML İsim-alanları Önergesi ile uyumluluk sağlanamazdı.Aşağıdaki örnekte, kaynak içeriğindeki photograph
elemanından bir img
hedef elemanı oluşturulmaktadır; img
elemanının src
özniteliğinin değeri image-dir
değişkeninin değerinden ve photograph
elemanının href
çocuğunun dizgesel değerinden hesaplanmakta; width
özniteliğinin değeri ise, photograph
elemanının size
çocuğunun width
özniteliğinin değerinden hesaplanmaktadır:
<xsl:variable name="image-dir">/images</xsl:variable> <xsl:template match="photograph"> <img src="{$image-dir}/{href}" width="{size/@width}"/> </xsl:template>
biçembendi ile
<photograph> <href>headquarters.jpg</href> <size width="300"/> </photograph>
kaynak içeriğinden hedef ağaçta
<img src="/images/headquarters.jpg" width="300"/>
düğümü elde edilmektedir.
Bir öznitelik değeri örneklenimi nesnelleştirildiğinde, ifadeyi sarmalayan kaşlı ayraçlar çifter çifter ise bunlar birer kaşlı ayraç olarak ele alınır. Bir öznitelik değeri örnekleniminin ifadesi içinde bir kapatan kaşlı ayracın yer alıp, ifadenin dışında kapatan kaşlı ayracın bulunmaması bir hatadır. Bir ifadedeki bir DizgeselSabit
içinde yer alan bir kapatan kaşlı ayraç ifadeyi sonlandıran kaşlı ayraç olarak ele alınmaz.
İfadelerin içindeki kaşlı ayraçlar tanınmazlar. Örneğin, buna
<a href="#{id({@ref})/title}">
izin verilmez. Yerine bunu kullanın:
<a href="#{id(@ref)/title}">
<!-- Grubu: yönerge --> <xsl:number | eleman |
xsl:number elemanı hedef ağaca biçimli bir numara yerleştirmek için kullanılır. Yerleştirilecek numara bir ifade tarafından belirtilir. Bu ifadeyi value
özniteliği içerir. İfadenin değerlendirilmesinin sonucu olan nesne number
işlevi çağrılmış gibi bir sayıya dönüştürülür. Sayının NaN, sonsuz veya 0.5'ten küçük olması bir hatadır; bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, sayıyı string
işlevi çağrılmış gibi dizgeye dönüştürüp hedef ağaca yerleştirerek hatayı ortadan kaldırmalıdır. Aksi takdirde, sayı bir tamsayıya yuvarlanır ve Sayıdan Dizgeye Dönüşüm Öznitelikleri bölümünde belirtilen öznitelikler kullanılarak bir dizgeye dönüştürülür; bu bağlamda, bu özniteliklerin her birinin değeri, bir öznitelik değeri örneklenimi olarak yorumlanır. Dönüşümden sonra, elde edilen dizge hedef ağaca yerleştirilir. Örneğin, aşağıda sıralı bir listenin üyeleri numaralanmaktadır:
<xsl:template match="items"> <xsl:for-each select="item"> <xsl:sort select="."/> <p> <xsl:number value="position()" format="1. "/> <xsl:value-of select="."/> </p> </xsl:for-each> </xsl:template>
Eğer value
özniteliği belirtilmezse, xsl:number elemanı geçerli düğümün kaynak ağacındaki konumuna karşılık gelen sayıyı bir numara olarak hedef ağaca yerleştirir. Aşağıdaki öznitelikler geçerli düğümün nasıl numaralanacağını denetler:
level
özniteliğinde kaynak ağacın hangi seviyelerde ele alınacağı belirtilir; değer olarak single
, multiple
veya any
belirtilebilir. single
değeri öntanımlı değerdir.
count
özniteliğinin değeri, bu seviyelerdeki hangi düğümlerin sayılacağını belirten bir örüntüdür. count
özniteliği belirtilmezse, geçerli düğümle aynı türdeki düğümle eşleşen örüntü öntanımlı değerdir; eğer geçerli düğüm bir genişletilmiş isme sahipse, öntanımlı örüntü geçerli düğümle aynı genişletilmiş isme sahip düğümle eşleşecektir.
from
özniteliğinin değeri, sayımın nereden başlatılacağını belirten bir örüntüdür.
Ek olarak, Sayıdan Dizgeye Dönüşüm Öznitelikleri bölümünde belirtilen öznitelikler, value
özniteliğinin belirtilmesi halinde sayıyı dizgeye dönüştürmek için kullanılırlar.
xsl:number elemanı önce level
, count
ve from
özniteliklerini kullanarak bir liste oluşturur:
level="single"
olduğu takdirde, count
örüntüsü ile eşleşen ancestor-or-self
dalındaki ilk düğüme gidilir ve count
örüntüsü ile eşleşen üstselin büyük kardeşinin numarası artı bir değerini içeren tek üyeli bir liste oluşturulur. Eğer böyle bir üstsel yoksa, boş liste oluşur. Eğer from
özniteliği belirtilmişse, sadece, from
örüntüsüyle eşleşen en yakın üstselin astsalları olan üstseller araştırılır. Burada büyük kardeşlerle, preceding-sibling
dalı kastedilmektedir.
level="multiple"
olduğu takdirde, geçerli düğümün, sırada kendisinin de bulunduğu, tüm üstsellerinin belge sırasına göre bir listesi oluşturulur; sonra, bu listeden count
örüntüsü ile eşleşen düğümler seçilir; ardından, listenin her düğümüne, count
örüntüsü ile eşleşen düğümün büyük kardeşinin numarası artı bir değeri eşlenir. Eğer from
özniteliği belirtilmişse, sadece, from
örüntüsüyle eşleşen en yakın üstselin astsalları olan üstseller araştırılır. Burada büyük kardeşlerle, preceding-sibling
dalı kastedilmektedir.
level="any"
olduğu takdirde, geçerli düğümü içeren kümeye ait olan düğümler artı count
örüntüsü ile eşleşen düğümler artı belgedeki sıraya göre geçerli düğümden önce yer alan her seviyeden (isim-alanı ve öznitelik düğümleri hariç) tüm düğümlerin sayısı toplamını içeren tek üyeli bir liste oluşturulur (başka bir deyişle, preceding
ve ancestor-or-self
dallarının üyelerinin hepsi). Hiç eşleşen düğüm yoksa, boş liste oluşur. from
özniteliği belirtilmişse, sadece geçerli düğümden önceki ilk düğümden sonraki düğümlerin from
örüntüsü ile eşleştiği varsayılır.
Bundan sonra, numara listesi Sayıdan Dizgeye Dönüşüm Öznitelikleri bölümünde belirtilen öznitelikler kullanılarak bir dizgeye dönüştürülür; bu bağlamda, bu özniteliklerin her birinin değeri, bir öznitelik değeri örneklenimi olarak yorumlanır. Dönüşümden sonra, elde edilen dizge hedef ağaca yerleştirilir.
Aşağıda numaralı bir listenin üyeleri numaralanmaktadır:
<xsl:template match="ol/item"> <fo:block> <xsl:number/><xsl:text>. </xsl:text><xsl:apply-templates/> </fo:block> <xsl:template>
Aşağıdaki iki kural başlık
elemanlarını numaralayacaktır. Anabölüm ve ekbölümlerden oluşan bir belgede, anabölümlerin ve ekbölümlerin bölümlere, bu bölümlerinde altbölümlere sahip olduğu düşünülerek, anabölümler 1, 2, 3; ekbölümler A, B, C; anabölüm bölümleri 1.1, 1.2, 1.3; ve ekbölüm bölümlerinin de A.1, A.2, A.3 biçiminde numaralanacakları düşünülmüştür.
<xsl:template match="başlık"> <fo:block> <xsl:number level="multiple" count="anabölüm|bölüm|altbölüm" format="1.1 "/> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="ekbölüm//başlık" priority="1"> <fo:block> <xsl:number level="multiple" count="ekbölüm|bölüm|altbölüm" format="A.1 "/> <xsl:apply-templates/> </fo:block> </xsl:template>
Aşağıdaki örnekte bir anabölüm içindeki notlar numaralanmaktadır:
<xsl:template match="not"> <fo:block> <xsl:number level="any" from="anabölüm" format="(1) "/> <xsl:apply-templates/> </fo:block> </xsl:template>
Aşağıdaki örnekte HTML'deki H4
elemanları üç parçalı bir madde başlığı ile numaralanmaktadır:
<xsl:template match="H4"> <fo:block> <xsl:number level="any" from="H1" count="H2"/> <xsl:text>.</xsl:text> <xsl:number level="any" from="H2" count="H3"/> <xsl:text>.</xsl:text> <xsl:number level="any" from="H3" count="H4"/> <xsl:text> </xsl:text> <xsl:apply-templates/> </fo:block> </xsl:template>
Aşağıdaki öznitelikler bir numara listesinin dizgeye dönüşümünü denetlemekte kullanılırlar. Numaralar sıfırdan büyük tamsayılardır. Özniteliklerin hepsi isteğe bağlıdır.
Ana öznitelik format
olup öntanımlı değeri 1
'dir. format
özniteliği bir dizgecik dizisine bölünmüştür; buradaki her dizgecik ya olası en çok sayıda abecesayısal karakterden ya da olası en çok sayıda abecesayısal olmayan karakterden oluşur. Abecesayısal, Unicode kategorileri Nd, Nl, No, Lu, Ll, Lt, Lm veya Lo olan karakterler anlamındadır. Abecesayısal dizgecikler (biçim dizgecikleri) listedeki her numara için kullanılacak biçimi belirtirler. Eğer ilk dizgecik bir abecesayısal olmayan dizgecikse, oluşturulacak dizge bu dizgecikle başlar; eğer son dizgecik bir abecesayısal olmayan dizgecikse, oluşturulacak dizge bu dizgecikle biter. İki biçim dizgesi arasında yer alan abecesayısal olmayan dizgecikler, listedeki numaraları birbirine bağlamakta kullanılan ayraçlardır. n'inci biçim dizgesi listedeki n'inci numarayı biçimlemekte kullanılır. Eğer biçim dizgeciklerinden daha fazla numara varsa, son biçim dizgeciği kalan numaraları biçimlemekte kullanılır. Hiç biçim dizgeciği yoksa, bütün numaraları biçimlemek için biçim dizgeciği olarak 1
kullanılır. Biçim dizgeciği 1 sayısını göstermekte kullanılacak dizgeciği belirtir. İlkinden sonraki her numara, önceki numaradan ayraç dizgeciği ile ayrılır. Bir ayraç dizgeciği yoksa . (nokta) kullanılır.
Biçim dizgecikleri, HTML 4.0'daki OL
elemanının type
özniteliği için izin verilen değerlerin bir üstkümesidir ve şöyle yorumlanır:
Eğer bir biçim dizgeciğinin son karakterinin onluk rakam değeri 1 (Unicode karakter varlığı veritabanında belirtildiği gibi) ise ve sondan önceki karakterlerin Unicode değeri son karakterin Unicode değerinden 1 azsa o zaman bu dizgeciğe göre biçimlenen herhangi bir sayının onluk gösterimi en az biçim dizgeciği uzunluğundadır. Bu bakımdan, 1
biçim dizgeciği 1 2 ... 10 11 12 ...
dizisini üretirken, 01
biçim dizgeciği 01 02 ... 09 10 11 12 ... 99 100 101
dizisini üretecektir.
A
biçim dizgeciği A B C ... Z AA AB AC...
dizisini üretir.
a
biçim dizgeciği a b c ... z aa ab ac...
dizisini üretir.
i
biçim dizgeciği i ii iii iv v vi vii viii ix x ...
dizisini üretir.
I
biçim dizgeciği I II III IV V VI VII VIII IX X ...
dizisini üretir.
Bunlar dışında herhangi bir biçim dizgeciği o dizgecikle başlayan bir dizi üretir. Bu numaralama dizisini desteklemeyen gerçeklenimler 1
biçim dizgeciğini kullanmalıdır.
Bir abecesayısal dizi numaralanırken, lang
özniteliği hangi dilin elifbasının kullanılacağını belirtir; xml:lang
[XML] ile aynı aralıktaki değerler kullanılır; hiç lang
değeri belirtilmemişse, dil, sistem ortamından saptanır. Gerçeklenimciler hangi dili desteklediklerini belgelemelidirler.
letter-value
özniteliği, harflerin kullanıldığı numaralama dizileri arasındaki belirsizliği ortadan kaldırır. Çoğu dilde, harflerin kullanıldığı numaralama dizileri başlıca iki çeşittir. Birinde, harflere abecesel sıraya göre sayısal değer atanırken, diğerinde sayısal değerler dildeki geleneksel anlamlandırmaya göre atanırlar. İngilizce'de bu iki çeşide ait biçim dizgecikleri a
ve i
'dir. Bazı dillerde dizilerin ilk üyesi aynıdır ve dolayısıyla biçim dizgeciği tek başına belirleyici olmaz. alphabetic
değeri abecesel sıralamayı, traditional
değeri ise diğer sıralamayı belirtir. Eğer letter-value
özniteliği belirtilmemişse, belirsizliğin nasıl çözümleneceği gerçeklenime bağlıdır.
grouping-separator
özniteliği onluk numaralama dizilerinde gruplama ayracı (binler ayracı gibi) olarak kullanılacak bir ayraç belirtilebilmesini ve isteğe bağlı olan grouping-size
özniteliği ise ile gruplama miktarının (normalde 3'tür) belirtilebilmesini mümkün kılar. Örneğin, grouping-separator=","
ve grouping-size="3"
belirtimi 1,000,000
biçiminde bir sayı üretecektir. Bu ikisinden biri tek başına kullanılırsa yoksayılır.
Bazı dönüşüm belirtimi örnekleri:
format="ア"
Katakana numaralaması belirtir
format="イ"
Katakana numaralamasını "iroha" sıralamasıyla belirtir
format="๑"
Tay rakamlı numaralama belirtir
format="א" letter-value="traditional"
İbranice "geleneksel" numaralama belirtir
format="ა" letter-value="traditional"
Gürcü tarzı numaralama belirtir
format="α" letter-value="traditional"
"klasik" Yunan numaralaması belirtir
format="а" letter-value="traditional"
eski Slav tarzı numaralama belirtir
<!-- Grubu: yönerge --> <xsl:for-each select = düğüm-kümesi-ifadesi > <!-- İçeriği: (<xsl:sort>*, örneklenim) --> </xsl:for-each> | eleman |
Sonucun düzenli bir yapıda olacağı biliniyorsa, örneklenimde doğrudan düğümleri seçmek daha kullanışlıdır. xsl:for-each yönergesi, select
özniteliğinde belirtilen ifadeye göre seçilen her düğümü nesnelleştiren bir örneklenim içerir. select
özniteliğinin kullanılması zorunludur. İfadeden bir düğüm kümesi elde edilmelidir. Örneklenim seçilen düğümleri birer geçerli düğüm olarak, tamamını da bir geçerli düğüm listesi olarak nesnelleştirir. Bir sıralama belirtilmedikçe düğümler belgedeki sıralarına göre işlenirler (bkz, Sıralama).
Örneğin, bir XML belge şu yapıda olsun:
<müşteriler> <müşteri> <isim>...</isim> <sipariş>...</sipariş> <sipariş>...</sipariş> </müşteri> <müşteri> <isim>...</isim> <sipariş>...</sipariş> <sipariş>...</sipariş> </müşteri> </customers>
Aşağıdaki kod her müşteri
elemanı için bir satır bulunan bir tablo içeren bir HTML belge oluşturacaktır:
<xsl:template match="/"> <html> <head> <title>Müşteriler</title> </head> <body> <table> <tbody> <xsl:for-each select="müşteriler/müşteri"> <tr> <th> <xsl:apply-templates select="isim"/> </th> <xsl:for-each select="sipariş"> <td> <xsl:apply-templates/> </td> </xsl:for-each> </tr> </xsl:for-each> </tbody> </table> </body> </html> </xsl:template>
XSLT'de bir örneklenim içinde koşullu işlemi destekleyen iki yönerge vardır: xsl:if ve xsl:choose. xsl:if yönergesi basit if-then koşullu işlemi içindir; xsl:choose yönergesi ise çeşitli olasılıklardan birinin seçilebilmesini sağlar.
<!-- Grubu: yönerge --> <xsl:if test = mantıksal-ifade > <!-- İçeriği: örneklenim --> </xsl:if> | eleman |
xsl:if elemanı ifade belirtmekte kullanılan bir test
özniteliğine sahiptir. İfade değerlendirildikten sonra elde edilen sonuç boolean
işlevinin yaptığı gibi bir mantıksal değere dönüştürülür. Eğer sonuç doğruysa, elemanının içeriğindeki örneklenim nesnelleştirilir; aksi takdirde, hiçbir şey yapılmaz. Aşağıdaki örnekte, bir isim grubundaki isimler bir virgül ayraçlı liste haline getirilmektedir:
<xsl:template match="isimlistesi/isim"> <xsl:apply-templates/> <xsl:if test="not(position()=last())">, </xsl:if> </xsl:template>
Bu örnekte bir tablonun satırları birer atlayarak sarıya boyanmaktadır:
<xsl:template match="item"> <tr> <xsl:if test="position() mod 2 = 0"> <xsl:attribute name="bgcolor">yellow</xsl:attribute> </xsl:if> <xsl:apply-templates/> </tr> </xsl:template>
<!-- Grubu: yönerge --> <xsl:choose> <!-- İçeriği: (<xsl:when>+ | <xsl:otherwise>?) --> </xsl:choose> | eleman |
<xsl:when test = mantıksal-ifade > <!-- İçeriği: örneklenim --> </xsl:when> | eleman |
<xsl:otherwise> <!-- İçeriği: örneklenim --> </xsl:otherwise> | eleman |
xsl:choose elemanı bir miktar olasılık arasından uygun olanını seçer. Bir veya daha fazla sayıda xsl:when elemanı ile varlığı isteği bağlı olan xsl:otherwise elemanını içerebilir. Her xsl:when elemanının bir ifade belirtmekte kullanılan tek bir test
özniteliği vardır. xsl:when ve xsl:otherwise elemanlarının içerikleri birer örneklenimdir. Bir xsl:choose elemanı işleme sokulduğunda, xsl:when elemanlarının içerdiği ifadeler sırayla değerlendirilip elde edilen sonuçlar boolean
işlevinin yaptığı gibi birer mantıksal değere dönüştürülerek denenir. xsl:when elemanlarından doğru sonucu veren ilkinin içeriği nesnelleştirilir, diğerlerine bakılmaz. Eğer hiçbir xsl:when elemanı doğru sonuç vermemişse, xsl:otherwise elemanının içeriği nesnelleştirilir. Eğer hiçbir xsl:when elemanı doğru sonuç vermemişse ve xsl:otherwise elemanı da yoksa hiçbir nesnelleştirme yapılmaz.
Aşağıdaki örnekte, alt listeleri de olan sıralı bir listenin üyeleri, alt liste derinliğine bağlı olarak arap rakamları, harfler ve yunan rakamları kullanılarak numaralanmaktadır:
<xsl:template match="orderedlist/listitem"> <fo:list-item indent-start='2pi'> <fo:list-item-label> <xsl:variable name="level" select="count(ancestor::orderedlist) mod 3"/> <xsl:choose> <xsl:when test='$level=1'> <xsl:number format="i"/> </xsl:when> <xsl:when test='$level=2'> <xsl:number format="a"/> </xsl:when> <xsl:otherwise> <xsl:number format="1"/> </xsl:otherwise> </xsl:choose> <xsl:text>. </xsl:text> </fo:list-item-label> <fo:list-item-body> <xsl:apply-templates/> </fo:list-item-body> </fo:list-item> </xsl:template>
<xsl:sort | eleman |
Sıralama, bir xsl:apply-templates veya xsl:for-each elemanının çocukları olarak xsl:sort elemanları kullanılarak belirtilir. İlk xsl:sort birincil sıralama anahtarını, ikincisi ikincil olanını belirtir ve bu böyle çoğaltılabilir. Bir xsl:apply-templates veya xsl:for-each elemanının çocukları olarak bir veya daha fazla sayıda xsl:sort elemanı olduğu takdirde, seçilen düğümler belgedeki sıralarına göre değil, sıralama anahtarları ile belirtilen sıraya göre işlenirler. xsl:sort elemanları xsl:for-each elemanında kullanıldıklarında, ilk çocuklar olmalıdırlar. Bir örneklenimin xsl:apply-templates veya xsl:for-each elemanı tarafından nesnelleştirilmesi halinde, geçerli düğüm listesinin düğümleri xsl:sort elemanları tarafından belirtilen sıraya göre sıralanırlar.
xsl:sort elemanının bir ifade belirtmekte kullanılan bir select
özniteliği vardır. İşlenen her düğüm için, düğüm geçerli düğüm kabul edilerek ve işlenen bütün düğümler için, belgedeki sırasıyla bu düğümlerin tamamı geçerli düğüm listesi kabul edilerek ifade değerlendirilir. Elde edilen nesne string
işlevinin yaptığı gibi bir dizgeye dönüştürülür; bu dizge düğüm için sıralama anahtarı olarak kullanılır. select
özniteliğini öntanımlı değeri .
olup, sıralama anahtarı olarak geçerli düğümün dizgesel değerinin kullanılmasına sebep olur.
Bu dizge düğüm için bir sıralama anahtarı işlevini görür. Aşağıdaki isteğe bağlı öznitelikler xsl:sort üzerinde sıralama anahtarları listesinin nasıl sıralanacağını denetlerler; bu özniteliklerin değerleri birer öznitelik değeri örneklenimi olarak yorumlanır.
order
özniteliği dizgelerin artan sırada mı yaksa azalan sırada mı sıralanacaklarını belirtir; ascending
değeri sıralamanın artan sırada olacağını belirtirken, descending
azalan sıralamada olacağını belirtir. ascending
değeri öntanımlı değerdir.
lang
özniteliği sıralama anahtarları için dil belirtir; değeri [XML] xml:lang
değerlerinden biri olmalıdır; lang
özniteliği kullanılmamışsa, geçerli dil sistem ortamından elde edilmelidir.
data-type
özniteliği dizgelerin veri türünü belirtir; şu değerlere izin verilir:
text
değeri, sıralama anahtarlarının lang
tarafından belirtilen dil için kültürel olarak doğru sözlük sırasında olacağını belirtir.
number
değeri, sıralama anahtarları sayıya dönüştürüldükten sonra sıralamanın sayısal değerlerine göre olacağını belirtir; her sıralama anahtarı number
işlevinin yaptığı gibi birer sayıya dönüştürülür; lang
özniteliği yoksayılır; bir NaN değeri artan sırada sayılardan önceye, azalan sırada sayılardan sonraya yerleştirilir.
Bir önekle birlikte bir NitelAd
, Nitelikli Adlar bölümünde açıklandığı gibi bir genişletilmiş isme genişletilir; genişletilmiş isim veri türünü belirtir; bu durumda davranışın ne olacağı bu belgede belirtilmemiştir.
Öntanımlı değer text
'tir.
case-order
özniteliği upper-first
veya lower-first
değerine sahip olabilir; data-type="text"
ve artan sıra belirtildiğinde, büyük harflerin mi yoksa küçük harflerin mi önce geleceğini belirtirler. Örneğin, lang="en"
için case-order="upper-first"
olduğunda sıralama A a B b
, case-order="lower-first"
olduğunda ise a A b B
şeklinde olur. Azalan sıra için herşey tersine olur. Örneğin, lang="en"
için case-order="upper-first"
olduğunda sıralama b B a A
, case-order="lower-first"
olduğunda ise B b A a
şeklinde olur. Öntanımlı değer dile bağlıdır.
Sıralama kararlı olmalıdır: sıralı düğüm listesinde sıralama anahtarı belirtilmiş her alt listenin üyelerinin belgedeki sıraya göre eş sırada ele alınmaları gerekir.
Örneğin, şu biçimde düzenlenmiş bir çalışanlar veritabanımız olsun:
<çalışanlar> <çalışan> <isim> <önadı>James</önadı> <soyadı>Clark</soyadı> </isim> ... </çalışan> </çalışanlar>
İsme göre sıralı çalışanlar listesini üretecek kod şöyle olurdu:
<xsl:template match="çalışanlar"> <ul> <xsl:apply-templates select="çalışan"> <xsl:sort select="isim/soyadı"/> <xsl:sort select="isim/önadı"/> </xsl:apply-templates> </ul> </xsl:template> <xsl:template match="çalışan"> <li> <xsl:value-of select="isim/önadı"/> <xsl:text> </xsl:text> <xsl:value-of select="isim/soyadı"/> </li> </xsl:template>
<!-- Grubu: tepe-seviyeden-eleman -->
<!-- Grubu: yönerge -->
<xsl:variable
name = nitelikli-ad
| eleman |
<!-- Grubu: tepe-seviyeden-eleman -->
<xsl:param
name = nitelikli-ad
| 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 NitelAd
a 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.
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.
Bir değişken atama elemanı bir değişken değerini üç yoldan biriyle belirtebilir.
Değişken atama elemanı bir select
özniteliğine sahipse, bu özniteliğin değeri, değerlendirilmesinin sonucunda değişkenin değeri haline gelecek olan bir nesnenin elde edileceği bir ifade olmalıdır. Bu durumda, değişken atama elemanının içeriği boş olmalıdır.
Değişken atama elemanı bir select
özniteliğine sahip değilse ve eleman boş olmayan bir içeriğe sahipse (yani, değişken atama elemanı bir veya daha fazla sayıda çocuk elemana sahipse), değeri değişken atama elemanının içeriği belirler. Değişken atama elemanının içeriği, değişkenin değerini vermek üzere nesnelleştirilecek olan örneklenimdir. Değeri, çocukları örneklenimin nesnelleştirilmesiyle üretilen düğümlerden oluşan tek bir kök düğüm içeren bir düğüm kümesine eşdeğer bir hedef ağaç bölümüdür. Hedef ağaç bölümündeki düğümlerin temel tanım-yeri (URI), değişken atama elemanının temel tanım-yeridir.
Örneklenim nesnelleştirilerek elde edilen düğümlerin bir üyesinin bir öznitelik düğümü veya bir isim-alanı düğümü olması, bir kök düğüm böyle bir çocuk düğüme sahip olamayacağından, bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, öznitelik veya isim-alanı düğümünü hedef ağaca eklemeyerek hatayı ortadan kaldırabilir.
Değişken atama elemanı boş bir içeriğe sahipse ve bir select
özniteliği de belirtilmemişse, değişkenin değeri bir boş dizge olacaktır. Bu bakımdan,
<xsl:variable name="x"/>
buna eşdeğerdir:
<xsl:variable name="x" select="''"/>
<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]"/>
<xsl:param name="x" select="/.."/>
<!-- 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.
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>
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>
<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.
<xsl:with-param
name = nitelikli-ad
| 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 NitelAd
dı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>
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.
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:
Bölüm betimleyici bir XSLT düğüm kümesi tarafından ifade edilemeyecek şeyleri betimliyordur (örneğin, bir metin düğümündeki bir karakter aralığı).
XSLT işlemci tanım-yerinden alınıp getirilen özkaynağın ortam türüne özgü bölüm betimleyiciyi desteklemiyordur. Bir XSLT işlemcinin her ortam türünü desteklemesi gerekmez. XSLT işlemcinin belgeleri, XSLT işlemcinin hangi ortam türlerini desteklediğini açıklamalıdır.
Ö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.
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.
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:
ID türündeki öznitelikler örneğin DTD gibi bir yerde bildirilmelidir. Eğer bir ID özniteliği bir ID türünden öznitelik olarak sadece harici bir DTD altkümesinde bildirilmişse, bu öznitelik sadece, eğer XML işlemci bu harici DTD altkümesini okursa bir ID türünde öznitelik olarak tanınacaktır. Ancak, XML Önergesi, XML işlemcilerin harici DTD altkümelerini okumasını bir zorunluluk değil, bir öneri olarak belirtir.
Bir belge eşsiz ID'lerin tek bir kümesine sahip olabilir. Ayrı ayrı bağımsız eşsiz ID kümeleri olamaz.
Bir elemanın ID'si sadece bir öznitelikte belirtilebilir; elemanın içeriğinde veya bir çocuk eleman tarafından belirtilemez.
Bir ID bir XML adı olmak zorundadır. Örneğin, boşluk içeremez.
Bir eleman en çok bir ID'ye sahip olabilir.
Belli bir ID'ye en çok bir eleman sahip olabilir.
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:
anahtarın sahibi olan düğüm
anahtarın ismi (bir genişletilmiş isim)
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:
Anahtarlar bir biçembentte xsl:key elemanları kullanılarak bildirilirler.
Bir anahtarın değerinden başka bir de ismi vardır; her anahtar ismi betimleyici uzayından bağımsız, ayrı bir isim olarak düşünülebilir.
Bir isimli anahtar değeri bir eleman için, uygun herhangi bir yerde belirtilebilir; örneğin bir öznitelikte, bir çocuk elemanda veya içerikte belirtilebilir. Belli bir isimli anahtar için bulunacak değerin yerini belirtmek için bir XPath ifadesi kullanılır.
Bir anahtarın değeri keyfi bir dizge olabilir; bir XML adı olmak zorunda değildir.
Bir belgede aynı düğümün farklı anahtar değerleri için aynı isimde çok sayıda anahtarı olabilir.
Bir belgede aynı anahtar ismine ve aynı anahtar değerine sahip çok sayıda farklı düğüm olabilir.
<!-- 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:
x düğümü, xsl:key elemanının match
özniteliğinde belirtilen örüntüyle eşleşir;
xsl:key elemanının name
özniteliğinin değeri y'ye eşit olup,
xsl:key elemanının use
özniteliğinde belirtilen ifade, bir u nesnesinden elde edilen bir geçerli düğüm listesindeki geçerli düğüm olarak x düğümüyle değerlendirildiğinde, z, ya u'nun string
işlevinin yaptığı gibi bir dizgeye dönüştürülmesinin sonucuna eşittir ya da u bir düğüm kümesi olup, z değeri de u'daki düğümlerin bir veya daha fazlasının dizgesel değerine eşittir.
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.
<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.
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>
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.
<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>
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.
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:decimal-format | 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:
decimal-separator
özniteliği ondalık ayraç olarak kullanılacak karakteri (Türkçe için virgüldür) belirtir; öntanımlı değer nokta (.
) karakteridir.
grouping-separator
özniteliği bölükleme için kullanılan (Türkçe için noktadır) karakteri belirtir (binler bölükleri gibi); öntanımlı değer virgül (,
) karakteridir.
percent
özniteliği yüzde imi olarak kullanılacak karakteri (Türkçe için de % karakteridir ama sayının ardına değil önüne konur) belirtir; öntanımlı değer yüzde (%
) karakteridir.
per-mille
özniteliği her-milde-bir karakteri olarak kullanılacak karakteri; öntanımlı değer Unicode her-milde-bir (#x2030
) karakteridir.
zero-digit
özniteliği sıfır ratamı olarak kullanılacak karakteri belirtir; öntanımlı değer sıfır (0
) rakamıdır.
Aşağıdaki öznitelikler biçim örüntüsündeki karakterlerin yorumlanışını denetlerler:
digit
özniteliğinde biçim örüntüsünde rakam ifade eden karakter belirtilir; öntanımlı değer diyez (#
) karakteridir.
pattern-separator
özniteliğinde pozitif ve negatif alt örüntüleri ayırmakta kullanılan karakter belirtilir; öntanımlı değer noktalı virgül (;
) karakteridir.
Aşağıdaki öznitelikler biçimlenmiş sayıda yer alan karakterleri veya dizgeleri belirtmekte kullanılır:
infinity
özniteliğinde sonsuzluğu belirtmekte kullanılan dizge belirtilir; öntanımlı değer Infinity
dizgesidir.
NaN
özniteliğinde NaN (Not-a-Number: bir-Sayı-Değil) değerini belirtmekte kullanılan dizge belirtilir; öntanımlı değer NaN
dizgesidir.
minus-sign
özniteliğinde eksi imi olarak kullanılacak karakter belirtilir; öntanımlı değer tire (-
, #x2D) karakteridir.
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.
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.
<!-- Grubu: yönerge -->
<xsl:message
| eleman |
xsl:message yönergesi XSLT işlemcisine özgü bir yöntemle bir ileti gönderir. xsl:message yönergesinin içeriği bir örneklenimdir. xsl:message, bir XML bölümünü oluşturacak içerik nesnelleştirilerek nesnelleştirilir. Bu XML bölümü iletinin içeriğidir.
Eğer terminate
özniteliği yes
diye bir değere sahipse, XSLT işlemcinin iletiyi gönderdikten sonra işlemi sonlandırması gerekir. Özniteliğin öntanımlı değeri no
'dur.
Yerelleştirmenin uygun tek yolu, yerelleştirilmiş bilgiyi (ileti metni, vs.) bir XML belgeye koymaktır (biçembente ek bir girdi dosyası haline gelmek üzere).
resources/tr.xml
dosyasında şu biçimde tutulduğunu varsayalım:<messages> <message name="problem">Bir cisim yaklaşıyor.</message> <message name="error">Bir sorun saptandı.</message> </messages>
Bu veri modelinden hareketle bir biçembentte aşağıdaki gibi bir yerelleştirme yaklaşımında bulunulabilir:
<xsl:param name="lang" select="'tr'"/> <xsl:variable name="messages" select="document(concat('resources/', $lang, '.xml'))/messages"/> <xsl:template name="localized-message"> <xsl:param name="name"/> <xsl:message> <xsl:value-of select="$messages/message[@name=$name]"/> </xsl:message> </xsl:template> <xsl:template name="problem"> <xsl:call-template name="localized-message"/> <xsl:with-param name="name">problem</xsl:with-param> </xsl:call-template> </xsl:template>
XSLT iki çeşit eklentiye izin verir: eklenti elemanlar ve eklenti işlevler.
XSLT'nin bu sürümü eklentilerin gerçeklenimlerini tanımlayan bir mekanizma sağlamaz. Bu yüzden, bir XSLT biçembendinin XSLT işlemciler arasında taşınabilir olması gerekiyorsa, böyle eklentileri kullanmaması gerekir. XSLT, bir XSLT biçembendinin, bir XSLT işlemcinin belli bir eklentiye desteği olup olmadığını saptamasını, eğer yoksa ne olacağını belirtilmesini sağlayacak mekanizmaları sağlar. Eğer bir XSLT biçembendi bu mekanizmaları kullanmakta dikkatliyse, eklentilerin getirilerinden yararlanması mümkün olacak ve herhangi bir XSLT gerçeklenimi ile hala çalışabilecektir.
Eleman eklenti mekanizması isim-alanlarının eklenti isim-alanları olarak tasarlanmasını mümkün kılar. Bir isim-alanı bir eklenti isim-alanı olarak tasarlanmışsa ve bu isim-alanından bir eleman bir örneklenimde yer alıyorsa, bu eleman bir birebir hedef eleman olmaktan ziyade bir yönerge olarak ele alınır. İsim-alanı yönergenin anlambilgisini belirler.
Bir isim-alanı, bir eklenti isim-alanı olarak xsl:stylesheet elemanının extension-element-prefixes özniteliği veya bir birebir hedef elemanın xsl:extension-element-prefixes özniteliği ya da eklenti elemanı kullanılarak belirtilebilir. Bu özniteliklerin ikisi de önekleri boşluk ayraçlı bir liste olarak kabul ederler. Bu öneklerin herbiri bir eklenti isim-alanı olarak atanır. extension-element-prefixes
veya xsl:extension-element-prefixes özniteliğinde belirtilmiş bir önek için bir isim-alanı bildiriminin olmaması bir hatadır. Öntanımlı isim-alanı (xmlns
ile bildirilen) önek listesinde #default
ismiyle bir eklenti isim-alanı olarak belirtilebilir. Bir isim-alanının eklente isim-alanı olarak atanması extension-element-prefixes
veya xsl:extension-element-prefixes özniteliğinin kullanıldığı elemanın kökü olduğu alt ağaçta etkilidir; bir xsl:stylesheet elemanının kökü olduğu bir alt ağaç ithal edilmiş veya içerilmiş bir biçembent içermez.
Eğer bir XSLT işlemci belli bir eklenti elemanının gerçeklenimine sahip değilse, element-available
işlevi bu eleman ismi için olumsuz sonuç döndürmelidir. Böyle bir eklenti elemanı nesnelleştirildiğinde XSLT işlemci Son Çare bölümünde bahsedildiği gibi bir son çareye başvurmalıdır. Bir XSLT işlemci bir örneklenim gerçeklenmemiş bir eklenti elemanı içermekte olduğundan böyle bir durumda sadece bir hata rapor etmekle kalmamalıdır.
Eğer bir XSLT işlemci belli bir eklenti elemanının gerçeklenimine sahipse, element-available
işlevi bu eleman ismi için olumlu sonuç döndürmelidir.
Eğer bir İşlevÇağrısı
ifadesindeki bir İşlevAdı
bir KısaAd
değilse (yani, bir ikinokta imi içeriyorsa), bir eklenti işlev çağrısı olarak ele alınır. İşlevAdı
değerlendirme bağlamındaki isim-alanı bildirimi killanılarık bir isme genişletilir.
Eğer bir XSLT işlemci belli bir eklenti işlevinin gerçeklenimine sahip değilse, function-available
işlevi bu eleman ismi için olumsuz sonuç döndürmelidir. Böyle bir eklenti işliv bir ifade içinde kullanılmış ve bu işlev çağrılmışsa, XSLT işlemci bunu bir hata olarak bildirmelidir. Bir XSLT işlemci bir ifade gerçeklenmemiş bir eklenti işlev içermekte olduğundan böyle bir durumda sadece bir hata rapor etmekle kalmamalıdır.
Eğer bir XSLT işlemci belli bir eklenti işlevinin gerçeklenimine sahipse, function-available
işlevi bu eleman ismi için olumlu sonuç döndürmelidir. Böyle bir eklenti çağrılmışsa, XSLT işlemci işlevi argümanlarıyla birlikte gerçeklenime aktarmalı ve ve gerçekleniminin döndürdüğü sonucu işlev çağrısının sonucu olarak döndürmelidir.
<!-- Grubu: yönerge --> <xsl:fallback> <!-- İçeriği: örneklenim --> </xsl:fallback> | eleman |
Normalde, bir xsl:fallback elemanı nesnelleştirmesi hiçbir şey yapmaz. Ancak, bir XSLT işlemci bir yönerge elemanı için bir son çareye başvurma durumunda kalırsa ve o yönerge elemanının bir veya daha fazla sayıda xsl:fallback çocuğu varsa, bu xsl:fallback çocuklarının her birinin sırayla nesnelleştirilmesi gerekir; aksi takdirde, bir hata bildirimi yapılmalıdır. xsl:fallback elemanının içeriği bir örneklenimdir.
Eğer belli bir işlev veya eleman kullanılabilir değilse bir biçembentin nasıl davranacağını denetlemek için aşağıdaki işlevler xsl:choose ve xsl:if yönergeleriyle kullanılabilir.
mantıksal-değer element-available(dizge) | İşlev |
Argüman bir NitelAd
olarak değerlendirilmeli ve ifade etki alanındaki isim-alanı bildirimi kullanılarak bir genişletilmiş isime genişletilmeidir. Eğer etki alanında bir öntanımlı isim-alanı varsa, NitelAd
ın öneksiz bir isim olarak yorumlanmasında kullanılır. element-available
işlevinin doğru sonucunu döndürmesi için gerek ve yeter koşul genişletilmiş ismin bir yönerge ismi olmasıdır. Eğer genişletilmiş ismin isim-alanı tanım-yeri, XSLT'ninkiyle aynıysa bu isim XSLT tarafından tanımlanmış bir elemana ait demektir. Aksi takdirde, bir eklenti elemandır. Eğer genişletilmiş ismin isim-alanı tanım-yeri tanımsızsa, element-available
işlevi olumsuz sonuç döndürecektir.
mantıksal-değer function-available(dizge) | İşlev |
Argüman bir NitelAd
olarak değerlendirilmeli ve ifade etki alanındaki isim-alanı bildirimi kullanılarak bir genişletilmiş isime genişletilmeidir. function-available
işlevinin doğru sonucunu döndürmesi için gerek ve yeter koşul genişletilmiş ismin işlev kütüphanesindeki bir işlevin ismi olmasıdır. Eğer genişletilmiş isim tanımlı bir isim-alanına sahipse, isim bir eklenti işleve ati demektir, aksi takdirde XPath vya XSLT tarafından tanımlanmış bir işleve aittir.
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:output | eleman |
Bir XSLT işlemci hedef ağacı bir bayt dizisi olarak çıktılayabilir (böyle olması gerekmese bile; Uyumluluk bölümüne bakınız). xsl:output elemanı biçembent yazarına hedef ağacın nasıl çıktılanmasını istediğini belirtebilme imkanı verir. Eğer bir XSLT işlemci hedef ağacı çıktılıyorsa, bu, xsl:output elemanı tarafından belirtilmiş demektir; ancak bunun böyle olması gerekli değildir.
xsl:output elemanına sadece bir tepe-seviyeden eleman olarak izin verilir.
The method
özniteliğinde hedef ağacın çıktılanma yöntemi belirtilir. Değer bir NitelAd
olmalıdır. Eğer bu NitelAd
bir önek içermiyorsa, bu belgede belirtilmiş yöntemlerden biri olarak ele alınır ve xml
, html
veya text
değerlerinden biri olmalıdır. Eğer bu NitelAd
bir önek içeriyorsa, Nitelikli Adlar bölümünde açıklandığı gibi bir genişletilmiş isime genişletilir; genişletilmiş isim çıktılama yöhtemini belirtir; bu durumdaki davranışın ne olacağı bu belgede belirtilmemiştir.
method
özniteliği için öntanımlı davranış şöyle seçilir. Eğer,
hedef ağacın kök düğümünün çocuğu varsa,
hedef ağacın kök düğümünün (yani, belge elemanının) ilk çocuğunun genişletilmiş isminin yerel kısmı html
(büyük/küçük harflerin herhangi bir birleşimi olarak) ise ve isim-alanı tanım-yeri tanımsızsa ve
hedef ağacın kök düğümünün ilk çocuğunu önceleyen metin düğümleri sadece boşluk karakterlerinden oluşuyorsa,
öntanımlı çıktılama yöntemi html
olacaktır; aksi takdirde xml
'dir. Öntanımlı çıktılama yöntemi eğer bir xsl:output elemanı belirtilmemişse veya xsl:output elemanı method
özniteliksiz belirtilmişse kullanılmalıdır.
xsl:output elemanının diğer öznitelikleri çıktılama yönteminin parametreleridir. Şu özniteliklere izin verilir:
version
çıktılama yönteminin sürümünü belirtir.
indent
XSLT işlemcinin hedef ağacı çıktılarken, boşluk karakterleri ekleyebileceğini belirtir; değer, ekleyebilecekse yes
aksi takdirde no
olmalıdır.
encoding
, XSLT işlemci karakter dizilerini bayt dizileri olarak çıktılarken kullanacağı karakter kodlaması için tercihi belirtirken kullanılır; değerin harf büyüklüğünün bir önemi yoktur; değer sadece [#x21-#x7E] aralığındaki karakterleri (yani basılabilir ASCII karakterleri) içerebilir; değer ya Genel Ağ Atanmış numaralar Yetkilisi [IANA] tarafından kayda geçirilmiş karakter kümelerinden biri olmalı yoksa X-
ile başlamalıdır.
media-type
ile hedef ağacın çıktılanmasının sonucu olan verinin ortam türü (MIME türü) belirtilir; karakter kümesi parametresi doğrudan belirtilmemeli; bunun yerin, tepe-seviyeden ortam türü text
olduğu takdirde, çıktılama yöntemi tarafından kullanılan asıl kodlamaya ait olan karakter kümesi parametresi eklenmelidir.
doctype-system
ile belge türü bildiriminde (DTD) kullanılan sistem betimleyici belirtilir.
doctype-public
ile belge türü bildiriminde (DTD) kullanılan genel betimleyici belirtilir.
omit-xml-declaration
ile XSLT işlemcinin bir XML bildirimi çıktılayıp çıktılamayacağı belirtilir; XML bildiriminin çıktılanması isteniyorsa değer yes
, aksi takdirde no
olmalıdır.
standalone
ile XSLT işlemcinin bir tekbaşına belge bildirimi çıktılayıp çıktılamayacağı belirtilir; tekbaşına belge bildiriminin çıktılanması isteniyorsa değer yes
, aksi takdirde no
olmalıdır.
cdata-section-elements
özniteliği, CDATA bölümleri halinde çıktılanacak metin düğümü çocukları olan elemanların isimlerini liste halinde belirtmek için kullanılır.
Her özniteliğin her çıktılama yöntemi için anlamı ayrı ayrı çıktılama yöntemlerinin açıklamalarında açıklanacaktır. Çıktılama yöntemi açıklamalarında yer verilmemiş öznitelikler o çıktılama yöntemi için uygulanabilir değillerdir.
Bir biçembent çık sayıda xsl:output elemanı içerebileceği gibi, ithal ettiği veya içerdiği biçembentlerin her birinde de çok sayıda xsl:output elemanı olabilir. Bir biçembentte yer alan tüm xsl:output elemanları tek bir etkin xsl:output elemanı olarak birleştirilir. cdata-section-elements
özniteliği için etkili değer belirtilmiş değerlerin birleşimidir. Diğer öznitelikler için etkili değer, en yüksek ithal önceliği ile belirtilmiş olan değerdir. Bir öznitelik için böyle birden fazla değerin varlığı bir hatadır. Bir XSKLT işlemci hatalı raporlayabilir, raporlamıyorsa, biçembentte son yer alan değeri kullanarak hatadan kurtulmalıdır. Özniteliklerin öntanımlı değerleri xsl:output elemanları birleştirildikten sonra saptanır; farklı çıktılama yöntemleri için bazı özniteliklerin öntanımlı değerleri farklı olabilir.
xml
çıktılama yöntemi, hedef ağacı bir iyi biçimli XML harici genel çözümlü öğe olarak çıktılar. Eğer hedef ağcın kök düğümü tek bir çocuk elemana sahipse ve hiç metin düğümü çocuğu yoksa, öğenin ayrıca iyi biçimli XML belge öğesi olması gerekir. Şunun gibi sıradan bir XML belge sarmalayıcı içindeki bir öğeye atıfta bulunurken,
<?xml version="xml-sürümü"?> <!DOCTYPE doc [ <!ENTITY e SYSTEM "öğenin-yeri"> ]> <doc>&e;</doc>
öğenin-yeri ile öğenin dosya sistemindeki yeri, xml-sürümü ile de öğenin XML sürümü belirtiliyorsa, atıfta bulunulan elemanın bir bütün olarak [XML Adları] veya [XML Adları 1.1] ile uyumlu bir iyi biçimli XML belge olması gerekir. Ek olarak, yeni ağaç, öğenin Veri Modeli bölümünde belirtildiği gibi bir XML belge olarak çözümlenmesiyle oluşmuşsa, belge elemanı kaldırıldıktan sonra, onun çocuklarını kök düğümün çocukları yaparak oluşturulan yeni ağaç aşağıdaki olasılıkların dışında hedef ağaçla aynı olacaktır:
Öznitelik ve isim-alanı düğümlerinin sırası iki ağaçta farklı olabilir.
yeni ağaç, hedef ağaçta mevcut olmayan isim-alanı düğümleri içerebilir.
Düğümlerin temel tanım-yerleri iki ağaçta farklı olabilir.
Eğer XSLT işlemci, doctype-system
özniteliği sebebiyle bir belge türü bildirimli veya standalone
özniteliği sebebiyle tekbaşına belge bildirimli çıktılama yapıyorsa, çıktının bir iyi biçimli XML belge olması ve yukarıdaki gereksinimlerin, herhangi bir sarmalayıcı olmaksızın, DTD'yi işleme sokmayan bir XML işlemci kullanılarak belgenin doğrudan çözümlenmesiyle oluşturulan ağaca uygulanması gerekir.
version
özniteliği hedef ağacı çıktılarken kullanılacak XML sürümünü belirtmek için kullanılır. Eğer XSLT işlemci bu XML sürümünü desteklemiyorsa, desteklediği XMl sürümünü kullanmalıdır. Eğer çıktı xML bildirimini içerecekse, bu bildirimde XSLT işlemcinin desteklediği sürüm numarasına karşı düşen çıktılama yapılmalıdır. Öntanımlı değer 1.0'dır. Eğer değer 1.1 ise ve XSLT işlemci XML 1.1 ve XML 1.1 için İsim-alanlarını destekliyorsa, çıktıya aşağıdaki kısıtlamalar uygulanır:
Bildirimsiz önekler yer almamalıdır
Unicode normalleştirmesi yer almamalıdır.
encoding
özniteliğiyle hedef ağacı çıktılamakta kullanılacak karakter kodlaması tercihi belirtilir. XSLT işlemcilerinin UTF-8
ve UTF-16
değerlerini kabul etmeleri gerekir. Diğer değerler için, eğer XSLT işlemci bunları desteklemiyorsa bunu hata olarak raporlayabiyir, raporlamıyorsa, UTF-8
veya UTF-16
kodlanmış çıktılama yapmalıdır. XSLT işlemci, [XML] ve [XML 1.1] önergelerinin KodlamaAdı
sözdizimi ile eşleşmeyen kodlama isimlerini kullanmaması gerekir. encoding
özniteliği kullanılmamışsa, XSLT işlemcinin UTF-8
veya UTF-16
kodlanmış çıktılama yapması gerekir.
Hedef ağacın, XSLT işlemcinin çıktılama için kullandığı kodlamada bulunmayan bir karakteri içermesi olasıdır. Bu durumda, eğer karakter XML'in karakter gönderimlerini tanıdığı bir bağlamda yer alıyorsa (örn, bir öznitelik değerinde veya bir metin düğümünde), karakterin bir karakter gönderimi olarak çıktılanması gerekir; aksi takdirde (örn, karakter bir eleman isminde yer alıyorsa), XSLT işlemci hatayı raporlamalıdır.
Eğer indent
özniteliği yes
değeri ile kullanılmışsa, xml
çıktılama yöntemi, sonucun göze hoş görünecek şekilde girintilenmesi için hedef ağaçta mevcut boşluk karakterlerine ek olarak (muhtemelen biçembent ve kaynak belgedeki boşluk ayıklamaya uygun olarak), ek boşluklar çıktılayabilir; eğer özniteliğin değeri olarak no
belirtilmişse, ilave bir boşluk çıktılanmayacaktır. Öntanımlı değer no
'dur. xml
çıktılama yöntemi ek boşlukları çıktılamak için bir algoritma kullanmalıdır; bu algoritma,
boşluklar çıktıdan ayıklanırken, sadece xsl:text elemanlarından oluşan boşlukları korunacak elemanlar listesiyle Boşluk Ayıklama bölümünde açıklandığı gibi ayıklanıyorsa, ek boşlukların çıktılanması ile çıktılanmaması arasında bir fark olmayacak şekilde çıktılamayı sağlamalıdır.
indent="yes"
kullanmak iyi sonuç vermeyecektir.cdata-section-elements
özniteliği boşluk ayraçlı olarak NitelAd
lardan oluşan bir liste içerebilir. Her NitelAd
yer aldığı xsl:output elemanında etkili olan isim-alanı bildirimleri kullanılarak bir genişletilmiş isme genişletilir; eğer bir öntanımlı isim-alanı varsa, öneksiz NitelAd
lar kullanılır. Genişletme işlemi çok sayıda xsl:output elemanı tek bir xsl:output elemanı olarak birleştirilmeden önce yapılır. Eğer bir metin düğümünün ebeveyninin genişletilmiş ismi bu listenin bir üyesiyse, metin düğümü bir CDATA bölümü olarak çıktılanacaktır. Örneğin,
<xsl:output cdata-section-elements="example"/>
yönergesi, biçembentte
<example><foo></example>
veya
<example><![CDATA[<foo>]]></example>
olarak yer alan bir birebir hedef elemanının şöyle çıktılanmasına sebep olacaktır:
<example><![CDATA[<foo>]]></example>
Eğer metin düğümü ]]>
dizgesini içeriyorsa, açık olan CDATA bölümü ]]
karakterlerinden sonra kapanır ve >
karakterinden önce yenisi açılır. Örneğin, bir birebir hedef elemanı biçembentte şöyle yer alıyor olsun:
<example>]]></example>
Bunun çıktısı şöyle olurdu:
<example><![CDATA[]]]]><![CDATA[>]]></example>
Eğer metin düğümü hedef ağacı çıktılamakta kullanılan karakter kodlaması ile gösterilemeyecek bir karakter içeriyorsa, açık olan CDATA bölümü bu karakterden önce kapatılmalı, karakter bir karakter veya öğe gönderimi olarak çıktılandıktan sonra metnin kalanı için yeni bir CDATA bölümü açılmalıdır.
CDATA bölümleri, cdata-section-elements
özniteliğinde açıkça CDATA bölümü olarak çıktılanmak üzere belirtilmiş olan metin düğümleri haricinde kullanılmamalıdır.
xml
çıktılama yönteminin, omit-xml-declaration
özniteliği yes
değeri ile kullanılmış olmadıkça bir XML bildirimi çıktılaması gereklidir. XML bildirimi hem hem sürüm bilgisi hem de karakter kodlaması belirtimini içermelidir. Eğer standalone
özniteliği belirtilmişse, bir tekbaşına belge bildiriminin de standalone
özniteliğinde belirtilen değerle XML bildiriminde yer alması gerekir. Aksi takdirde, XML bildirimi bir tekbaşına belge bildirimi içermemelidir. Bu kural, hem XML bildirimine (bir belge öğesinin başında bulunur) hem de metin bildirimine (bir harici genel çözümlü öğenin başında bulunur) uygulanır.
Eğer doctype-system
özniteliği belirtilmişse, xml
çıktılama yöntemi, ilk elemandan hemen önce bir belge türü bildirimi çıktılayacaktır. <!DOCTYPE
'i takibeden isim ilk elemanın ismiyle aynı olmak zorundudır. Bir de doctype-public
özniteliği belirtilmişse, xml
çıktılama yöntemi, bir PUBLIC
ile bunu izleyen bir genel betimleyici ve bir sistem betimleyicisi çıktılayacaktır; aksi takdirde, bir SYSTEM
ile bunu izleyen bir sistem betimleyicisi çıktılayacaktır. Dahili altküme boş olmalıdır. doctype-system
özniteliği belirtilmiş olmadığı takdirde, doctype-public
özniteliği yok sayılmalıdır.
media-type
özniteliği xml
çıktılama yöntemi için uygulanabilir olup öntanımlı değeri text/xml
'dir.
html
çıktılama yöntemi hedef ağacı HTML olarak çıktılar; örnek:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/"> <html> <xsl:apply-templates/> </html> </xsl:template> ... </xsl:stylesheet>
version
özniteliği ile HTML sürümü belirtilir ve öntanımlı değeri 4.0
olup, çıktının HTML 4.0 [HTML] önergesi ile uyumlu olacağını belirtir.
html
çıktılama yöntemi, genişletilmiş ismi tanımsız bir isim-alanı tanım-yerine sahip olmadıkça bir elemanı xml
çıktılama yönteminden farklı bir biçimde çıktılamamalıdır; genişletilmiş ismi tanımlı bir isim-alanı tanım-yerine sahip bir eleman XML olarak çıktılanmalıdır. Eğer bir elemanın genişletilmiş ismi tanımsız isim-alanı tanım-yerine sahipse, ancak genişletilmiş ismin yerel kısmı bir HTML eleman olarak tanınmıyorsa, span
gibi bir satıriçi eleman olarak boş olmayacak şekilde çıktılanmalıdır.
html
çıktılama yöntemi, boş elemanlar için bir bitiş etiketi çıktılamamalıdır. HTML 4.0 için boş elemanlar,
area
, base
, basefont
,
br
, col
, frame
,
hr
, img
, input
,
isindex
, link
, meta
ve
param
elemanlarıdır. Örneğin bir eleman biçembette <br/>
veya <br></br>
biçiminde yazılmışsa, çıktı <br>
olacaktır.
html
çıktılama yöntemi, HTML elemanlarının isimlerini harf büyüklüğüne duyarsız biçimde algılamalıdır. Örneğin, br
, BR
veya Br
HTML için br
elemanı olup bitiş elemanı olmaksızın çıktılanmalıdır.
html
çıktılama yöntemi, script
ve style
elemanlarının içeriği için önceleme uygulamamalıdır. Örneğen bir biçembentte bir birebir hedef eleman şöyle yer alıyor olsun:
<script>if (a < b) foo()</script>
veya
<script><![CDATA[if (a < b) foo()]]></script>
için çıktı şöyle olacaktır:
<script>if (a < b) foo()</script>
html
çıktılama yöntemi, öznitelik değerlerinde yer alan <
karakterlerini öncelememelidir.
Eğer indent
özniteliğini değeri yes
ise, html
çıktılama yöntemi, HTML tarayıcısının çıktıyı oluşturma yöntemini değiştirmediği sürece hedef ağaca çıktılanan boşluk karakterlerine ekleme yapabileceği gibi bunları silebilir de.
html
çıktılama yöntemi, HTML 4.0 Önergesinin B 2.1 ek bölümünde önerilen yöntemi kullanarak tanım-yeri (URI) öznitelik değerlerindeki ASCII olmayan karakterleri öncelemelidir.
html
çıktılama yöntemi, bir karakteri, eğer çıktılama yönteminde kullanılan HTML sürümünde tanımlıysa, bir karakter öğesi gönderimi kullanarak çıktılayabilir.
html
çıktılama yöntemi, işlem yönergelerini ?>
ile değil, >
ile sonlandırmalıdır.
html
çıktılama yöntemi, mantıksal değerli öznitelikleri (değerleri olarak kendi isimleri verilmiş öznitelikler) kısaltılmış biçimde çıktılamalıdır. Örneğin başlangıç etiketi,
<OPTION selected="selected">
biçiminde yazılmışsa, bunun çıktısı şöyle olurdu:
<OPTION selected>
html
çıktılama yöntemi, bir öznitelik değerinde {
karakterinin önünde bir &
karakteri yer alıyorsa bu karakteri öncelememelidir (HTML 4.0 Önergesinin B 7.1.1 ek bölümüne bakınız). Örneğin bir biçembentte bir başlangıç etiketi şöyle yer alıyor olsun:
<BODY bgcolor='&{{randomrbg}};'>
Bu örneklenim şöyle çıktılanmalıdır:
<BODY bgcolor='&{randomrbg};'>
encoding
özniteliği ile tercih edilen karakter kodlaması belirtilir. Bir HEAD
elemanı varsa html
çıktılama yöntemi bu elemanın başlangıç etiketinin hemen ardına kullanılan karakter kodlamasının belirtildiği bir META
elemanını eklemesi gerekir. Örnek:
<HEAD> <META http-equiv="Content-Type" content="text/html; charset=EUC-JP"> ...
Hedef ağacın, XSLT işlemcinin çıktılama için kullandığı karakter kodlamasında bulunmayan bir karakteri içermesi olasıdır. Eğer bu karakter, HTML'nin karakter gönderimlerini tanıdığı bir bağlamda yer alıyorsa, karakter bir karakter öğesi gönderimi olarak veya onluk sayılı karakter gönderimi olarak çıktılanmalıdır; aksi takdirde (örneğin, bir script
veya style
elemanında veya bir açıklamada), XSLT işlemci durumu hata olarak bildirmelidir.
Eğer doctype-public
veya doctype-system
öznitelikleri belirtilmişse, html
çıktılama yönteminin ilk elemandan hemen önce bir belge türü bildirimi çıktılaması gerekir. Bu bildirimde, <!DOCTYPE
dizgesinden sonra gelen isim HTML
veya html
olmalıdır. doctype-public
özniteliği belirtilmişse, öznitelik değerini (genel betimleyici) PUBLIC
ibaresinden sonra eklemelidir; doctype-system
özniteliği de ayrıca belirtilmişse, bunun değerinin (sistem betimleyici) de genel betimleyicinin ardından çıktılanması gerekir. Eğer doctype-system
özniteliği, doctype-public
olmaksızın tek başına belirtilmişse, çıktılama yöntemi bu değeri SYSTEM
ibaresinin ardına ekleyerek çıktılamalıdır.
media-type
özniteliği de html
çıktılama yönteminde uygulanabilir olup öntanımlı değeri text/html
'dir.
text
çıktılama yöntemi, hedef ağacı çıktıda, hedef ağaçtaki her metin düğümünün değerini belgedeki sıraya uygun olarak ve buna herhangi bir önceleme uygulamaksızın çıktılamak suretiyle oluşturur.
media-type
özniteliği text
çıktılama yönteminde uygulanabilir olup öntanımlı değeri text/plain
'dir..
encoding
özniteliği ile text
çıktılama yönteminin karakter dizilerini bayt dizilerine dönüştürürken kullanacağı karakter kodlaması belirtilir. Öntanımlı değer sisteme bağlıdır. Eğer hedef ağaç, XSLT işlemcinin çıktılama için kullandığı karakter kodlamasıyla ifade edilemeyen bir karakter içeriyorsa, XSLT işlemcinin bunu bir haka olarak bildirmesi gerekir.
Normalde, xml
çıktılama yöntemi & ve < karakterlerini (ve olası diğer karakterleri) metin düğümlerini çıktılarken önceler. Bu, çıktının iyi biçimli XML olması için gereklidir. Bununla birlikte, bazan çıktının iyi biçimli XML olarak çıktılanmaması daha uygun olabilir; örneğin, çıktı, sonradan XML'e duyarlı olmayan bir süreç tarafından iyi biçimli XML'e dönüştürüleceği düşünülen yetersiz biçimlenmiş bölümler içerebilir. Bu amaca uygun olarak, XSLT, çıktı önceleniminin iptalini mümkün kılan bir mekanizma sağlar. xsl:value-of ve xsl:text elemanlarının disable-output-escaping
diye, no
öntanımlı olmak üzere değer olarak sadece yes
veya no
kabul eden bir öznitelikleri olabilir; eğer değer yes
ise, xsl:value-of veya xsl:text ile üretilen metin düğümü herhangi bir öncelenim uygulanmaksızın çıktılanacaktır. Örnek:
<xsl:text disable-output-escaping="yes"><</xsl:text>
yönergesi tek bir <
karakteri üretecektir.
Bir kök düğüm, öncelenim, kök düğümünün astsalları için iptal edilmiş durumda bir xsl:copy-of elemanı kullanılarak kopyalanırken (bkz Değişken ve Değergeçlerin Değerlerinin xsl:copy-of ile Kullanımı), öncelenim, metin düğümünün çıktılanan kopyası için ayrıca iptal edilmiş olmalıdır. Örnek:
<xsl:variable name="x"> <xsl:text disable-output-escaping="yes"><</xsl:text> </xsl:variable> <xsl:copy-of select="$x"/>
Bu örneklenim < değil < çıktılayacaktır.
Bir metin düğümü için çıktı önceleniminin iptal edilmiş oluşunun hedef ağaçta metin düğümünün çıktılanması amacının dışında kullanılması bir hatadır. Bu bakımdan, bir açıklama, işlem yönergesi veya bir öznitelik düğümünü üretmek için bir xsl:value-of veya xsl:text elemanını, çıktı öncelenimini iptal ederek kullanmak bir hatadır; ayrıca, eğer hedef ağaç bölümü öncelenimin iptal edildiği bir metin düğümü içeriyorsa, bir hedef ağaç bölümünü bir sayı veya dizgeye dönüştürmek de bir hatadır. Her iki durumda da, bir XSLT işlemci htayı raporlayabilir, raporlamıyorsa, disable-output-escaping
özniteliğini yoksayarak hatadan kurtulmalıdır.
disable-output-escaping
özniteliği xml
çıktılama yönteminden başka html
çıktılama yönteminde de kullanılabilir. text
çıktılama yönteminde herhangi bir çıktı öncelenimi zaten yapılmadığından, disable-output-escaping
özniteliği yoksayılır.
Bir XSLT işlemcinin çıktı öncelenimini iptal edebileceği tek durum, hedef ağacın nasıl çıktılanacağını denetleyebildiği durumdur. Yine de, bu hep böyle olmayabilir. Örneğin, hedef ağaç çıktılanmak yerine başka bir hedef ağacın çıktılanmasına kaynaklık edebilir. Bu durumda XSLT işlemcinin çıktı önceleniminin iptal edilmesini desteklemesi gerekmez. Eğer bir xsl:value-of veya xsl:text elemanı çıktı öncelenimi iptal edilerek kullanılmışsa ve XSLT işlemci de bunu desteklemiyorsa, XSLT işlemci durumu hata olarak raporlayabilir, raporlamıyorsa, çıktı öncelenimini iptal etmeyerek hatadan kurtulmalıdır.
Eğer çıktı öncelenimin iptali, XSLT işlemcinin çıktılama için kullandığı kodlama tarafından desteklenmeyen bir karakter için kullanılmışsa, XSLT işlemci durumu bir hata olarak raporlayabilir, raporlamıyorsa, çıktı öncelenimini iptal etmeyerek hatadan kurtulmalıdır.
Çıktı önceleniminin iptali bütün XSLT işlemcilerle çalışmayabileceğinden ve XML için çıktı iyi biçimli olmayabileceğinden sadece başka çare yoksa kullanılmalıdır.
Bir uyumlu XSLT işlemci, bir biçembendi bir kaynak ağacı bir hedef ağaca bu belirtimde belirtildiği gibi dönüştürmek için kullanabilen işlemcidir. Bir uyumlu XSLT işlemciden beklenen, sonucu XML veya bir başka biçimde çıktılayabiliyor olması değildir.
Bir uyumlu XSLT işlemci, bu belgede özellikle bir XSLT işlemci tarafından bildirilmemesinin istendiği durumlar haricindeki bütün hataları bildirmesi gerekir. Bir uyumlu XSLT işlemciden beklenen, bildirdiği hatalı durumdan kurtarabilmesi değildir, ama kurtarabilirse iyi olur.
Bir uyumlu XSLT işlemci, bir biçembendin işlenmesi için gereken sistem kaynaklarının sınırları konusunda belirleyici olmayabilir.
Her XSLT tanımlı eleman türünün belirtiminde önce o eleman türünden elemanlar için bir model teşkil edecek şekilde bir sözdizimi özeti verilmiştir. Bu özet sözdizimi gösterimine anlam yükleme işlemi şöyle yapılmıştır:
Kullanımı zorunlu bir öznitelik kalın yazıyla belirtilmiştir.
Bir öznitelik değeri olarak görünen dizge, özniteliğin izin verilen değerlerini belirtir. Eğer bir değer, kaşlı ayraçlar arasına alınmışsa, öznitelik değeri bir öznitelik değeri örneklenimi (bazı hata iletilerinde AVT şeklinde bir kısaltma olarak karşınıza çıkabilir) olarak ele alınır ve kaşlı ayraçlar arasında yer alan dizge, öznitelik değeri örnekleniminden elde edilen sonucun izin verilen değerlerini belirtir. Birden fazla olası değer aralarına |
karakteri konarak belirtilir. Tırnak içinde belirtilen dizgeler öznitelik için sadece bu değerlere eşit değerlere izin verildiğini gösterir. Tırnak içine alınmamış ve eğik yazıyla belirtilmiş isimler belli bir değer türünü belirtir.
Eğer bir elemanın içeriği özellikle boş değilse, izin verilen içerik bir XML açıklaması olarak belirtilmiştir; açıklama içeriğinde XML'deki eleman türü bildirimide kullanılan yöntem kullanılmıştır; bu içerikten olarak örneklenim, metin düğümlerinin, birebir hedef elemanların, eklenti elemanların ve yönerge grubundaki XSLT elemanlarının bir karışımını ifade eder; tepe-seviyeden-eleman ise tepe-seviyeden eleman grubuna giren XSLT elemanlarına izin verildiği anlamındadır.
Eleman isminden önceki açıklama satırı elemanın hangi eleman grubunda kullanılabildiğini belirtir; ya yönerge ya tepe-seviyeden-eleman ya da her ikisi birden olabilir. Eleman grubu, elemanın içerikte bir örneklenim olarak mı yoksa bir tepe-seviyeden bir eleman olarak mı yer alabileceğini belirtir.
<!-- Grubu: yönerge -->
<xsl:apply-imports />
| eleman |
<!-- Grubu: yönerge --> <xsl:apply-templates | eleman |
<!-- Grubu: yönerge -->
<xsl:attribute
name = { nitelikli-ad }
| eleman |
<!-- Grubu: tepe-seviyeden-eleman -->
<xsl:attribute-set
name = nitelikli-ad
| eleman |
<!-- Grubu: yönerge --> <xsl:call-template name = nitelikli-ad > <!-- İçeriği: <xsl:with-param>* --> </xsl:call-template> | eleman |
<!-- Grubu: yönerge --> <xsl:choose> <!-- İçeriği: (<xsl:when>+ | <xsl:otherwise>?) --> </xsl:choose> | eleman |
<!-- Grubu: yönerge --> <xsl:comment> <!-- İçeriği: örneklenim --> </xsl:comment> | eleman |
<!-- Grubu: yönerge -->
<xsl:copy
| eleman |
<!-- Grubu: yönerge --> <xsl:copy-of select = ifade /> | eleman |
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:decimal-format | eleman |
<!-- Grubu: yönerge --> <xsl:element name = { nitelikli-ad } | eleman |
<!-- Grubu: yönerge --> <xsl:fallback> <!-- İçeriği: örneklenim --> </xsl:fallback> | eleman |
<!-- Grubu: yönerge --> <xsl:for-each select = düğüm-kümesi-ifadesi > <!-- İçeriği: (<xsl:sort>*, örneklenim) --> </xsl:for-each> | eleman |
<!-- Grubu: yönerge --> <xsl:if test = mantıksal-ifade > <!-- İçeriği: örneklenim --> </xsl:if> | eleman |
<xsl:import href = tanım-yeri-başvurusu /> | eleman |
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:include href = tanım-yeri-başvurusu /> | eleman |
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:key name = nitelikli-ad match = örüntü use = ifade /> | eleman |
<!-- Grubu: yönerge -->
<xsl:message
| eleman |
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:namespace-alias stylesheet-prefix = önek | "#default" result-prefix = önek | "#default" /> | eleman |
<!-- Grubu: yönerge --> <xsl:number | eleman |
<xsl:otherwise> <!-- İçeriği: örneklenim --> </xsl:otherwise> | eleman |
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:output | eleman |
<!-- Grubu: tepe-seviyeden-eleman -->
<xsl:param
name = nitelikli-ad
| eleman |
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:preserve-space elements = dizgecikler /> | eleman |
<!-- Grubu: yönerge --> <xsl:processing-instruction name = { kısa-ad } > <!-- İçeriği: örneklenim --> </xsl:processing-instruction> | eleman |
<xsl:sort | eleman |
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:strip-space elements = dizgecikler /> | eleman |
<xsl:stylesheet | eleman |
<!-- Grubu: tepe-seviyeden-eleman --> <xsl:template | eleman |
<!-- Grubu: yönerge -->
<xsl:text
| eleman |
<xsl:transform | eleman |
<!-- Grubu: yönerge -->
<xsl:value-of
select = dizgesel-ifade
| eleman |
<!-- Grubu: tepe-seviyeden-eleman -->
<!-- Grubu: yönerge -->
<xsl:variable
name = nitelikli-ad
| eleman |
<xsl:when test = mantıksal-ifade > <!-- İçeriği: örneklenim --> </xsl:when> | eleman |
<xsl:with-param
name = nitelikli-ad
| eleman |
Aşağıdaki öğe, belli bir hedef DTD'sinin nesnel sonucunu oluşturacak XSLT biçembentleri için bir DTD oluşturmakta kullanılabilir. Öğeye atıfta bulunmadan önce, biçembent DTD'si izin verilen hedef eleman türlerini listeleyen bir result-elements
değergeç öğesi tanımlamalıdır. Örnek:
<!ENTITY % result-elements " | fo:inline-sequence | fo:block ">
Böyle hedef elemanları xsl:use-attribute-sets ve xsl:extension-element-prefixes özniteliklerine sahip olarak bildirilmelidir. Aşağıdaki öğe, result-element-atts
değergecini bu amaçla bildirmektedir. XSLT'nin hedef elemanlar için izin verdiği içerik, %template;
içerik modeliyle aşağıda öğede bildirilen XSLT elemanları için izin verilenlerle aynıdır. DTD, hedef DTD'nin kısıtlamalarına uygun olarak %template;
'den daha kısıtlayıcı içerik modelleri kullanabilir.
XSLT isim-alanından farklı isim-alanlarındaki tepe-seviyeden elemanlara da izin vermek için DTD non-xsl-top-level
diye bir değergeç öğesi tanımlayabilir.
Bu DTD'deki xsl: öneki kullanımı XSLT biçembentlerinin bu öneki kullanmaları zorunludur anlamında ele alınmamalıdır. Bu DTD'de bildirilmiş herhangi bir eleman, bu DTD'de bildirilmiş özniteliklere ek olarak isimleri xmlns
'e eşit veya xmlns:
ile başlayan özniteliklere sahip olabilir.
<!ENTITY % char-instructions " | xsl:apply-templates | xsl:call-template | xsl:apply-imports | xsl:for-each | xsl:value-of | xsl:copy-of | xsl:number | xsl:choose | xsl:if | xsl:text | xsl:copy | xsl:variable | xsl:message | xsl:fallback "> <!ENTITY % instructions " %char-instructions; | xsl:processing-instruction | xsl:comment | xsl:element | xsl:attribute "> <!ENTITY % char-template " (#PCDATA %char-instructions;)* "> <!ENTITY % template " (#PCDATA %instructions; %result-elements;)* "> <!-- Değeri bir tanım-yeri başvurusu olan bir öznitelik türü için kullanılır. --> <!ENTITY % URI "CDATA"> <!-- Değeri bir örüntü olan bir öznitelik türü için kullanılır. --> <!ENTITY % pattern "CDATA"> <!-- Değeri bir öznitelik değeri örneklenimi olan bir öznitelik türü için kullanılır. --> <!ENTITY % avt "CDATA"> <!-- Değeri bir NitelAd olan bir öznitelik türü için kullanılır; önek, XSLT işlemcinin yorumladığı bir önek olacaktır. --> <!ENTITY % qname "NMTOKEN"> <!-- %qname; gibi ama bu onların boşluk ayraçlı bir listesi. --> <!ENTITY % qnames "NMTOKENS"> <!-- Değeri bir ifade olan bir öznitelik türü için kullanılır. --> <!ENTITY % expr "CDATA"> <!-- Değeri tek bir karakterden oluşan bir öznitelik türü için kullanılır. --> <!ENTITY % char "CDATA"> <!-- Değeri bir öncelik belirten bir öznitelik türü için kullanılır. --> <!ENTITY % priority "NMTOKEN"> <!ENTITY % space-att "xml:space (default|preserve) #IMPLIED"> <!-- Bu tepe-seviyede izin verilmiş eleman listesini genişleten bir özelleştirme olabilir. --> <!ENTITY % non-xsl-top-level ""> <!ENTITY % top-level " (xsl:import*, (xsl:include | xsl:strip-space | xsl:preserve-space | xsl:output | xsl:key | xsl:decimal-format | xsl:attribute-set | xsl:variable | xsl:param | xsl:template | xsl:namespace-alias %non-xsl-top-level;)*) "> <!ENTITY % top-level-atts ' extension-element-prefixes CDATA #IMPLIED exclude-result-prefixes CDATA #IMPLIED id ID #IMPLIED version NMTOKEN #REQUIRED xmlns:xsl CDATA #FIXED "http://www.w3.org/1999/XSL/Transform" %space-att; '> <!-- Bu öğe hedef elemanların ATTLIST bildirimlerinde kullanmak için tanımlanmıştır. --> <!ENTITY % result-element-atts ' xsl:extension-element-prefixes CDATA #IMPLIED xsl:exclude-result-prefixes CDATA #IMPLIED xsl:use-attribute-sets %qnames; #IMPLIED xsl:version NMTOKEN #IMPLIED '> <!ELEMENT xsl:stylesheet %top-level;> <!ATTLIST xsl:stylesheet %top-level-atts;> <!ELEMENT xsl:transform %top-level;> <!ATTLIST xsl:transform %top-level-atts;> <!ELEMENT xsl:import EMPTY> <!ATTLIST xsl:import href %URI; #REQUIRED> <!ELEMENT xsl:include EMPTY> <!ATTLIST xsl:include href %URI; #REQUIRED> <!ELEMENT xsl:strip-space EMPTY> <!ATTLIST xsl:strip-space elements CDATA #REQUIRED> <!ELEMENT xsl:preserve-space EMPTY> <!ATTLIST xsl:preserve-space elements CDATA #REQUIRED> <!ELEMENT xsl:output EMPTY> <!ATTLIST xsl:output method %qname; #IMPLIED version NMTOKEN #IMPLIED encoding CDATA #IMPLIED omit-xml-declaration (yes|no) #IMPLIED standalone (yes|no) #IMPLIED doctype-public CDATA #IMPLIED doctype-system CDATA #IMPLIED cdata-section-elements %qnames; #IMPLIED indent (yes|no) #IMPLIED media-type CDATA #IMPLIED > <!ELEMENT xsl:key EMPTY> <!ATTLIST xsl:key name %qname; #REQUIRED match %pattern; #REQUIRED use %expr; #REQUIRED > <!ELEMENT xsl:decimal-format EMPTY> <!ATTLIST xsl:decimal-format name %qname; #IMPLIED decimal-separator %char; "." grouping-separator %char; "," infinity CDATA "Infinity" minus-sign %char; "-" NaN CDATA "NaN" percent %char; "%" per-mille %char; "‰" zero-digit %char; "0" digit %char; "#" pattern-separator %char; ";" > <!ELEMENT xsl:namespace-alias EMPTY> <!ATTLIST xsl:namespace-alias stylesheet-prefix CDATA #REQUIRED result-prefix CDATA #REQUIRED > <!ELEMENT xsl:template (#PCDATA %instructions; %result-elements; | xsl:param)* > <!ATTLIST xsl:template match %pattern; #IMPLIED name %qname; #IMPLIED priority %priority; #IMPLIED mode %qname; #IMPLIED %space-att; > <!ELEMENT xsl:value-of EMPTY> <!ATTLIST xsl:value-of select %expr; #REQUIRED disable-output-escaping (yes|no) "no" > <!ELEMENT xsl:copy-of EMPTY> <!ATTLIST xsl:copy-of select %expr; #REQUIRED> <!ELEMENT xsl:number EMPTY> <!ATTLIST xsl:number level (single|multiple|any) "single" count %pattern; #IMPLIED from %pattern; #IMPLIED value %expr; #IMPLIED format %avt; '1' lang %avt; #IMPLIED letter-value %avt; #IMPLIED grouping-separator %avt; #IMPLIED grouping-size %avt; #IMPLIED > <!ELEMENT xsl:apply-templates (xsl:sort|xsl:with-param)*> <!ATTLIST xsl:apply-templates select %expr; "node()" mode %qname; #IMPLIED > <!ELEMENT xsl:apply-imports EMPTY> <!-- xsl:sort, bir boşluk olmayan karakterden veya bir imlenimden sonra yer alamaz. --> <!ELEMENT xsl:for-each (#PCDATA %instructions; %result-elements; | xsl:sort)* > <!ATTLIST xsl:for-each select %expr; #REQUIRED %space-att; > <!ELEMENT xsl:sort EMPTY> <!ATTLIST xsl:sort select %expr; "." lang %avt; #IMPLIED data-type %avt; "text" order %avt; "ascending" case-order %avt; #IMPLIED > <!ELEMENT xsl:if %template;> <!ATTLIST xsl:if test %expr; #REQUIRED %space-att; > <!ELEMENT xsl:choose (xsl:when+, xsl:otherwise?)> <!ATTLIST xsl:choose %space-att;> <!ELEMENT xsl:when %template;> <!ATTLIST xsl:when test %expr; #REQUIRED %space-att; > <!ELEMENT xsl:otherwise %template;> <!ATTLIST xsl:otherwise %space-att;> <!ELEMENT xsl:attribute-set (xsl:attribute)*> <!ATTLIST xsl:attribute-set name %qname; #REQUIRED use-attribute-sets %qnames; #IMPLIED > <!ELEMENT xsl:call-template (xsl:with-param)*> <!ATTLIST xsl:call-template name %qname; #REQUIRED > <!ELEMENT xsl:with-param %template;> <!ATTLIST xsl:with-param name %qname; #REQUIRED select %expr; #IMPLIED > <!ELEMENT xsl:variable %template;> <!ATTLIST xsl:variable name %qname; #REQUIRED select %expr; #IMPLIED > <!ELEMENT xsl:param %template;> <!ATTLIST xsl:param name %qname; #REQUIRED select %expr; #IMPLIED > <!ELEMENT xsl:text (#PCDATA)> <!ATTLIST xsl:text disable-output-escaping (yes|no) "no" > <!ELEMENT xsl:processing-instruction %char-template;> <!ATTLIST xsl:processing-instruction name %avt; #REQUIRED %space-att; > <!ELEMENT xsl:element %template;> <!ATTLIST xsl:element name %avt; #REQUIRED namespace %avt; #IMPLIED use-attribute-sets %qnames; #IMPLIED %space-att; > <!ELEMENT xsl:attribute %char-template;> <!ATTLIST xsl:attribute name %avt; #REQUIRED namespace %avt; #IMPLIED %space-att; > <!ELEMENT xsl:comment %char-template;> <!ATTLIST xsl:comment %space-att;> <!ELEMENT xsl:copy %template;> <!ATTLIST xsl:copy %space-att; use-attribute-sets %qnames; #IMPLIED > <!ELEMENT xsl:message %template;> <!ATTLIST xsl:message %space-att; terminate (yes|no) "no" > <!ELEMENT xsl:fallback %template;> <!ATTLIST xsl:fallback %space-att;>
Bu örnekte, basit bir DTD ile uyumlu belgeleri XHTML'ye [XHTML] dönüştürmek için bir biçembent kullanımı gösterilmiştir. DTD şöyledir:
<!ELEMENT doc (title, chapter*)> <!ELEMENT chapter (title, (para|note)*, section*)> <!ELEMENT section (title, (para|note)*)> <!ELEMENT title (#PCDATA|emph)*> <!ELEMENT para (#PCDATA|emph)*> <!ELEMENT note (#PCDATA|emph)*> <!ELEMENT emph (#PCDATA|emph)*>
Biçembent böyle:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict"> <xsl:strip-space elements="doc chapter section"/> <xsl:output method="xml" indent="yes" encoding="iso-8859-9" /> <xsl:template match="doc"> <html> <head> <title> <xsl:value-of select="title"/> </title> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="doc/title"> <h1> <xsl:apply-templates/> </h1> </xsl:template> <xsl:template match="chapter/title"> <h2> <xsl:apply-templates/> </h2> </xsl:template> <xsl:template match="section/title"> <h3> <xsl:apply-templates/> </h3> </xsl:template> <xsl:template match="para"> <p> <xsl:apply-templates/> </p> </xsl:template> <xsl:template match="note"> <p class="note"> <b>BİLGİ: </b> <xsl:apply-templates/> </p> </xsl:template> <xsl:template match="emph"> <em> <xsl:apply-templates/> </em> </xsl:template> </xsl:stylesheet>
Kaynak belgemiz böyle olsaydı:
<!DOCTYPE doc SYSTEM "doc.dtd"> <doc> <title>Belge Başlığı</title> <chapter> <title>Fasıl Başlığı</title> <section> <title>Bölüm Başlığı</title> <para>Bu bir denemedir.</para> <note>Bu bir ek bilgidir.</note> </section> <section> <title>Başka Bir Bölüm Başlığı</title> <para>Bu da <emph>başka</emph> bir DNMdir.</para> <note>Bu bir ek malumattır.</note> </section> </chapter> </doc>
Üretilecek hedef belgemiz böyle olurdu:
<?xml version="1.0" encoding="iso-8859-9"?> <html xmlns="http://www.w3.org/TR/xhtml1/strict"> <head> <title>Belge Başlığı</title> </head> <body> <h1>Belge Başlığı</h1> <h2>Fasıl Başlığı</h2> <h3>Bölüm Başlığı</h3> <p>Bu bir denemedir.</p> <p class="note"> <b>BİLGİ: </b>Bu bir ek bilgidir.</p> <h3>Başka Bir Bölüm Başlığı</h3> <p>Bu da <em>başka</em> bir DNMdir.</p> <p class="note"> <b>BİLGİ: </b>Bu ilaveten diğer bir malumattır.</p> </body> </html>
Bu örnekte, bir XML belge olarak tutulan veriden üç farklı biçembent kullanarak verinin üç farklı gösterimi (HTML, SVG ve VRML) elde edilmektedir.
Veri girdimiz:
<satışlar> <bölge id="Kuzey"> <gelir>10</gelir> <artış>9</artış> <ikram>7</ikram> </bölge> <bölge id="Güney"> <gelir>4</gelir> <artış>3</artış> <ikram>4</ikram> </bölge> <bölge id="Batı"> <gelir>6</gelir> <artış>-1.5</artış> <ikram>2</ikram> </bölge> </sales>
Aşağıdaki biçembent, Birebir Hedef Eleman olarak Biçembent bölümünde açıklanan basitleştirilmiş sözdizimini kullanarak veriyi HTML'ye dönüştürmek içindir:
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" lang="tr"> <head> <title>Bölgelere göre Satış Sonuçları</title> </head> <body> <table border="1"> <tr> <th>Bölge</th> <th>Gelir</th> <th>Büyüme</th> <th>İkramiye</th> </tr> <xsl:for-each select="satışlar/bölge"> <!-- sonuçları gelire göre sırala --> <xsl:sort select="gelir" data-type="number" order="descending"/> <tr> <td> <em><xsl:value-of select="@id"/></em> </td> <td> <xsl:value-of select="gelir"/> </td> <td> <!-- büyüme aslında küçülmeyse kırmızı göster --> <xsl:if test="artış < 0"> <xsl:attribute name="style"> <xsl:text>color:red</xsl:text> </xsl:attribute> </xsl:if> <xsl:value-of select="artış"/> </td> <td> <xsl:value-of select="ikram"/> </td> </tr> </xsl:for-each> </table> </body> </html>
The HTML output is:
<html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9"> <title>Bölgelere göre Satış Sonuçları</title> </head> <body> <table border="1"> <tr> <th>Bölge</th><th>Gelir</th><th>Büyüme</th><th>İkramiye</th> </tr> <tr> <td><em>Kuzey</em></td><td>10</td><td>9</td><td>7</td> </tr> <tr> <td><em>Batı</em></td><td>6</td><td style="color:red">-1.5</td><td>2</td> </tr> <tr> <td><em>Güney</em></td><td>4</td><td>3</td><td>4</td> </tr> </table> </body> </html>
Bu biçembent veriyi SCG'ye dönüştürmek içinder:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/Graphics/SVG/SVG-19990812.dtd"> <xsl:output method="xml" indent="yes" media-type="image/svg"/> <xsl:template match="/"> <svg width = "3in" height="3in"> <g style = "stroke: #000000"> <!-- eksenlere çiz --> <line x1="0" x2="150" y1="150" y2="150"/> <line x1="0" x2="0" y1="0" y2="150"/> <text x="0" y="10">Gelir</text> <text x="150" y="165">Bölüm</text> <xsl:for-each select="satışlar/bölüm"> <!-- bazı yararlı değişkenleri tanımlayalım --> <!-- çubuğun x konumu --> <xsl:variable name="pos" select="(position()*40)-30"/> <!-- çubuğun yüksekliği --> <xsl:variable name="height" select="gelir*10"/> <!-- dikdörtgen --> <rect x="{$pos}" y="{150-$height}" width="20" height="{$height}"/> <!-- metinsel yafta --> <text x="{$pos}" y="165"> <xsl:value-of select="@id"/> </text> <!-- çubuk değeri --> <text x="{$pos}" y="{145-$height}"> <xsl:value-of select="gelir"/> </text> </xsl:for-each> </g> </svg> </xsl:template> </xsl:stylesheet>
SVG çıktısı:
<svg width="3in" height="3in" xmlns="http://www.w3.org/Graphics/SVG/svg-19990412.dtd"> <g style="stroke: #000000"> <line x1="0" x2="150" y1="150" y2="150"/> <line x1="0" x2="0" y1="0" y2="150"/> <text x="0" y="10">Gelir</text> <text x="150" y="165">Bölüm</text> <rect x="10" y="50" width="20" height="100"/> <text x="10" y="165">Kuzey</text> <text x="10" y="45">10</text> <rect x="50" y="110" width="20" height="40"/> <text x="50" y="165">Güney</text> <text x="50" y="105">4</text> <rect x="90" y="90" width="20" height="60"/> <text x="90" y="165">Batı</text> <text x="90" y="85">6</text> </g> </svg>
Aşağıdaki biçembent veriyi VRML'ye dönüştürmek içindir:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- metni, öntanımlı karakter kümesini kullanarak model/vrmlmime türünde üretelim --> <xsl:output method="text" encoding="UTF-8" media-type="model/vrml"/> <xsl:template match="/">#VRML V2.0 utf8 # tek bir bar elemanının externproto tanımı EXTERNPROTO bar [ field SFInt32 x field SFInt32 y field SFInt32 z field SFString name ] "http://www.vrml.org/WorkingGroups/dbwork/barProto.wrl" # taşıyıcı çizge eksenlerini satıriçine alalım Inline { url "http://www.vrml.org/WorkingGroups/dbwork/barAxes.wrl" } <xsl:for-each select="satışlar/bölüm"> bar { x <xsl:value-of select="gelir"/> y <xsl:value-of select="artış"/> z <xsl:value-of select="ikram"/> name "<xsl:value-of select="@id"/>" } </xsl:for-each> </xsl:template> </xsl:stylesheet>
VRML çıktısı:
#VRML V2.0 utf8 # tek bir bar elemanının externproto tanımı EXTERNPROTO bar [ field SFInt32 x field SFInt32 y field SFInt32 z field SFString name ] "http://www.vrml.org/WorkingGroups/dbwork/barProto.wrl" # taşıyıcı çizge eksenlerini satıriçine alalım Inline { url "http://www.vrml.org/WorkingGroups/dbwork/barAxes.wrl" } bar { x 10 y 9 z 7 name "Kuzey" } bar { x 4 y 3 z 4 name "Güney" } bar { x 6 y -1.5 z 2 name "Batı" }
Bu taslağın yazımına katkıda bulunanlar:
Bu belirtim W3C XSL Çalışma Grubu (ÇG) tarafından geliştirildi ve yayımı için onaylandı. Bu belirtimin ÇG onayı tüm ÇG üyülerinin onaylarını oylarıyla belirtmelerini gerektirmez. XSL ÇG'nin şu an ki üyeleri:
Önerge Adaylığından sonra şu değişiklikler oldu:
xsl:version özniteliği, bir biçembent olarak kullanımda bir birebir hedef elemanda gereklidir (bkz, Birebir Hedef Eleman olarak Biçembent).
xsl:sort elemanındaki data-type
özniteliği, XSLT tarafından tanımlanmamış bir veri türünü belirten bir önekli ismi kullanılabilir (bkz, Sıralama).
XSLT'nin XSLT 1.0'dan sonraki sürümlerinde ele alınması düşünülen özellikler şunlardır:
resolve(
düğüm-kümesi)
gibi bir işlev;select
özniteliği için geçerli düğümün öntanımlı olması;foo/(bar|baz)
gibi);style
özniteliğinin elde edilişine daha uygun bir yol.