W3C

XSL Dönüşümleri (XSLT) Sürüm 1.0

W3C Önergesi 16 Kasım 1999

Bu sürüm:
http://www.w3.org/TR/1999/REC-xslt-19991116
(XML ve HTML biçimleri mevcuttur.)
Son sürüm:
http://www.w3.org/TR/xslt
Önceki Sürümler:
http://www.w3.org/TR/1999/PR-xslt-19991008
http://www.w3.org/1999/08/WD-xslt-19990813
http://www.w3.org/1999/07/WD-xslt-19990709
http://www.w3.org/TR/1999/WD-xslt-19990421
http://www.w3.org/TR/1998/WD-xsl-19981216
http://www.w3.org/TR/1998/WD-xsl-19980818
Yayına hazırlayan:
James Clark <jjc@jclark.com>

Bu çeviri:
Tek sayfalık HTML, çok sayfalı HTML ve XML biçimleri mevcuttur.
Çeviren:
Nilgün Belma Bugüner <>, 25 Haziran 2007

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.


Özet

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.

Belgenin Durumu

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 xsl-editors@w3.org 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.

İçindekiler

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

Ekler

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)


1 Giriş

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, 2.1 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, 2.6.2 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 5.5 Ş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, D.2 Veri Örneği). XSLT bu tür biçembentler için basitleştirilmiş bir sözdizimi sağlar (bkz, 2.3 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, 5 Örneklenim Kuralları ve 8 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, 14 Eklentiler).

Not:
XSL Çalışma Grubu böyle bir mekanizmayı bu belirtimin ileriki sürümlerinde veya ayrı bir belirtimde tanımlamayı düşünmektedir.

XSLT tarafından tanımlanmış elemanların sözdizimlerini belirleyen eleman sözdizimi gösterim özeti 18 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.

2 Biçembent Yapısı

2.1 XSLT İsim-alanı

XSLT isim-alanı tanımı http://www.w3.org/1999/XSL/Transformadresinde bulunmaktadır.

Not:
Adresin içindeki 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, 2.2 stylesheet Elemanı ve 2.3 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 B 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ı 14.1 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.

Not:
XSLT eleman, öznitelik ve işlev isimleri için kullanılmakta olan uzlaşımlar şunlardır: isimler küçük harflerden oluşur, sözcükleri ayırmak için tire imleri ve XML veya HTML gibi alakalı bir dilin sözdiziminde yeralmak kaydıyla kısaltmalar kullanılabilir.

2.2 stylesheet Elemanı

<xsl:stylesheet
  id = id
  extension-element-prefixes = dizgecikler
  exclude-result-prefixes = dizgecikler
  version = sayı >
  <!-- İçeriği: (<xsl:import>*, tepe-seviyeden-elemanlar) -->
</xsl:stylesheet>
eleman
<xsl:transform
  id = id
  extension-element-prefixes = dizgecikler
  exclude-result-prefixes = dizgecikler
  version = sayı >
  <!-- İçeriği: (<xsl:import>*, tepe-seviyeden-elemanlar) -->
</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, 2.5 İ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:

  • Ek elemanlar veya ek işlevler tarafından kullanılan bilgiler (bkz, 14 Eklentiler),
  • hedef ağaçta yapılacaklarla ilgili bilgiler,
  • kaynak ağacın nasıl temin edileceği bilgisi,
  • biçembentle ilgili temel veriler,
  • biçembentle ilgili belgeleme.

2.3 Birebir Hedef Eleman olarak Biçembent

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, 7.1.1 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, 2.5 İ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.

Not:
Örneğin, başka XML dili (BXD) diye bir dilin belge elemanı üzerinde, XML belgenin bir BXD işlemcisi tarafından işlenmesi gereken bir BXD belgesi olduğunu belirten, bir 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.

2.4 Nitelikli Adlar

Bir dahili XSLT nesnesinin ismi, özellikle bir isimli örneklenim (6 İsimli Örneklenimler), bir kip (5.7 Kipler), bir öznitelik kümesi (7.1.4 İsimli Öznitelik Kümeleri), bir anahtar (12.2 Anahtarlar), bir onluk sayı biçimi (12.3 Sayı Biçimleme), bir değişken veya değergeç (11 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.

2.5 İleriye Uyumlu İşlem

Bir eleman ileriye uyumlu kipi kendisi, öznitelikleri, astsalları için şunlardan birinin varlığı halinde etkinleştirir:

  • Eleman, version özniteliği 1.0'dan farklı bir xsl:stylesheet elemanıdır.
  • Eleman, xsl:version özniteliği 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 15 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>

Not:
Eğer bir biçembent sürümü 1.0'dan sonraki bir XSLT'ye ait bir tepe seviyeden elemana son derece bağımlıysa, biçembent, XSLT'nin daha erken sürümlerini gerçekleyen XSLT işlemcilerin tepe seviyeden elemanları sessizce yoksaymayacağından emin olmak için bir xsl:message elemanını terminate="yes" özniteliği ile kullanabilir (bkz, 13 İ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') &lt; 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.

2.6 Biçembentlerin Birleştirilmesi

XSLT biçembentlerin birleştirilmesi için iki mekanizmaya sahiptir:

  • Anlamsallıkları değişmeksizin biçembentlerin birleştirilebilmelerini mümkün kılan içerme mekanizması ve
  • her biçembentin diğerlerinin yukarısına gelecek şekilde birleştirilmesini mümkün kılan ithal mekanizması.

2.6.1 Biçembentlerin İçerilmesi

<!-- 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, 3.2 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 2.3 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.

Not:
Defalarca içerilen bir biçembent tanımların tekrarı sebebiyle hatalara yol açabilir. Böyle çoklu içerimler dolaylı olduklarında daha az belirgin olurlar. Örneğin, B ve C biçembendleri A biçembendini içeriyorsa ve D biçembendi de hem B hem de C biçembendini içeriyorsa, A biçembendi, D biçembendi tarafından dolaylı olarak iki kere içerilmiş olacaktır. B, C ve D biçembentlerinin herbiri bağımsız biçembentler olarak kullanılıyorsa, B biçembendindeki A biçembendinin içerilmesi dışındaki herşeyi bir B' biçembendine aktararak ve benzer bir işlemi C biçembendi içinde yaptıktan sonra D biçembendini A, B' ve C' biçembentlerini içerecek şekilde değiştirerek hatadan kurtulmak mümkün olabilir.

2.6.2 Biçembent İthali

<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, 2.6.1 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, 3.2 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,

  • A biçembendi sırasıyla B ve C biçembentlerini ithal etmiş olsun;
  • B biçembenti D'yi
  • C biçembendi de E'yi ithal etmiş olsun.

İthal önceliği sırası D, B, E, C, A olacaktır.

Not:
xsl:import elemanlarının herhangi bir tanım veya örneklenim kuralından önce kullanılması gerektiğinden, ithal edilen biçembentleri xsl:import elemanına rastlandığı noktada işleme sokan bir gerçeklenim, tanımlara ve örneklenim kurallarına artan ithal önceliğiyle rastlayacaktı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.

Not:
Eğer xsl:apply-imports kullanılmışsa (bkz, 5.6 Örneklenim Kurallarının Geçerli Kılınması), davranış, biçembendin sadece en yüksek ithal öncelikli yerde ithal edilmesi durumundakinden farklı olabilir.

2.7 Gömülü Biçembentler

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:

  • XSLT biçembendi XML olmayan bir kaynağa gömülebilir veya
  • XML belgenin belge elemanı xsl:stylesheet elemanı olmaksızın biçembent bir XML kaynağa gömülebilir.

İ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.

Not:
Böyle bir özniteliğin XPath 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>

Not:
Bir biçembent, ister uygulansın, ister içerilsin, ister ithal edilsin bir belgeye gömüldüğü takdirde yoksayılacak bir xsl:stylesheet elemanı belirtilmiş bir örneklenim kuralının varlığını gerektirir.

3 Veri Modeli

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.

3.1 Kök Düğümün Çocukları

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, 16 Çı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.

3.2 Temel Tanım-yeri

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.

3.3 Çözümlenmemiş Öğeler

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.

3.4 Boşluk Ayıklama

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.

Not:
Eğer bir birebir hedef elemanda bir 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:

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.

3.5 XML Sürümü

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.

4 İfadeler

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:

5 Örneklenim Kuralları

5.1 İşlem Modeli

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

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

5.2 Örüntüler

Örneklenim kuralları düğümlerle bir örüntü aracılığıyla özdeşleşir. Örüntüler, örneklenim kurallarından başka, numaralama (7.7 Numaralama) ve anahtar bildirimi (12.2 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.

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

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

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

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

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

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

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

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

Örneğin, bu ifadenin,

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

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

  • item DüğümSınaması düğüm için doğru olmalı ve düğüm bir öznitelik olmamalıdır; başka bir deyişle düğüm bir item elemanı olmalıdır.

  • position()=1 Dayanakİfadesinin bağlamsal düğüm olarak düğümle ve bağlamsal düğüm listesi olarak düğümün item kardeşleriyle değerlendirilmesinin sonucu doğru olmalıdır.

  • düğümün appendix//ulist ile eşleşen bir ebeveyni olmalıdır; ebeveyn, appendix üstsele sahip bir ulist elemanı ise bu doğru olacaktır.

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

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

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

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

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

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

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

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

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

5.4 Örneklenim Kurallarının Uygulanması

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

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

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

select özniteliğinin yokluğunda xsl:apply-templates yönergesi geçerli düğümün tüm çocuklarını, metin düğümleri de dahil olmak üzere işler. Bununla birlikte, 3.4 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 (10 Sıralama) belirtilmemişse belgedeki sıraya göre işlenecektir. Aşağıdaki örnekte, yazar-grubu'nun tüm yazar çocukları işlenmektedir:

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

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

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

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

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

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

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

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

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

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

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

Bu kuralla,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5.7 Kipler

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

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

5.8 Yerleşik Örneklenim Kuralları

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

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

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

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

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

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

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

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

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

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

6 İsimli Örneklenimler

<!-- 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 2.4 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.

7 Hedef Ağacın Oluşturulması

Bu bölümde hedef ağaç üzerinde düğümleri doğrudan oluşturan yönergeler açıklanmaktadır.

7.1 Elemanların ve Özniteliklerin Oluşturulması

7.1.1 Birebir Hedef Elemanlar

Bir örneklenimde, XSLT isim-alanına ait olmadığı gibi bir ek eleman da (bkz, 14.1 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, 14.1 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.

Not:
Bir biçembent, bir isim-alanı bildirimini sadece kaynak ağacını adreslemek amacıyla kullandığı zaman, önekin 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>

Not:
XSLT isim-alanı tanım-yerinden başka isim-alanları için de takma adlar kullanmak gerekli olabilir. Örneğin, sayısal imzalarla iş yapılan bir isim-alanına ait olan birebir sonuç elemanlar, XSLT biçembentlerinin genel amaçlı güvenlik yazılımları tarafından kötü kullanımına sebep olabilir; isim-alanı için bir takma ad kullanımı böyle bir kötü kullanım olasılığını ortadan kaldıracaktır.

7.1.2 Elemanların xsl:element ile Oluşturulması

<!-- Grubu: yönerge -->
<xsl:element
  name = { nitelikli-ad }
  namespace = { tanım-yeri-başvurusu }
  use-attribute-sets = nitelikli-adlar >
  <!-- İçeriği: örneklenim -->
</xsl:element>
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.

7.1.3 Özniteliklerin xsl:attribute ile Oluşturulması

<!-- Grubu: yönerge -->
<xsl:attribute
  name = { nitelikli-ad }
  namespace = { tanım-yeri-başvurusu } >
  <!-- İçeriği: örneklenim -->
</xsl:attribute>
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.

Not:
Bir xsl:attribute elemanı satırsonu içeren bir metin düğümü içeriyorsa, XML çıktının bir karakter gönderimi içermesi gerekir. Örneğin,

<xsl:attribute name="a">x
y</xsl:attribute>

kodu şu çıktıyı üretecektir:

a="x&#xA;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.

7.1.4 İsimli Öznitelik Kümeleri

<!-- Grubu: tepe-seviyeden-eleman -->
<xsl:attribute-set
  name = nitelikli-ad
  use-attribute-sets = nitelikli-adlar >
  <!-- İçeriği: <xsl:attribute>* -->
</xsl:attribute-set>
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 2.4 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, 7.5 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, 2.4 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, 11 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