|
|
||||||||||||
|
|
Şemalarda Öğe ve Tip Tanımlamaları Şemaları oluşturan en temel bileşenler öğeler ve tip tanımlarıdır. Karmaşık bir şema, genel tip tanımları oluşturularak anlaşılır bir yapıya dönüştürülebilir. Bu ayki dersimizde şemalarda öğelerin, tiplerin genel olarak nasıl tanımlandığını ve değerleri kısıtlama yöntemlerini inceliyoruz.
Bir şema belgesi temel olarak öğe tanımlarından oluşur. Her öğe için mutlaka bir tip tanımlaması mevcuttur. Bunlar şemalara özgü yerleşik tipler olabileceği gibi, yerleşik tiplerden türetebileceğimiz yeni tipler de olabilir. Sonrasında öğelerin tip bilgisini ifade yerlere yerleşik tip adı yerine türetilmiş yeni tip adları yazılarak belge düzenlenebilir. Türetilmiş tipler şema yazınında gerçekte 'özel tip' olarak ifade edilirler ve bir özel tip üst seviyede tanımlanıp adlandırıldığında bunu farklı yerlerde kullanmak mümkün olur. Bir tip tanımlamasını adlandırmanın amacı, şablonun farklı yerlerinde geçen benzer tipler için türetme yaparak ya da doğrudan, aynı tanımlamayı birçok yerde kullanmayı sağlamaktır. Adlandırılmış tipler bu yönleriyle türetilmiş olarak kabul edilebilirler. Bununla birlikte adlandırılmış tiplerden de türetmeler yapılarak yeni tipler üretilebilir. Bir şema belgesi en basit şekliyle sadece öğe tanımlamalarının açıkça
yazılması ile oluşabilir. Belgenin yapısal, kısa, korumalı ve hatta akıllı
olmasını sağlayacak belirtimler ise belgeyi açık yazımdan uzaklaştıracak
olanlardır. GENEL BAKIŞ Şemalar tam anlamıyla xml belgeleridir. Hatırlayacağınız gibi bu, Schema'nın DTD'ye göre üstünlüklerindendir. Şemalarda kök öğe 'xsd:schema'dır (aslında sadece 'schema'). Bütün tanımlamalar kök öğe içinde yer alır. Gerekli sözlük alanları da yine kök öğeye eklenen öznitelikler yoluyla bildirilir. Birbirine bağlı xml ve şema (xsd) belgelerinin aşağıdakine benzer şekilde olması gerektiğini kursumuzun önceki derslerinden hatırlayın. Bir şema ile xml belgesini bağlamak için her iki belgenin başlangıcında birtakım eklemeler yapmak gerekir. XML belgesinde kök öğeye xmlns:xsi ve xsi:noNamespaceSchemaLocation özniteliklerini eklemek yeterlidir. Şema belgesinde ise kök öğe olan xsd:schema'ya xmlns:xsd ve elementFormDefault özniteliklerini eklemek lazım gelir.
Şimdilik xml belgesindeki xsi:noNamespaceLocation ve şemadaki xmlns:xsd dışındaki belirtimleri önemsemeyin. XML belgesinde xsi:noNamespaceLocation ile şema dosyasının yolu bildirilir. Sözlük alanını bildiren xmlns şema belgesi için xsd isimli bir yerel ad alanı açmaktadır. Bu, 'xsd' ile başlayan bütün sözcüklerin, belirtilen sözlük alanına ait olduğunu (yani sözcüklerin bu sözlükte bulunduğunu) işaret eder.
XML öğeleri şemalarda xsd:element ile temsil edilirler. Bu etiket, öğeleri çeşitli öznitelikler yardımıyla tanımlayabilse de bunlardan name ve type örnek kişi belgemiz için yeterlidir.
Öğeleri temsil edecek etiketleri yazmadan önce öğelerin basit ya da karmaşık olup olmadıklarına bakmak gerekir. Alt öğe içeren öğeler karmaşık öğe sayılır. Sadece değer içerdiğinde öğeyi basit tipte tanımlamak gerekir. Tip tanımlamaları şemalarda önemli bir yere sahiptir. Herbir öğe ve özniteliğin de mutlaka bir tipi vardır. Bu tipler yerleşik olan basit tiplerden olabileceği gibi türetilmiş basit ya da karmaşık tipler olabilir. Bir tip tanımlaması adlandırılırdığında tüm öğeler bundan faydalanabilir. Ayrıca adlandırılmış tip tanımlamaları kök öğe ile aynı seviyede bulunur. Adlandırılmamış bir tip tanımlaması ise yalnızca bir öğenin altında (içinde) yer alır ve sadece o öğenin tipini belirtir. Bunun nasıl yapıldığını aşağıda gösteriliyor. Bu açıdan şemaların aslında öğelerden ve tip tanımlamalarından oluştuğunu söylemek yanlış olmaz. Bu bilgiler ışığında kişi belgemizdeki kök öğenin karmaşık olduğunu anlamak zor olmayacaktır. Karmaşık öğeler xsd:element'ten sonra genelde xsd:complexType tanımlamasını gerektirir.
Burada olduğu gibi xsd:sequence'yi şimdilik her xsd:complexType sonrasında bulundurunuz. Yalnızca xsd:element ile belirtilen öğelere
ve KISI öğe tanımlaması ile diğerlerinin arasındaki farka dikkat ediniz. AD,
SOYAD gibi öğeler yerleşik 'xsd:string' yani basit
metin türündedir. KISI öğesi için ise bu şekilde kısa öğe tanımlaması
belirtilemiyor. Aslında bu öğenin tipi hemen alttaki
xsd:complexType içinde kalan kısımdır. YERLEŞİK TİPLER Yerleşik olarak xsd:string dışında birkaç tip daha gelmektedir. W3C tarafından 2.5.2001'de açıklanan önerilerdeki yerleşik tiplerin bazıları aşağıda yer alıyor. Yerleşik temel veri tipleri: Yerleşik türemiş veri tipleri:
<xsd:element name="SEHIR" type="xsd:string" /> <SEHIR>İstanbul</SEHIR>
<TARIH>2003-02-31</TARIH>
<ADET>123</ADET>
YENİ BİR TİP TANIMLAMAK Şemalarda kendi tip tanımlamalarımızı yapmamız için çeşitli yollar mevcuttur. Basit bir yeni tip tanımlaması öğe tanımlamaları ile aynı seviyede (xsd:schema başlangıcının hemen altında ya da şema bitiş etiketinin hemen öncesinde) yapılır ve öğe ağacında bu yeni tip gerekli yerlerde kullanılır. Yeni bir tip oluşturmanın benzer türdeki farklı öğeleri tanımlarken işe yaradığını söyleyebiliriz. Bununla birlikte belgenin karmaşıklığını azaltmak için tip tanımlamaları öğe içinde değil, ayrı olarak yapılabilir. Yukarıdaki kişi belgesi için telefon bilgisini belli bir karakter şablonuna uymaya zorlayabiliriz. Bunun için tip tanımının öncelikle öğe içinde nasıl yerleştirildiğine bakın.
Yeşil ile yazılmış kısım TELEFON öğesine ait dahili tip tanımlamasıdır. Dahili tip tanımlamaları <xsd:simpleType> ya da benzer türde bir öbek içinde yapılır. Bir kısıtlama gerektiğinde xsd:restriction kullanılıyor. Bu örnekteki base ile, kısıtlamanın temelinde xsd:string olduğu belirtiliyor. Yani değer öncelikle bu türdedir ve restriction içinde tanımlanan kurallarla da değer kısıtlanır. Burada telefon bilgisinin xsd:pattern'in value özelliğinde belirtilen karakter şablonuna uyması gerektiği ifade ediliyor. Öğe yalnızca şu türdeki değerleri kabul edecektir: "0212 123 45 67", "0312 987 65 43" gibi. Bunların dışında parantez getirilmesi, boşluk eklenmesi ya da var olan boşlukların değiştirilmesi geçersizdir.
Dahili (yerel) tip tanımlamalarında bilinmesi gereken en önemli husus bu tanımlamanın sadece ilgili öğeye ait olduğudur. Harici tanımlanıp adlandırılan tipler ise belgedeki birçok öğede kullanılabilir. Kişiler belgemizi aşağıdaki gibi düzenlediğimizde bunun gerekliliği daha iyi anlaşılacaktır.
Bu belge için yerel tip tanımlandığında şema belgesi yeterince uzayacaktır. Adlandırılmış harici tanımlamalar çoğunlukla bu tür durumlarda devreye girer.
DEĞERLERİ KISITLAMAK xsd:pattern'in value özelliğinde belirtilen karakter şablonları çok çeşitli olabilir. Bu yazıda tümünü belirtemesek de aşağıda açıklaması verilen, value ile kullanılabilecek farklı türdeki örnekleri inceleyebilirsiniz.
Pattern'in asıl amacı değerleri belli bir kalıba uygun şekilde kısıtlamaktır. Bu tabii ki belgenin daha kontrollü olmasını sağlar. Pattern dışında da çeşitli kısıtlama seçenekleri vardır. Kısıtlamalar genel olarak xsd:restriction ile belirtilir. Yukarıda yapıldığı gibi kısıtlama koşulları xsd:restriction'un sınırladığı bölgede bulunur. Kısıtlama koşulu (restriction) ile birlikte bir temel tip belirtmek gerekir. Bu base özelliği ile yapılır. Base ilgili öğenin ya da özniteliğin (sadece öğeler değil, öznitelikler için de bu şekilde kısıtlama belirtilebilir) temel alınacağı tipi belirtir. Yukarıdaki kisi.xsd dosyasında telefon_tip tanımlamasının altındaki xsd:restriction'un base özelliğinin 'xsd:string' olduğuna dikkat edin. Base özelliği xsd:element'in type özelliğinin alabileceği hemen tüm tip tanımlarını içerebilir. Yerleşik tip tanımlamaları veyahut kendi türettiğimiz tipler gibi... Basit tipler için kısıtlama bölgesinde kullanılabilen kısıtlama
türleri aşağıda inceleniyor. Zorunlu Seçim Listesi Oluşturmak Değerleri kısıtlamanın bir yolu, benzersiz öğelerden oluşmuş bir listeden seçtirmeye zorlamaktır. Bu xsd:restriction içinde iken xsd:enumeration ile yapılır. Öğe, kısıtlama bölgesinde oluşturulan birden çok enumeration ile belirtilen değerlerden yalnızca birini alabilir.
Kişi belgemize cinsiyet bilgisi eklediğimizde bunun yalnızca KADIN ya da ERKEK olmasını sağlamak için yukarıdaki gibi zorunlu seçim listesi oluşturabiliriz. Bunun dışında xsd:pattern ile de dolaylı olarak seçimlik değerler listesi oluşturulabiliyor. Kısıtlama bölgesinin içinde xsd:pattern'i aşağıdaki gibi düzenlemek bunun için yeterlidir. Pattern kullanıldığında her seçeneği dik çizgi işareti ( | ) ile ayırarak yazmak gerekir: <xsd:pattern value="KADIN|ERKEK" /> Metin ve Sayı Uzunluğunu Sınırlamak Tip tanımlamalarında bilginin uzunluğunu kısıtlamak mümkündür. Bu, değerin uzunluğunu kesin olarak ya da olabilecek en büyük ve en küçük uzunlukları belirterek yapılabilir. Bir değerin uzunluğunu kesin olarak belirtmek için xsd:length kısıtlama bölgesi içinde aşağıdaki gibi kullanılır. <xsd:length value="10" /> Bu tanım bilginin her zaman 10 karakterli olması gerektiği kuralını koyar. Olabilecek en küçük ve en büyük uzunluk ise xsd:minLength ve xsd:maxLength ile belirtilir. <xsd:minLength value="5" /> Öğe bu şekliyle en az 5, en çok 15 karakter uzunluğunda olabilir. Fakat bu ikisini aynı anda kullanmak zorunlu değildir. Yalnızca birinin belirtilmesi, diğeri için sınırlama olmadığı anlamına gelir. Uzunluk kısıtlaması için xsd:length kullanıldığında xsd:minLength veya xsd:maxLength kullanmak anlamlı değildir. Sayılardaki hane uzunluklarını sınırlamak için ise xsd:fractionDigits ve xsd:totalDigits kullanılır. FractionDigits bir sayı için ondalık kısımda yer alabilecek en çok rakam adedini belirtir. TotalDigits ise sayıdaki toplam rakam adedini sınırlar (nokta işareti adede dahil edilmez).
Yukarıdaki kısıtlamalara sahip bir sayının ondalık kısmında en çok 2, bütününde de en çok 5 hane bulunabilir. <SAYI>345.67</SAYI>
Decimal tipi ondalık sayıları belirtmek
için kullanılıyor. Tam sayıları belirtmek için ise
integer kullanabilirsiniz. Tabii ondalık değerler olmadığında yukarıdaki
kısıtlamaların kullanımı değişebilir. Yerleşik sayı tipleri için sonraki
dersimizde gerekli bilgiler verilecektir. Sayılarda Değer Aralığını Sınırlamak Sayılar için öğenin alabileceği en büyük ve en küçük değerleri belirterek kısıtlama getirilebilir. Listedeki dört deyim bunun için kullanılır.
Aşağıdaki örnekte ilgili değer en çok 100 olabilirken, alabileceği en küçük değer 0'dan büyük olmak zorundadır. Integer tipinde bir tamsayı için bu değer tabii ki 1'dir.
Burada dikkat edilmesi gereken şey, minInclusive
ile minExclusive'nin,
maxInclusive ile
maxExclusive'nin bir arada kullanılmasının
mantıklı olmadığıdır. Buraya kadar, birçok alt öğe içeren öğelerin nasıl tanımlandığını incelemedik. Zaten şimdiye kadar öğrendiklerimiz ancak çok basit şema belgeleri oluşturmamıza yardımcı olabilir. XML Şemaları, XML dünyasındaki en önemli ve uzun konulardan biridir. Gelecek
ay yine ayrıntılı olarak incelemeye devam edip şemalar konusunu
noktalayacağız. O zamana kadar ekteki ozgecmis.xml ve
ozgecmis.xsd dosyalarını inceleyebilirsiniz.
Serkan ŞAHİNOĞLU |
||||||||||||||||||||||||||||||||||||||||||||||||