BilgiTeknoloji.net    
b i l g i   t e k n o l o j i   y a z ı l ı m

Ana Sayfa

Marjinal XML Access Pratik Uygulamalar Projeler Ekonometri Dilimiz Çetrefil İletişim
 

XPath İşlevleri


Kursumuzun bu ayki yazısında genel XPath işlevlerinin tamamına gözatıyoruz.


GENEL XPATH İŞLEVLERİ

XPath işlevleri temelde dört sınıfa ayrılırlar:

  • Düğüm kümesi işlevleri
  • Metin işlevleri
  • Sayı işlevleri
  • Evet/Hayır (Boolean) işlevleri

Bu sınıflandırma, W3.Org belgelerinde de aynı şekildedir. Düğüm kümesi işlevleri genel olarak düğüm kümeleri ile çalıştıkları için bu şekilde adlandırılmışlardır. Diğerleri için de benzer durum vardır.

Tüm genel XPath işlevleri 27 adettir. XPath işleyen uygulamalar için ise bunlara yenileri ilave edilebilmektedir. Fakat böyle durumlarda o uygulamaya bağımlı kalınmaktadır. Aşağıda ayrıntılı olarak açıklanan bu 27 işlev ise tüm XPath uygulamalarında geçerlidir.

İşlev

Sonuç Türü

Açıklama

XPath ya da XSL Örneği

Düğüm Kümesi İşlevleri

 

7 adet.

 

count(koşul)

Sayı

Belirtilen koşula uygun düğüm adedini getirir. Bu adet üretilen düğüm kümesinde en üstte bulunan kardeş öğelerdir.

Toplam kitap adedi:
xsl:value-of select="count(/KITAPLAR/KITAP)"/>

position()

Sayı

Düğümün kardeşleri arasındaki sırasını belirtir. XPath sorgularında belli bir sıradaki öğeyi getirmek için kullanılabilir. Köşeli parantez içinde yalnızca sayı kullanıldığı durumlarda sorgu otomatik olarak position() sorgusuna çevrilir.

Güncel kitabın sıra numarası:
<xsl:value-of select="position()"/> 

Dördüncü sıradaki kitap
//KITAP[position()=4]
ya da
//KITAP[4] 

last()

Sayı

Kardeş düğümlerin adedini verir. İlk bakışta son düğümü getirmesi gerektiği şeklinde bir izlenim doğursa da, ürettiği sayı bilgisi, son düğüme ulaşmak için kullanılabilir.

Son kitap ve sondan bir önceki kitap:
//KITAP[last()]
//KITAP[last()-1]
//KITAP[position()=last()] 

Gruptaki toplam öğe adedi:
<xsl:value-of select="last()"/>

id(değer)

Düğüm kümesi

DTD tanımlamasında ID olarak belirtilmiş benzersiz öznitelik alanlarında arama yapar ve bulursa yalnızca ilgili tek öğeyi getirir. (Yazının devamında incelenmiştir.)

id("benzersiz değer")

local-name(düğüm kümesi)

Metin

Bu deyim doğrudan XML belgesindeki öğe adını işaret eder. Bir döngü içinde kullanıldığında aktif kümenin adını döndürür. Belli bir addaki öğelere ulaşmayı sağlasa da kursun önceki yazılarından öğrendiklerimizden sonra buna pek ihtiyacımız olmayabilir. Doğrusu local-name'nin faydası belge içinde farklı sözlük alanları kullandığımızda karşımıza çıkacak. (İleride ayrıntılı işleyeceğimiz sözlük alanları konusunda buna tekrar döneceğiz.)

xsl:value-of select="local-name()"/>

xsl:value-of select="local-name(/KITAPLAR/KITAP)"/>

xsl:value-of select="//*[local-name()='YAZARADI']"/>

namespace-uri(düğüm kümesi)

Metin

Local-name() ile benzer şekilde çalışır fakat öğe adını değil, öğe tanımlamasının ait olduğu sözlük alanının adını verir.

 

name(düğüm kümesi)

Metin

Öğenin adını, ait olduğu sözlük alanı adı ile birlikte döndürür. (Daha sonraki sözlük alanları konusunda işleyeceğiz.)

 

 

 

 

 

Metin İşlevleri

 

10 adet.

 

string(deyim)

Metin

Bir sayıyı, düğüm kümesini veya başka bir değeri metne dönüştürür. Düğüm kümesi olduğunda kümedeki tüm değerler birleşmiş halde getirilir.

<xsl:value-of select="string(/KITAPLAR/KITAP)"/>

concat(metin, metin, metin, ...)

Metin

Geçiş değeri olarak verilen iki ya da fazla sayıda değeri birleştirir.

<xsl:value-of select="concat(KITAPADI, ' ', YAZAR, ' ', YAYINEVI)"/>

starts-with(asıl metin, aranacak metin)

Evet/Hayır

Verilen metin bilgisinin başında başka bir metni arar ve bulursa true, bulamazsa false getirir.

starts-with(KITAPADI,'Şehir')
Kitap 'Şehir' ile başlıyorsa true gelir.

contains(asıl metin, aranacak metin)

Evet/Hayır

Verilen metin bilgisinin içinde başka bir metni arar ve bulursa true, bulamazsa false getirir.

contains(KITAPADI,'Romantiğinin')
Kitap adında 'Romantiğinin' geçiyorsa true gelir.

substring(metin, sıra, adet)

Metin

Bir metin bilgisinin belli sıradan itibaren belli sayıdaki karakterini getirir.

substring(KITAPADI, 10, 5)
Onuncu sıradan itibaren beş karakter.

substring-after(asıl metin, aranacak metin)

Metin

Bir metin bilgisi içinde başka bir metni arayıp bulduktan sonra bulduğu sıradan sonrasını getirir. Bulamazsa boş gelir.

substring(YAYINEVI, 'Doğan')
Yayınevi bilgisi 'Doğan Kitap' ise dönen değer ' Kitap' olur.

substring-before(asıl metin, aranacak metin)

Metin

Bir metin bilgisi içinde başka bir metni arayıp bulduktan sonra bulduğu sıradan öncesini getirir. Bulamazsa boş gelir.

substring(YAYINEVI, 'Kitap')
Yayınevi bilgisi 'Doğan Kitap' ise dönen değer 'Doğan ' olur.

string-length(metin)

Sayı

Verilen metin bilgisinin uzunluğunu getirir.

string-length(KITAPADI)
'Kar' kitabı için 3, 'Stratejik İttifak' için 17.

normalize-space(metin)

Metin

Öğe bilgisi içinde bulunan fazla boşlukları çıkarır.

normalize-space(/KITAPLAR/KITAP)

translate(asıl metin, değiştirilecek karakterler, yeni karakterler)

Metin

Metin bilgisi içindeki, belirtilen karakterleri yenileriyle değiştirir. Özellikle Türkçe karakterleri çevirmek gerektiği durumlarda işe yarayabilir.

translate(KITAPADI,'ğĞıİşŞ','gGiIsS')
"Şehir Romantiğinin Günlüğü" yerine "Sehir Romantiginin Günlügü" yazılıyor.

 

 

 

 

Sayı İşlevleri

 

5 adet.

 

number(deyim)

Sayı

Deyimin değerini sayısal değere dönüştürür. Rakamlarla ifade edilen bir metni doğrudan karşılık gelen sayıya, true değerlerini 1'e, false değerlerini 0'a dönüştürür. Dönüşüm yapılamayan ve sayısal karşılığı olmayan bilgiler için Nan değerini getirir.

 

sum(düğüm kümesi)

Sayı

Sayısal bilgi içeren düğüm kümelerinin değerlerini toplar.

<xsl:value-of select="sum(//FIYAT)"/>

floor(sayı)

Sayı

Ondalık sayıları geriye yuvarlar. (Taban)

floor(15.7) = 15
floor(-4.3) = -5

ceiling(sayı)

Sayı

Ondalık sayıları ileriye yuvarlar. (Tavan)

floor(15.3) = 16
floor(-4.7) = -4

round(sayı)

Sayı

Ondalık sayıları en yakın tamsayıya yuvarlar.

floor(15.7) = 16
floor
(-4.7) = -5

 

 

 

 

Evet/Hayır (Boolean) İşlevleri

 

5 adet.

 

boolean(deyim)

Evet/Hayır

Belirtilen deyimi evet/hayır tipine dönüştürür. Deyim bir düğüm kümesini ifade ediyorsa düğüm kümesinin olup olmadıığını kontrol eder ve küme boş değilse true, boş ise false döndürür. Arama sonucu öğelerin bulunup bulunmadığını kontrol etmekte kullanılabilir.

boolean(/KITAPLAR/KITAP/FIYAT)
Kitap öğelerinin Fiyat adlı bir alt öğesi var mı?  

<xsl:value-of select="boolean(CEVIREN)"/>
Aktif döngüde CEVIREN öğesi var mı?

not(evet/hayır)

Evet/Hayır

Aldığı evet/hayır deyimini tersine çevirir.

<xsl:value-of select="not(boolean(CEVIREN))"/>
CEVIREN öğesi varsa False getir.

true()

Evet/Hayır

Doğrudan evet/hayır türünde true değeri getirir. Genelde diğer deyimlerin içinde kullanılır.

 

false()

Evet/Hayır

Doğrudan evet/hayır türünde false değeri getirir. Genelde diğer deyimlerin içinde kullanılır.

 

lang(deyim)

Evet/Hayır

Belirtilen düğüm için dil bilgisinin tanımlı olup olmadığı hakkında bilgi verir. (Bu işlev de sözlük alanları konusunda daha ayrıntılı incelecek.)

 

 

TANIMLAYICI ÖZNİTELİKLER - ID İŞLEVİ - ID DEYİMİ

XML belgelerinde öğelere doğrudan ulaşmayı kolaylaştıran tanımlayıcı öznitelikler oluşturulmasına izin verilir. Bunun için DTD belge türü tanımlaması kullanılır. Bu yöntem XPath ya da Dom ile çalışırken öğelere doğrudan ve kolayca ulaşılmasını sağlar.

Öncelikle XML belgesi içinde öğeleri tanımlayıcı bir özniteliğin olup olmadığına bakmak gerekir. Benzersiz ve sizin tanımlama kurallarınıza uygun bir öznitelik varsa bunun tanımlayıcı öznitelik olmasına karar verebilirsiniz.

Tanımlayıcı öznitelikler DTD tanımlama bölgesinde ID deyimi ile birlikte yer alırlar. Kursumuzun başında işlediğimiz DTD konusunda, hatırlayacağınız üzere ATTLIST ile öznitelik tanımlarken CDATA deyimini kullanmıştık. Tanımlayıcı öznitelikler için CDATA yerine ID kullanmak kâfidir. Tanımlayıcı öznitelik olarak seçtiğimiz KOD değerleri için öznitelik tanımlamamız aşağıdaki gibi oldu:

<!ATTLIST KITAP 
      KOD ID #REQUIRED>

Tanımlayıcı öznitelikler, öğeleri kesinlikle işaret ettikleri için bir belgede aynı kapsamda aynı değeri taşıyan birden fazla tanımlayıcı öznitelik bulunamaz. ID ile belirtilen tanımlayıcı öznitelikler aslında girilmesi zorunlu alanlar değildirler. Yani tanımlama bölgesinde #REQUIRED yerine #IMPLIED kullanılabilir. Tanımlayıcı alanların genelde boş bırakılmaması gerekse de yalnızca birkaç öğeye doğrudan ulaşılması gereken durumlar için alanın giirlmesi zorunlu olmayacaktır.

XPATH ve XSL'de ID işlevini kullanmadan önce, içinde DTD tanımlaması olan kitaplar belgemizi inceleyin.

<?xml version="1.0" encoding="ISO-8859-9"?>
<!DOCTYPE KITAPLAR
[
<!ELEMENT KITAPLAR (KITAP*)>
<!ELEMENT KITAP (KITAPADI, YAZAR, YAYINEVI)>
<!ATTLIST KITAP
  KOD ID #REQUIRED
  SAYFA CDATA #IMPLIED>
<!ELEMENT KITAPADI (#PCDATA)>
<!ELEMENT YAZAR (#PCDATA)>
<!ELEMENT YAYINEVI (#PCDATA)>
]>
<KITAPLAR>
   ...
   <KITAP KOD="STRITF" SAYFA="350">
      <KITAPADI>Stratejik İttifak</KITAPADI>
      <YAZAR>Alptekin Dursunoğlu</YAZAR>
      <YAYINEVI>Anka</YAYINEVI>
   </KITAP>
   <KITAP KOD="KLCYAR" SAYFA="300">
      <KITAPADI>Kılıç Yarası Gibi</KITAPADI>
      <YAZAR>Ahmet Altan</YAZAR>
      <YAYINEVI>Can</YAYINEVI>
   </KITAP>
   <KITAP KOD="SHRROM" SAYFA="280">
      <KITAPADI>Şehir Romantiği..</KITAPADI>
      <YAZAR>Buket Uzuner</YAZAR>
      <YAYINEVI>Remzi</YAYINEVI>
   </KITAP>   ...
</KITAPLAR>

Tanımlayıcı öznitelik kullanıldığı durumlarda öğeye doğrudan erişmek ID işlevi ile mümkün oluyor. DOM bileşeninin SelectNodes işlevinde aşağıdaki deyim kullanıldığında ilgili öğeye doğrudan ulaşılabiliyor.

  xml.SelectNodes("id('KLCYAR')")

Bu sorgu aşağıdakinden başkasını üretmeyecektir.

<KITAP KOD="KLCYAR" SAYFA="300">
   <KITAPADI>Kılıç Yarası Gibi</KITAPADI>
   <YAZAR>Ahmet Altan</YAZAR>
   <YAYINEVI>Can</YAYINEVI>
</KITAP>

Üsttekinin aynısı tabii ki XSL'deki süzme gibi işlemler için de geçerlidir.

<xsl:template match="id('KLCYAR')"> 

ATTLIST tanımlamasında ID ile tanımlanana alanı, XPATH'in id işlevi anlayacak ve aradığı öğeyi bulacaktır. Bu işlev kullanılırken anahtar bilginin tamamının belirtilmesi gerektiğini, metnin bir kısmını belirterek arama yapılamayacağını unutmayın.

Sonuçta XPATH'in id işlevi uygun öğeyi bulursa yalnızca onu getirecektir, bulamazsa herhangi bir şey getirmeyecektir.


Serkan ŞAHİNOĞLU
(Chip Dergisi, Kasım 2002)


http://BilgiTeknoloji.net