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

7 Hedef Ağacın Oluşturulması

İçindekiler

    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

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, Eklenti Elemanlar) olmayan bir eleman aynı genişletilmiş isimle bir eleman düğümü oluşturmak üzere nesnelleştirilir. Elemanın içeriği, oluşturulan eleman düğümünün içeriğini vermek için nesnelleştiren bir örneklenimdir. Oluşturulan eleman düğümü, biçembent ağacındaki eleman düğümünde mevcut ancak isimleri XSLT isim-alanından olmayan öznitelik düğümlerine sahip olacaktır.

Oluşturulan eleman düğümü, ayrıca biçembent ağacındaki eleman düğümünde mevcut olan isim-alanı düğümlerinin bir kopyasına sahip olacaktır; kopyanın içinde, dizgesel değeri XSLT isim-alanı tanım-yeri (http://www.w3.org/1999/XSL/Transform), eklenti isim-alanı olarak bildirilmiş bir isim-alanı tanım-yeri (bkz, Eklenti Elemanlar) veya dışlanmış bir isim-alanı olarak belirtilmiş bir isim-alanı tanım-yeri olan isim-alanı düğümleri olmayacaktır. Bir isim-alanı tanım-yeri, xsl:stylesheet elemanının exclude-result-prefixes özniteliği veya birebir hedef elemanın xsl:exclude-result-prefixes özniteliği kullanılarak, dışlanmış bir isim-alanı olarak belirtilir. Bu özniteliklerin ikisinin de değeri boş karakter ayraçlı isim-alanı önekleri listesidir. Öneklerin her birine bağlı isim-alanları birer dışlanmış isim-alanı olarak belirtilmiş olur. exclude-result-prefixes veya xsl:exclude-result-prefixes özniteliğini taşıyan eleman üzerinde öneke bağlı bir isim-alanının olmayışı bir hatadır. Öntanımlı isim-alanı, isim-alanı önekleri listesine #default dizgesi dahil edilerek dışlanmış bir isim-alanı olarak belirtilebilir. Bir isim-alanının dışlanmış bir isim-alanı olarak atanması, exclude-result-prefixes veya xsl:exclude-result-prefixes özniteliğini taşıyan eleman biçembendin kök düğümü olmak üzere, biçembentin alt ağacı içinde etkilidir; kökü bir xsl:stylesheet elemanı olan bir alt ağaç, xsl:stylesheet elemanının çocukları tarafından içerilmiş veya ithal edilmiş bir biçembent içermez.

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 Nitelikli Adlar bölümünde açıklandığı gibi yorumlanır. xsl:attribute-set elemanının içeriği kümedeki öznitelikleri belirten sıfır veya daha fazla sayıda xsl:attribute elemanından oluşur.

Öznitelik kümeleri, bir xsl:element, xsl:copy (bkz, Kopyalama) veya xsl:attribute-set elemanının use-attribute-sets özniteliğinde belirtilerek kullanılırlar. use-attribute-sets özniteliğinin değeri öznitelik kümesi isimlerinin boşluk ayraçlı listesidir. Belirtilen her isim, Nitelikli Adlar bölümünde açıklandığı gibi yorumlanan birer NitelAd olarak belirtilir. Bir use-attribute-sets özniteliğinin belirtilmesi, özniteliğe sahip elemanın içeriğinin başlangıcında isimli öznitelik kümelerinin her birindeki özniteliklerin her biri için (use-attribute-sets özniteliğinde belirtilen öznitelik isimleriyle aynı sırada) bir xsl:attribute elemanı belirtilmesine eşdeğerdir. use-attribute-sets özniteliklerinin xsl:attribute-set elemanlarında doğrudan veya dolaylı olarak kendilerini öznitelik kümesi olarak kullanmaları bir hatadır.

Öznitelik kümeleri ayrıca bir birebir hedef elemanda da bir xsl:use-attribute-sets özniteliği belirterek kullanılabilir. xsl:use-attribute-sets özniteliğinin değeri öznitelik kümesi isimlerinin boşluk ayraçlı bir listesidir. xsl:use-attribute-sets özniteliği tarafından belirtilen xsl:attribute elemanlarından sonra ama asıl xsl:attribute elemanlarından önce yer alan xsl:attribute elemanları tarafından belirtilmiş gibi ele alınan birebir hedef elemanın kendi üzerindeki öznitelikler tarafından belirtilen ek kurallarla birlikte xsl:element üzerindeki use-attribute-sets özniteliği ile xsl:use-attribute-sets özniteliği aynı etkiye sahiptir. Bu bakımdan, bir birebir hedef eleman için, bir xsl:use-attribute-sets özniteliğinde isimleri bulunan öznitelik kümelerindeki öznitelikler önce (ama kümelerin listede yer alış sırasına uygun olarak) eklenecektir; ardından birebir hedef elemanda belirtilen öznitelikler eklenecek; son olarak da, xsl:attribute elemanları tarafından belirtilen öznitelikler eklenecektir. Bir özniteliğin bir elemana eklenmesi, bu elemanın aynı isimdeki mevcut özniteliğini değiştirdiğinden, bu, öznitelik kümelerinde belirtilen öznitelikler, birebir hedef elemanın kendisinde belirtilen öznitelikler tarafından geçersiz kılınabilirler anlamına gelir.

Bir xsl:attribute-set elemanınındaki xsl:attribute elemanlarının her birindeki örneklenimler, öznitelik kümesinin her kullanılışında yeniden nesnelleştirilir; nesnelleştirme, aynı geçerli düğüm ve geçerli düğüm listesi kullanılarak, nesnelleştirme için use-attribute-sets veya xsl:use-attribute-sets özniteliğini taşıyan eleman kullanılıyormuş gibi yapılır. Bununla birlikte, hangi değişken bağıntısının görünür (bkz, Değişkenler ve Değergeçler) olduğunu belirleyen use-attribute-sets veya xsl:use-attribute-sets özniteliğini taşıyan elemandan ziyade biçembentteki xsl:attribute elemanının konumudur; bu bakımdan, sadece tepe-seviyeden xsl:variable ve xsl:param elemanları ile bildirilen değişken ve değergeçler görünürdür.

Aşağıdaki örnekte title-style isimli bir öznitelik kümesi oluşturulmakta ve bir örneklenim kuralında kullanılmaktadır:

<xsl:template match="chapter/heading">
  <fo:block quadding="start" xsl:use-attribute-sets="title-style">
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>

<xsl:attribute-set name="title-style">
  <xsl:attribute name="font-size">12pt</xsl:attribute>
  <xsl:attribute name="font-weight">bold</xsl:attribute>
</xsl:attribute-set>

Bir özniteliğin aynı genişletilmiş isimle çok sayıda tanımı varsa bunlar birleştirilir. Yüksek ithal önceliğine sahip bir öznitelik, düşük ithal önceliğindeki bir özniteliğe göre önceliklidir. Aynı genişletilmiş isimle aynı özniteliği içeren iki öznitelik kümesinin, aynı genişletilmiş isim ve aynı öznitelikle daha yüksek ithal öncelikli bir üçüncünün yokluğunda aynı ithal önceliğine sahip olması bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, biçembentin sonuna doğru yer alan tanımlar arasından daha yüksek işlem önceliğine sahip olanını seçerek hatayı ortadan kaldırabilir. Bir öznitelik kümesinde belirtilen özniteliklerin yeri kümedeki öznitelikler bir birleşmeye konu olduklarında önem kazanır; öznitelik kümeleri kullanılırken bunun bir önemi yoktur. Bir xsl:attribute-set elemanının use-attribute-sets özniteliğinde yer alan her öznitelik kümesi ismi için, aynı isimdeki bir öznitelik kümesinin bütün tanımlarının, use-attribute-sets özniteliği, eşdeğeri olan xsl:attribute çocuk elemanlarıyla değiştirilmeden önce birleştirilmesi gerekir. Bir xsl:attribute-set elemanının use-attribute-sets özniteliğinin eşdeğeri olan xsl:attribute çocuk elemanlarıyla, bu xsl:attribute-set elemanı, aynı genişletilmiş isimli başka bir xsl:attribute-set elemanı ile birleştirilmeden önce değiştirilmesi gerekir. xsl:attribute-set elemanları aynı genişletilmiş isimli olanlarla birleştirildiğinde, bir use-attribute-sets özniteliğine değiştirilmek için eklenen her xsl:attribute çocuk elemanı, biçembentte gerçekten bir çocuk eleman olarak belirtilmiş gibi ele alınır.

7.2 Metin Oluşturma

Bir örneklenim ayrıca metin düğümleri de içerebilir. Bir örneklenimdeki her metin düğümünün boşluk karakterleri Boşluk Ayıklama bölümünde belirtildiği gibi ayıklandıktan sonra kalan dizgeyle hedef ağaçtaki metin düğümü oluşturulur. Bitişik metin düğümleri hedef ağaçta kendiliğinden birleşir.

Metnin ağaç seviyesinde işlendiğine dikkat ediniz. Bu bakımdan, bir örneklenimdeki &lt; imlenimi biçembent ağacında < karakterini içeren bir metin düğümüyle gösterilecektir. Bu, hedef ağaç bir XML belge olarak çıktılandığında, hedef ağaçta (&lt; imlenimi -veya eşdeğeri karakter gönderimi- ile gösterilecek olan) < karakterini içeren bir metin düğümü oluşturacaktır (Çıktı Önceleniminin İptal Edilmesi bölümünde belirtildiği gibi çıktı öncelenimi iptal edilmiş olmadıkça).

<!-- Grubu: yönerge -->
<xsl:text
  disable-output-escaping = "yes" | "no" >
  <!-- İçeriği: #PCDATA -->
</xsl:text>
eleman

Dizgesel sabit veri karakterleri bir xsl:text elemanında satır katlamaya konu olabilir. Satır katlama, boşluk karakterleri ayıklanarak (bkz, Boşluk Ayıklama) değiştirilebilir fakat karakterlerin XSLT işlemci tarafından sonradan nasıl elde edileceğine bir etkisi yoktur.

Not:
xml:lang ve xml:space öznitelikleri XSLT tarafından özel olarak ele alınmaz. Özellikle,

  • hedefte, xml:lang veya xml:space özniteliklerinin üretmesi gerekeni belirtmek doğrudan doğruya biçembent yazarının sorumluluğundadır;

  • XSLT isim-alanındaki bir elemanda xml:lang veya xml:space özniteliğinin belirtilmesi bu özniteliklerin hedefte de yer almasına sebep olmayacaktır.

7.3 İşlem Yönergelerinin Oluşturulması

<!-- Grubu: yönerge -->
<xsl:processing-instruction
  name = { kısa-ad } >
  <!-- İçeriği: örneklenim -->
</xsl:processing-instruction>
eleman

xsl:processing-instruction elemanı, bir işlem yönergesi düğümü oluşturmak için nesnelleştirilir. xsl:processing-instruction elemanının içeriği işlem yönergesi düğümünün dizgesel değeri için bir örneklenimdir. xsl:processing-instruction elemanının, işlem yönergesi düğümünün ismini belirtmek için kullanımı zorunlu olan bir name özniteliği vardır. name özniteliğinin değeri bir öznitelik değeri örneklenimi olarak yorumlanır.

Örneğin, bu:

<xsl:processing-instruction name="xml-stylesheet">
  href="book.css" type="text/css"
</xsl:processing-instruction>

şu işlem yönergesini oluşturacaktır:

<?xml-stylesheet href="book.css" type="text/css"?>

name özniteliğinin nesnelleştirilmesinin sonucu olan dizgenin hem bir KısaAd hem de bir PIHedefi olmaması bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, işlem yönergesini hedef ağaca ekleyerek hatayı ortadan kaldırabilir.

Not:
Bu, xsl:processing-instruction elemanının bir XML bildirimi çıktılamakta kullanılamaması demektir. Yerine xsl:output elemanı kullanılmalıdır (bkz, Çıktı).

xsl:processing-instruction içeriğinin nesnelleştirilmesinin metin düğümünden farklı bir düğüm oluşturması bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, hatalı düğümleri içerikleriyle birlikte yoksayarak hatayı ortadan kaldırabilir.

xsl:processing-instruction içeriğinin nesnelleştirilme sonucunun ?> dizgesini içermesi bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, ? karakteri ile > karakteri arasına bir boşluk yerleştirerek hatayı ortadan kaldırabilir.

7.4 Açıklamaların Oluşturulması

<!-- Grubu: yönerge -->
<xsl:comment>
  <!-- İçeriği: örneklenim -->
</xsl:comment>
eleman

xsl:comment elemanı hedef ağaçta bir açıklama oluşturmak için nesnelleştirilir. xsl:comment elemanının içeriği, açıklama düğümünün dizgesel değeri için bir örneklenimdir.

Örneğin, bu:

<xsl:comment>This file is automatically generated. Do not edit!</xsl:comment>

şu açıklamayı üretecektir:

<!--This file is automatically generated. Do not edit!-->

xsl:comment içeriğinin nesnelleştirilmesinin metin düğümünden farklı bir düğüm oluşturması bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, hatalı düğümleri içerikleriyle birlikte yoksayarak hatayı ortadan kaldırabilir.

xsl:comment içeriğinin nesnelleştirilme sonucunun -- dizgesini içermesi bir hatadır. Bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, - karakterlerinin arasına bir boşluk yerleştirerek hatayı ortadan kaldırabilir.

7.5 Kopyalama

<!-- Grubu: yönerge -->
<xsl:copy
  use-attribute-sets = nitelikli-adlar >
  <!-- İçeriği: örneklenim -->
</xsl:copy>
eleman

xsl:copy elemanı, geçerli düğümün kopyalanmasını kolaylaştıran bir yol sağlar. xsl:copy elemanının nesnelleştirilmesi, geçerli düğümün bir kopyasını oluşturur. Geçerli düğümün isim-alanı düğümleri de kendiliğinden kopyalanır, fakat öznitelikler ve düğümün çocukları kendiliklerinden kopyalanmazlar. xsl:copy elemanının içeriği, oluşturulan düğümün öznitelikleri ve çocukları için bir örneklenimdir; içerik sadece özniteliklerin ve çocukların sahip olabileceği türdeki düğümler için nesnelleştirilir (örn, kök düğüm ve eleman düğümleri için).

xsl:copy elemanı bir use-attribute-sets özniteliğine sahip olabilir (bkz, İsimli Öznitelik Kümeleri). Bu sadece eleman düğümleri kopyalanırken kullanılır.

Kök düğüm özel olarak ele alınır, çünkü hedef ağacın kök düğümü örtük olarak oluşturulur. Geçerli düğüm, kök düğüm olduğu takdirde, xsl:copy bir kök düğüm oluşturmayacak, sadece içerik örneklenimini kullanacaktır.

Örneğin, özdeşlik dönüşümü xsl:copy kullanılarak şöyle yazılabilir:

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

Geçerli düğüm bir öznitelik olduğunda, geçerli düğümle aynı isimde bir öznitelik oluşturmak için xsl:attribute kullanmak bir hata olsaydı, xsl:copy kullanmak da bir hata olurdu (bkz, Özniteliklerin xsl:attribute ile Oluşturulması).

Aşağıdaki örnekte, xml:lang özniteliklerinin nasıl kolayca kaynaktan hedefe kopyalanabileceği gösterilmiştir. Bir biçembent şöyle bir isimli örneklenim tanımlasaydı:

<xsl:template name="apply-templates-copy-lang">
 <xsl:for-each select="@xml:lang">
   <xsl:copy/>
 </xsl:for-each>
 <xsl:apply-templates/>
</xsl:template>

xml:lang özniteliği kopyalanmak istendiği takdirde, bunun yerine:

<xsl:apply-templates/>

bu daha basit olurdu:

<xsl:call-template name="apply-templates-copy-lang"/>

Geçerli düğüm bir isim-alanı düğümü olduğu takdirde, kopyalama işlemi, hedef ağaçta içerilen düğüme bir isim-alanı düğümü ekler. Bunun içerildiği düğümün bir eleman olmaması bir hatadır; gerçeklenimler hatayı raporlayabilir veya isim-alanı düğümünü yoksayabilir. Bir isim-alanı düğümünü bir elemana çocuklarını veya özniteliklerini eklendikten sonra eklemek bir hatadır; gerçeklenimler hatayı raporlayabilir veya isim-alanı düğümünü yoksayabilir. Bir isim-alanı düğümünü, aynı isimde bir isim-alanına zaten sahip olan bir elemana eklemek, her iki isim-alanı düğümü aynı dizgesel değere sahip olmadıkça (bu durumda yineleme yok sayılır), bir hatadır. Bir isim-alanı düğümünü bir elemana eklemek, eğer isim-alanı düğümünün ismi tanımsızsa ve eleman bir tanımsız isim-alanı tanım-yerine sahipse, bir hatadır.

7.6 Üretilen Metnin Hesaplanması

Bir örneklenim içinde, xsl:value-of elemanı üretilen metni hesaplamakta kullanılabilir; örneğin, metni kaynak ağaçtan çekip çıkarmak veya bir değişkene bir değer yerleştirmek için kullanılabilir. xsl:value-of elemanı bunu, select özniteliğine değer olarak belirtilen bir ifade ile yapar. İfadeler ayrıca, birebir hedef elemanların öznitelikleri içinde kaşlı ayraçlarla ({}) sarmalanarak kullanılabilir.

7.6.1 Metnin xsl:value-of ile Üretilmesi

<!-- Grubu: yönerge -->
<xsl:value-of
  select = dizgesel-ifade
  disable-output-escaping = "yes" | "no" />
eleman

xsl:value-of elemanı hedef ağaçta bir metin düğümü oluşturmak için nesnelleştirilir. Belirtilmesi zorunlu olan select özniteliği bir ifade olup değerlendirilmesiyle elde edilen nesne string işlevi çağrılmış gibi bir dizgeye dönüştürülür. Bu dizge oluşturulan metin düğümünün dizgesel değerini belirtir. Dizge boşsa bir metin düğümü oluşturulmaz. Oluşturulan metin düğümü bitişik metin düğümü komşuları ile birleşir.

xsl:copy-of elemanı bir düğüm kümesini bir dizgeye dönüştürmeksizin hedef ağaca kopyalamak için kullanılabilir. Daha fazla bilgi için Değişken ve Değergeçlerin Değerlerinin xsl:copy-of ile Kullanımı bölümüne bakınız.

Aşağıdaki örnekte, adı ve soyadı özniteliklerine sahip kişi elemanından bir HTML paragrafı oluşturulmaktadır. Paragraf geçerli düğümün adı ve soyadı özniteliklerinin değerleri arasında bir boşluk karakteri içerecektir.

<xsl:template match="kişi">
  <p>
   <xsl:value-of select="@adı"/>
   <xsl:text> </xsl:text>
   <xsl:value-of select="@soyadı"/>
  </p>
</xsl:template>

Başka bir örnek olarak aşağıda aynı paragraf kişi elemanının adı ve soyadı çocuk elemanlarının dizgesel değerleri ile oluşturulmaktadır.

<xsl:template match="kişi">
  <p>
   <xsl:value-of select="adı"/>
   <xsl:text> </xsl:text>
   <xsl:value-of select="soyadı"/>
  </p>
</xsl:template>

Aşağıdaki örnekte, her işlem elemanı için metnin başına işlemin güvenlik seviyesini belirten bir paragraf yerleştirilmektedir. Burada, işleme uygulanacak güvenlik seviyesinin işlem elemanının kendisindeki veya bir üstselindeki güvenlik özniteliğinden elde edildiği kabul edilmektedir. Eğer birden fazla güvenlik özniteliği belirtilmişse işleme en yakın elemanın güvenlik özniteliğinin değeri kullanılmaktadır.

<xsl:template match="işlem">
  <fo:block>
    <xsl:value-of select="ancestor-or-self::*[@güvenlik][1]/@güvenlik"/>
  </fo:block>
  <xsl:apply-templates/>
</xsl:template>

7.6.2 Öznitelik Değeri Örneklenimleri

Bir öznitelik değeri örneklenimi olarak yorumlanan bir öznitelik değerinde, örneğin, bir birebir hedef elemanın bir özniteliğinin değeri olarak, bir ifade kaşlı ayraçlar ({}) arasında kullanılabilir. Öznitelik değeri örneklenimi, kaşlı ayraçlarla birlikte ifadenin yerine, ifadenin değerlendirilme sonucunun string işlevi çağrılmış gibi bir dizgeye dönüştürülmesiyle elde edilen dizge yerleştirilerek nesnelleştirilir. Bir XSLT biçembendinde bir öznitelik değerindeki kaşlı ayraçların, öznitelik özellikle, bir öznitelik değeri örneklenimi olarak yorumlanan bir öznitelik olmadıkça özel bir anlamı yoktur; eleman sözdizimi özetinde, böyle özniteliklerin değeri kaşlı ayraçlarla sarmalanır.

Not:
Tüm öznitelikler birer öznitelik değeri örneklenimi olarak yorumlanmaz. Değeri bir ifade veya örüntü olan öznitelikler, tepe-seviyeden elemanların öznitelikleri ve isimli XSLT nesnelerine atıfta bulunan öznitelikler öznitelik değeri örneklenimi olarak yorumlanmaz. Ek olarak, xmlns öznitelikleri de öznitelik değeri örneklenimi olarak yorumlanmaz; çünkü yorumlansaydı XML İsim-alanları Önergesi ile uyumluluk sağlanamazdı.

Aşağıdaki örnekte, kaynak içeriğindeki photograph elemanından bir img hedef elemanı oluşturulmaktadır; img elemanının src özniteliğinin değeri image-dir değişkeninin değerinden ve photograph elemanının href çocuğunun dizgesel değerinden hesaplanmakta; width özniteliğinin değeri ise, photograph elemanının size çocuğunun width özniteliğinin değerinden hesaplanmaktadır:

<xsl:variable name="image-dir">/images</xsl:variable>

<xsl:template match="photograph">
<img src="{$image-dir}/{href}" width="{size/@width}"/>
</xsl:template>

biçembendi ile

<photograph>
  <href>headquarters.jpg</href>
  <size width="300"/>
</photograph>

kaynak içeriğinden hedef ağaçta

<img src="/images/headquarters.jpg" width="300"/>

düğümü elde edilmektedir.

Bir öznitelik değeri örneklenimi nesnelleştirildiğinde, ifadeyi sarmalayan kaşlı ayraçlar çifter çifter ise bunlar birer kaşlı ayraç olarak ele alınır. Bir öznitelik değeri örnekleniminin ifadesi içinde bir kapatan kaşlı ayracın yer alıp, ifadenin dışında kapatan kaşlı ayracın bulunmaması bir hatadır. Bir ifadedeki bir DizgeselSabit içinde yer alan bir kapatan kaşlı ayraç ifadeyi sonlandıran kaşlı ayraç olarak ele alınmaz.

İfadelerin içindeki kaşlı ayraçlar tanınmazlar. Örneğin, buna

<a href="#{id({@ref})/title}">

izin verilmez. Yerine bunu kullanın:

<a href="#{id(@ref)/title}">

7.7 Numaralama

<!-- Grubu: yönerge -->
<xsl:number
  level = "single" | "multiple" | "any"
  count = örüntü
  from = örüntü
  value = sayısal-ifade
  format = { dizge }
  lang = { ad-dizgeciği }
  letter-value = { "alphabetic" | "traditional" }
  grouping-separator = { karakter }
  grouping-size = { sayı } />
eleman

xsl:number elemanı hedef ağaca biçimli bir numara yerleştirmek için kullanılır. Yerleştirilecek numara bir ifade tarafından belirtilir. Bu ifadeyi value özniteliği içerir. İfadenin değerlendirilmesinin sonucu olan nesne number işlevi çağrılmış gibi bir sayıya dönüştürülür. Sayının NaN, sonsuz veya 0.5'ten küçük olması bir hatadır; bir XSLT işlemci bu hatayı raporlayabilir; raporlamıyorsa, sayıyı string işlevi çağrılmış gibi dizgeye dönüştürüp hedef ağaca yerleştirerek hatayı ortadan kaldırmalıdır. Aksi takdirde, sayı bir tamsayıya yuvarlanır ve Sayıdan Dizgeye Dönüşüm Öznitelikleri bölümünde belirtilen öznitelikler kullanılarak bir dizgeye dönüştürülür; bu bağlamda, bu özniteliklerin her birinin değeri, bir öznitelik değeri örneklenimi olarak yorumlanır. Dönüşümden sonra, elde edilen dizge hedef ağaca yerleştirilir. Örneğin, aşağıda sıralı bir listenin üyeleri numaralanmaktadır:

<xsl:template match="items">
  <xsl:for-each select="item">
    <xsl:sort select="."/>
    <p>
      <xsl:number value="position()" format="1. "/>
      <xsl:value-of select="."/>
    </p>
  </xsl:for-each>
</xsl:template>

Eğer value özniteliği belirtilmezse, xsl:number elemanı geçerli düğümün kaynak ağacındaki konumuna karşılık gelen sayıyı bir numara olarak hedef ağaca yerleştirir. Aşağıdaki öznitelikler geçerli düğümün nasıl numaralanacağını denetler:

Ek olarak, Sayıdan Dizgeye Dönüşüm Öznitelikleri bölümünde belirtilen öznitelikler, value özniteliğinin belirtilmesi halinde sayıyı dizgeye dönüştürmek için kullanılırlar.

xsl:number elemanı önce level, count ve from özniteliklerini kullanarak bir liste oluşturur:

Bundan sonra, numara listesi Sayıdan Dizgeye Dönüşüm Öznitelikleri bölümünde belirtilen öznitelikler kullanılarak bir dizgeye dönüştürülür; bu bağlamda, bu özniteliklerin her birinin değeri, bir öznitelik değeri örneklenimi olarak yorumlanır. Dönüşümden sonra, elde edilen dizge hedef ağaca yerleştirilir.

Aşağıda numaralı bir listenin üyeleri numaralanmaktadır:

<xsl:template match="ol/item">
  <fo:block>
    <xsl:number/><xsl:text>. </xsl:text><xsl:apply-templates/>
  </fo:block>
<xsl:template>

Aşağıdaki iki kural başlık elemanlarını numaralayacaktır. Anabölüm ve ekbölümlerden oluşan bir belgede, anabölümlerin ve ekbölümlerin bölümlere, bu bölümlerinde altbölümlere sahip olduğu düşünülerek, anabölümler 1, 2, 3; ekbölümler A, B, C; anabölüm bölümleri 1.1, 1.2, 1.3; ve ekbölüm bölümlerinin de A.1, A.2, A.3 biçiminde numaralanacakları düşünülmüştür.

<xsl:template match="başlık">
  <fo:block>
     <xsl:number level="multiple"
                 count="anabölüm|bölüm|altbölüm"
                 format="1.1 "/>
     <xsl:apply-templates/>
  </fo:block>
</xsl:template>

<xsl:template match="ekbölüm//başlık" priority="1">
  <fo:block>
     <xsl:number level="multiple"
                 count="ekbölüm|bölüm|altbölüm"
                 format="A.1 "/>
     <xsl:apply-templates/>
  </fo:block>
</xsl:template>

Aşağıdaki örnekte bir anabölüm içindeki notlar numaralanmaktadır:

<xsl:template match="not">
  <fo:block>
     <xsl:number level="any" from="anabölüm" format="(1) "/>
     <xsl:apply-templates/>
  </fo:block>
</xsl:template>

Aşağıdaki örnekte HTML'deki H4 elemanları üç parçalı bir madde başlığı ile numaralanmaktadır:

<xsl:template match="H4">
 <fo:block>
   <xsl:number level="any" from="H1" count="H2"/>
   <xsl:text>.</xsl:text>
   <xsl:number level="any" from="H2" count="H3"/>
   <xsl:text>.</xsl:text>
   <xsl:number level="any" from="H3" count="H4"/>
   <xsl:text> </xsl:text>
   <xsl:apply-templates/>
 </fo:block>
</xsl:template>

7.7.1 Sayıdan Dizgeye Dönüşüm Öznitelikleri

Aşağıdaki öznitelikler bir numara listesinin dizgeye dönüşümünü denetlemekte kullanılırlar. Numaralar sıfırdan büyük tamsayılardır. Özniteliklerin hepsi isteğe bağlıdır.

Ana öznitelik format olup öntanımlı değeri 1'dir. format özniteliği bir dizgecik dizisine bölünmüştür; buradaki her dizgecik ya olası en çok sayıda abecesayısal karakterden ya da olası en çok sayıda abecesayısal olmayan karakterden oluşur. Abecesayısal, Unicode kategorileri Nd, Nl, No, Lu, Ll, Lt, Lm veya Lo olan karakterler anlamındadır. Abecesayısal dizgecikler (biçim dizgecikleri) listedeki her numara için kullanılacak biçimi belirtirler. Eğer ilk dizgecik bir abecesayısal olmayan dizgecikse, oluşturulacak dizge bu dizgecikle başlar; eğer son dizgecik bir abecesayısal olmayan dizgecikse, oluşturulacak dizge bu dizgecikle biter. İki biçim dizgesi arasında yer alan abecesayısal olmayan dizgecikler, listedeki numaraları birbirine bağlamakta kullanılan ayraçlardır. n'inci biçim dizgesi listedeki n'inci numarayı biçimlemekte kullanılır. Eğer biçim dizgeciklerinden daha fazla numara varsa, son biçim dizgeciği kalan numaraları biçimlemekte kullanılır. Hiç biçim dizgeciği yoksa, bütün numaraları biçimlemek için biçim dizgeciği olarak 1 kullanılır. Biçim dizgeciği 1 sayısını göstermekte kullanılacak dizgeciği belirtir. İlkinden sonraki her numara, önceki numaradan ayraç dizgeciği ile ayrılır. Bir ayraç dizgeciği yoksa . (nokta) kullanılır.

Biçim dizgecikleri, HTML 4.0'daki OL elemanının type özniteliği için izin verilen değerlerin bir üstkümesidir ve şöyle yorumlanır:

  • Eğer bir biçim dizgeciğinin son karakterinin onluk rakam değeri 1 (Unicode karakter varlığı veritabanında belirtildiği gibi) ise ve sondan önceki karakterlerin Unicode değeri son karakterin Unicode değerinden 1 azsa o zaman bu dizgeciğe göre biçimlenen herhangi bir sayının onluk gösterimi en az biçim dizgeciği uzunluğundadır. Bu bakımdan, 1 biçim dizgeciği 1 2 ... 10 11 12 ... dizisini üretirken, 01 biçim dizgeciği 01 02 ... 09 10 11 12 ... 99 100 101 dizisini üretecektir.

  • A biçim dizgeciği A B C ... Z AA AB AC... dizisini üretir.

  • a biçim dizgeciği a b c ... z aa ab ac... dizisini üretir.

  • i biçim dizgeciği i ii iii iv v vi vii viii ix x ... dizisini üretir.

  • I biçim dizgeciği I II III IV V VI VII VIII IX X ... dizisini üretir.

  • Bunlar dışında herhangi bir biçim dizgeciği o dizgecikle başlayan bir dizi üretir. Bu numaralama dizisini desteklemeyen gerçeklenimler 1 biçim dizgeciğini kullanmalıdır.

Bir abecesayısal dizi numaralanırken, lang özniteliği hangi dilin elifbasının kullanılacağını belirtir; xml:lang [XML] ile aynı aralıktaki değerler kullanılır; hiç lang değeri belirtilmemişse, dil, sistem ortamından saptanır. Gerçeklenimciler hangi dili desteklediklerini belgelemelidirler.

Not:
Gerçeklenimciler belli bir dilde nasıl numaralama yapılacağına ilişkin herhangi bir kabulde bulunmamalıdırlar ve desteklemek istedikleri dilleri gerektiği gibi araştırmalıdırlar. Çoğu dilin numaralama uzlaşımları İngilizce'dekinden çok farklıdır.

letter-value özniteliği, harflerin kullanıldığı numaralama dizileri arasındaki belirsizliği ortadan kaldırır. Çoğu dilde, harflerin kullanıldığı numaralama dizileri başlıca iki çeşittir. Birinde, harflere abecesel sıraya göre sayısal değer atanırken, diğerinde sayısal değerler dildeki geleneksel anlamlandırmaya göre atanırlar. İngilizce'de bu iki çeşide ait biçim dizgecikleri a ve i'dir. Bazı dillerde dizilerin ilk üyesi aynıdır ve dolayısıyla biçim dizgeciği tek başına belirleyici olmaz. alphabetic değeri abecesel sıralamayı, traditional değeri ise diğer sıralamayı belirtir. Eğer letter-value özniteliği belirtilmemişse, belirsizliğin nasıl çözümleneceği gerçeklenime bağlıdır.

Not:
İki uyumlu XSLT işlemcisinin bir sayıyı tamamen aynı dizgeye dönüştürmemesi olasıdır. Bazı XSLT işlemci bazı dilleri desteklemeyebilir. Bundan başka, belli bir dildeki biçim çeşitlemelerini gerçekleştirecek dönüşümleri belirtmek için xsl:number öznitelikleri yeterli olmayabilir. Gerçeklenimler, bunun için xsl:number üzerinde gerçeklenime özgü isim-alanlı öznitelikler kullanabilirler.

grouping-separator özniteliği onluk numaralama dizilerinde gruplama ayracı (binler ayracı gibi) olarak kullanılacak bir ayraç belirtilebilmesini ve isteğe bağlı olan grouping-size özniteliği ise ile gruplama miktarının (normalde 3'tür) belirtilebilmesini mümkün kılar. Örneğin, grouping-separator="," ve grouping-size="3" belirtimi 1,000,000 biçiminde bir sayı üretecektir. Bu ikisinden biri tek başına kullanılırsa yoksayılır.

Bazı dönüşüm belirtimi örnekleri:

  • format="&#x30A2;" Katakana numaralaması belirtir

  • format="&#x30A4;" Katakana numaralamasını "iroha" sıralamasıyla belirtir

  • format="&#x0E51;" Tay rakamlı numaralama belirtir

  • format="&#x05D0;" letter-value="traditional" İbranice "geleneksel" numaralama belirtir

  • format="&#x10D0;" letter-value="traditional" Gürcü tarzı numaralama belirtir

  • format="&#x03B1;" letter-value="traditional" "klasik" Yunan numaralaması belirtir

  • format="&#x0430;" letter-value="traditional" eski Slav tarzı numaralama belirtir

ÖncekiYukarıSonraki
İsimli ÖrneklenimlerBir Linux Kitaplığı SayfasıYineleme