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

2 Biçembent Yapısı

İçindekiler

    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

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

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, İ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:

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

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

2.5 İleriye Uyumlu İşlem

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

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:

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, İ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:

2.6 Biçembentlerin Birleştirilmesi

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

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

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

  • 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, Ö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:

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

ÖncekiYukarıSonraki
GirişBir Linux Kitaplığı SayfasıVeri Modeli