Monday, April 15, 2013

XML Belgeleri XSL ve XPath Kullanarak Dönüştürmek

Uygulamalar arasında sorunsuz veri alış-verişi için kullanılabilecek en uygun teknoloji XML'dir. XML'de veriyi, verinin ne anlama geldiğini tanımlayan meta-veri olarak adlandırılan verilerle birlikte kodluyoruz. Web servisleri kurumsal uygulamaların tümleştirilmesi için en hızlı ve ucuz çözümdür. Web servisleri bunu, uygulamanın fonksiyonlarını ve verilerini, platformdan bağımsız bir şekilde paylaştırarak sağlar. Web servisleri XML tabanlı bir dizi teknoloji üzerine kuruludur:
  • Web Services Description Language: Web servisinin arayüzünün tanımlandığı, XML ve XML Schema teknolojileri kullanılarak oluşturulur. WSDL servisin tanımını iki bölüme ayırır:
    a)     Soyut arayüz:
    Soyut arayüz, servis tarafından desteklenen işlemler ve parametreleri, soyut veri tipleri gibi servise ilişkin genel özellikleri tanımlar. Bu tanımlamalar ağ adresi, ağ protokolü, veri gösterimi gibi bilgisayar ağ parametrelerinden tamamen bağımsızdır.
    b)    Somut gerçekleme:
    Gerçeklemeye ilişkin tanımlamalar, soyut arayüz tanımlarını gerçek ağ adresi, ağ protokolü ve gerçek veri tipleri ile eşleştirir. Hem soyut arayüz hem de somut gerçekleme tanımları XML elemanları aracılığı ile verilir. Sonuç olarak, WSDL dokümanı, http://schemas.xmlsoap.org/wsdl isim uzayında tanımlı XML Schema dokümanında tanımlı elemanlar kullanılarak oluşturulmuş bir XML dokümanıdır.
    Genel olarak bir WSDL dokümanının içeriği aşağıda verilmiştir.
             <definitions>
                   <types>
                       Soyut veri tipi tanımı
                   </types>
                   <message>
                        Servis giriş/çıkış parametrelerinin tanımları
                   </message>
                   <portType>
                        İskele (=port) tanımı
                    </portType>
                    <binding>
          Aynı iskeleye birden fazla iletişim protokolü üzerinden erişilebilinir. Bunun tanımı bu bölümde verilmektedir.
                    </binding>
                    <services>
                         Gerçeklemeye ilişkin tanımlar
                    </services>
             </definitions>

  • SOAP (=Simple Object Access Protocol): SOAP uygulamalar arasında yapısal ve tipli verilerin değişimi için geliştirilmiş XML tabanlı bir protokoldür. Web servis uygulamalarında üç çeşit aktör bulunmaktadır: servisi kullanan tüketici, servisi veren servis sağlayıcı ve servisin yerini söyleyen bir aracı. SOAP tüm bu aktörler arasındaki veri alış-verişine olanak sağlayan bir standarttır. Bu standart kesinlikle uygulamanın mantığı, iletişim protokolü, programlama modeli ya da programlama dili konusunda bir kısıt getirmez. Bunun yanında baştan beri genellikle HTTP üzerinden taşınmaktadır. Ama bunun yanında JMS, SMTP, SFTP gibi iletişim protokolleri üzerinden de taşınabilir.
  • UDDI (=Universal Description, Discovery and Integration): UDDI servis kayıtları Web servislerini kataloglama platformunu oluşturur. Web servis kayıt kataloğu merkezi bir Web servisi arama motorudur. Web servis istemcileri, bu arama motoru sayesinde, kendi amaçlarına uygun ve yeterli servis çözümlerini bulabilirler. Arama ölçütü erişim arayüzü gibi teknik bir konu olabileceği gibi servisin ticari ünü ve coğrafi konumu gibi teknik dışı konular da olabilir. Genel olarak UDDI kayıtlarında aşağıdaki bilgiler yer alır:
  • Web servisi sunan ticari firma ve kurumlar hakkında bilgiler
  • Firmaca sunulan Web servislerinin tanımını
  • Web servislerine erişim için gerekli arayüz ile ilgili teknik bilgiler
 Bunun yanında, UDDI, bu bilgilere erişim için Uygulama Yazılımı Arayüzü de sunar. Bu arayüz sayesinde Web istemcileri her zaman servis hakkında güncel bilgilere erişebilir. UDDI olgun bir teknoloji olmasına rağmen ağır sıklet bir teknoloji olduğu için pek kullanılmamaktadır. Bu teknolojinin yerini yine XML tabanlı bir teknoloji olan WSIL (Web Service Inspection Language) almıştır. XML web servisleri kurumsal uygulamaları biribirleri ile tümleştirmek ve Servis Odaklı Mimari çözümlerinde servisleri tanımlamak ya da gerçekleştirmek amacıyla yoğun olarak kullanılmaktadır.
XSL bir XML dokümanını bir başka XML dokümanına ya da başka bir tipte veriye (metin, xhtml, pdf, resim gibi) dönüştürmek için kullanılan bir XML tabanlı standarttır. Bu teknoloji iki temel bileşenden oluşmaktadır: XSLT ve XSL FO (Formatting Objects). XSLT XSL’in dönüşüm dilidir. XSLT’nin kendisi XML olarak kodlanmış bir dokümandır. Dolayısı ile XML dokümanlarının uyduğu tüm kurallara uyar. XML başlıklı konudan hatırlayacağınız gibi XML dokümanı bir ağaç tanımlar. XSLT bu ağacın herhangi bir bölümünün yeni bir dokümana nasıl dönüştürüleceğini tanımlar. Eğer çıkış bir XML dokümanı ise çıkış dokümanı bir başka ağaç olacaktır. Aşağıdaki şekilde tipik bir XSL uygulaması verilmiştir.

Bu uygulamada giriş her zaman bir XML dokümanı olmak zorundadır. XSLT işlemcisi giriş olarak aldığı XML dokümanını, dönüşümün nasıl olacağını tanımlayan XSLT dokümanı yardımı ile çıkış dokümanına dönüştürür. 
XSL'in diğer bileşeni ise XSL Biçimlendirme Nesneleridir (Formatting Objects). Özet olarak XSL’in XSLT, XPath ve XSL-FO’dan oluştuğunu söyleyebiliriz:
                     XSL=XSLT+XPath+XSL-FO
Aşağıdaki şekilde XSLT ve XSL-FO’nun kullanıldığı diğer bir uygulama türü verilmiştir. Burada XML dokümanı bir PDF dokümanına dönüştürülmektedir.
                
XSL’in elektronik ticaret açısından önemli bir teknolojidir. Farklı kurumlar benzer içerikler için kendi amaçlarına uygun XML dokümanları tasarlamış olabilirler. Bu durumda aynı içeriğin bir XML dosyadan diğerine kayıpsız ve hataya yol açmayacak şekilde dönüştürülmesi gerekir. Benzer şekilde içeriğin farklı amaçlarla sunulması gerekebilir. Bu durum özellikle içeriğin çok hızlı üretildiği ya da tüketildiği uygulamalarda önem kazanır. XSL elektronik ticaret uygulamaları ya da servisler için içerik ve sunumu tam olarak biri birinden ayırabilmesine olanak sağlar. XML içeriği kodlamak, XSL ise sunumu kodlamak için kullanılır. Aşağıdaki şekilde bir elektronik ticaret uygulaması için verilen örnekte, sipariş ile ilgili tüm bilgiler bir XML dokümanında tutulmaktadır. Farklı türden çalışan personel, kendi amacına uygun farklı detay seviyelerinde bilgiye ihtiyaç duyabilecektir. XSL tabanlı çözümde farklı ihtiyaçlar için gerekli her farklı görünüm için bir XSLT dokümanı tanımlanır. Örneğin satış elemanı siparişin durumuyla ilgilenirken, muhasebe personeli ödeme ilgili detaylarla ilgilenecektir.
XSLT, XSL’in en önemli bileşenidir ve bir XML dokümanının diğer bir XML ya da farklı bir düzendeki bir dokümana nasıl dönüşeceğini tanımlar. Burada giriş dokümanı XML olarak kodlanmış olduğundan, içeriği her zaman bir ağaç veri yapısı ile göstermek mümkündür. XSLT bu ağaçtaki her bir düğümün çıkışta nasıl bir veri yapısına dönüştürüleceğini tanımlamamıza olanak sağlayan çeşitli yapılar içerir. Bu dönüşümden amaç içeriği farklı bir amaçla sunmak olabilir ya da içerik içerisinden amaca uygun bilgiler çıkarmak olabilir. Örneğin, futbol liginde tüm sezonlar boyunca oynanan maçlara ilişkin istatistik bilgilerinin tutulduğu bir büyük XML dokümanından, bir takıma ilişkin dış saha performansını yıllara göre değişimini elde etmek için XSLT teknolojisinden yararlanabiliriz. Bu açıdan, XSLT’yi İlişkisel Veritabanı Yönetim Sistemlerinde sıklıkla kullanılan SQL’e (Structured Query Language) benzetebiliriz. Bunun yanında, XSLT’yi XSL-FO ile birlikte, içeriği sunum amaçlı olarak PDF (Portable Document Format) ya da Microsoft Word gibi farklı formatlara dönüştürmek amacı ile de kullanabiliriz.
Bu yazıda bu yapıları inceleyeceğiz. Daha sonra giriş ağacı üzerinde daha rahat dolaşmamızı sağlayan XPath teknolojisini tanıyacağız. XSLT dönüşümünü tanımlarken XPath’i kullanacağız. Böylelikle, karmaşık dönüşümleri, daha basit bir gösterimle ifade edebilme yeteneğine kavuşmuş olacağız. Tüm bu XSL teknolojileri W3C’nin birer standardıdır. 
XSL ile kodlanmış bir dokümanın kök elemanı <xsl:stylesheet> ya da <xsl:transform> olmalıdır. Buna göre aşağıdakiler geçerli bir tanımlamadır:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
ya da
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Bir uygulama üzerinde XSLT’nin nasıl çalıştığını inceleyelim. Uygulamamıza giriş olarak vermek üzere ülkelere ilişkin bilgilerin yeraldığı bir XML dokümanı kullanacağız:
<?xml version="1.0" encoding="UTF-8"?> 
<countries>     
   <country>         
      <Code>AFG</Code> 
      <Name>Afghanistan</Name>
      <Continent>Asia</Continent>
      <Region>Southern and Central Asia</Region>              
      <SurfaceArea>652090.00</SurfaceArea>         
      <IndepYear>1919</IndepYear>            
      <Population>22720000</Population>            
      <LifeExpectancy>45.9</LifeExpectancy>         
      <GNP>5976.00</GNP>
      <GNPOld/>         
      <LocalName>Afganistan/Afqanestan</LocalName>            
      <GovernmentForm>Islamic Emirate</GovernmentForm>         
      <HeadOfState>Mohammad Omar</HeadOfState>           
      <Capital>1</Capital>
      <Code2>AF</Code2>     
    </country>
    .
    .
    .
</countries>
Şimdi nüfusu 50 milyonun üzerinde olan ülkelerin listesini HTML tablo olarak çıkışa aktarn bir XSL dönüşümü tanımlayalım:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <html>
            <head>
                <title>Nüfus Yoğun Ülkeler</title>
            </head>
            <body>
                <table border="1">
                    <thead>
                        <tr>
                            <th>Ülke Adı</th>
                            <th>Bağımsızlık Yılı</th>
                            <th>Nüfusu</th>
                            <th>Yüz Ölçümü</th>
                            <th>Nüfus / Yüzölçümü</th>
                        </tr>                            
                    </thead>
                    <tbody>
                        <xsl:for-each select="countries/country[Population &gt; 50000000]">
                           <xsl:sort select="Population" order="ascending"/>
                            <tr>
                                <td>
                                    <xsl:value-of select="Name"/>
                                </td>
                                <td>
                                    <xsl:value-of select="IndepYear"/>
                                </td>
                                <td>
                                    <xsl:value-of select="Population"/>
                                </td>
                                <td>
                                    <xsl:value-of select="SurfaceArea"/>
                                </td>
                                <td>
            <xsl:value-of select="format-number(Population div SurfaceArea,'###,###.00')"/>
                                </td>                            
                            </tr>                   
                        </xsl:for-each>
                    </tbody>
                </table>                    
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Yukarıda verilen dönüşüm uygulandığında üretilen HTML aşağıda verilmiştir:


Ülke Adı Bağımsızlık Yılı NüfusuYüz Ölçümü Nüfus / Yüzölçümü
India 1947 1013662000 3287263.00 308.36
Nigeria 1960 111506000 923768.00 120.71
Japan -660 126714000 377829.00 335.37
China -1523 1277558000 9572900.00 133.46
Bangladesh 1971 129155000 143998.00 896.92
Russian Federation 1991 146934000 17075400.00 8.61
Pakistan 1947 156483000 796095.00 196.56
Brazil 1822 170115000 8547403.00 19.90
Indonesia 1945 212107000 1904569.00 111.37
United States 1776 278357000 9363520.00 29.73
Ukraine 1991 50456000 603700.00 83.58
Congo, The Democratic Republic of the 1960 51654000 2344858.00 22.03
Italy 1861 57680000 301316.00 191.43
France 843 59225700 551500.00 107.39
United Kingdom 1066 59623400 242900.00 245.46
Thailand 1350 61399000 513115.00 119.66
Ethiopia -1000 62565000 1104300.00 56.66
Turkey 1923 66591000 774815.00 85.94
Iran 1906 67702000 1648195.00 41.08
Egypt 1922 68470000 1001449.00 68.37
Philippines 1946 75967000 300000.00 253.22
Vietnam 1945 79832000 331689.00 240.68
Germany 1955 82164700 357022.00 230.14
Mexico 1810 98881000 1958201.00 50.50

for-each elemanı seçilen bir düğümün alt ağacında yatayda yer alan tüm select özniteliği ile verilen düğümlerin taranmasını sağlar.
sort elemanı for-each ile beraber kullanılır ve for-each ile taranan düğümlerin değerlerinin sıralanmasını sağlar.

if elemanı düğümün değerine göre dönüşümü farklılaştırmak için kullanılır. Genel yazımı aşağıda verilmiştir:
<xsl:if test="koşul"> 
 ... ... koşul doğru olduğunda yapılması gereken işlemler... ... 
</xsl:if>

choose elemanı if elemanına benzer bir amaçla kullanılır. Burada programlama dillerindeki if-else yapısına karşı düşer. Genel yazım biçimi aşağıda verilmiştir:
<xsl:choose> 
   <xsl:when test="koşul"> ... çıkış ... </xsl:when> 
   <xsl:otherwise> ... çıkış .... </xsl:otherwise> 
</xsl:choose>

Bir XSLT dokümanı içinde birden fazla şablon tanımlayabiliriz. Bu şablonların hangi sırayla uygulanacağını apply-templates elemanı ile kontrol edebiliriz. apply-templates elemanının select özniteliği şablonun hangi düğüme ya da alt ağaca uygulanacağını tanımlar. 
XPath işletim sistemlerindeki dosya isimlendirmelerine benzer şekilde XML ağacındaki düğümleri tanımlamak üzere geliştirilmiştir ve XSLT dönüşümlerinde kullanılır. Bunun yanında XPath iki karakter katarını karşılaştırma, sayısal işlemler, dizi işlemleri gibi çok sayıda fonksiyon içerir. Böylelikle XPath XSLT’ye önemli bir işlevsellik kazandırır. XPath XML ağacındaki düğümlerin seçilmesi amacıyla bazı gösterimlerden yararlanır. Bu gösterimler ve anlamları aşağıdaki tabloda verilmiştir.


Gösterim Anlamı
 Düğüm adı Verilen düğümün tüm çocuk düğümlerini belirtir
 / Kök düğümü belirtir
 // Dokümanda her nerede olursa olsun tüm düğümleri belirtir
 . O anki düğümü belirtir
 .. O anki düğümün ebeveyn düğümünü belirtir
 @ Özniteliği belirtir

Yüklemler belirli bir düğümü ya da belirli bir değeri içeren düğümü bulmak için kullanılır. Yüklemler her zaman köşeli parantez içinde verilirler. Aşağıdaki tabloda sıkça kullanılan yüklemler bir örnekle listelenmiştir.

Gösterim Sonuç
 /katalog/kitap[1] Katalogda yer alan ilk kitabı seçer
 /katalog/kitap[last()] Katalogdaki son kitabı seçer
 /katalog/kitap[last()-1] Katalogda ondan bir önceki kitabı seçer
 /katalog/kitap[position()<3] Katalogdaki ilk iki kitabı seçer
 //kitap[@kod] Kodu olan tüm kitapları seçer
 //kitap[@kod='42'] Kod değeri 42 olan kitapları seçer
 /katalog/kitap[fiyat<20] Fiyatı 20’den küçük olan kitapları seçer
 /katalog/kitap[fiyat<20]/başlık  Fiyatı 20’den küçük olan kitap başlıklarını seçer

Aşağıdaki tabloda ise XPath ifadelerinde kullanabileceğimiz operatörler tanımlanmıştır:
Simge
Anlamı
Toplama 
-
Çikarma
*
Çarpma
div
Bölme
=
Eşitlik testi
!=
Eşitsizlik testi
<
Küçüklük testi
<=
Küçük eşitlik testi
>
Büyüklük testi
>=
Büyük eşitlik testi
or
Mantıksal veya
and
Mantıksal ve
mod
Mod (Bölümden kalan)

XPath eksenleri o anki düğüme bağıl olarak düğüm kümelerinin tanımlanabilmesine olanak sağlar. Aşağıdaki tabloda XPath’de kullanabileceğiniz eksenler ve anlamları listelenmiştir:

Eksen
Anlamı
ancestor 
Bulunulan düğümün tüm düzeylerdeki ebeveynlerini seçer
ancestor-or-self
Bulunulan düğümü de içermek üzere tüm düzeylerdeki ebeveynlerini seçer
attribute
Bulunulan düğümün tüm özniteliklerini seçer
child
Bulunulan düğümün tüm çocuk düğümlerini seçer
descendant
Bulunulan düğümün tüm düzeylerdeki çocuklarını seçer
descendant-or-self
Bulunulan düğümü de içermek üzere tüm düzeylerdeki çocuklarını seçer
following
Bulunulan düğümün kapatan takısından sonra tüm elemanlari seçer
following-sibling
Bulunulan düğümü izleyen tüm kardes dügümleri seçer
parent
Bulunulan düğümün ebeveyn düğümünü seçer
preceding
Bulunulan düğümün açan takısından önceki dokümanda yer alan tüm elemanlari seçer
preceding-sibling
Bulunulan düğümün kendinden önceki tüm kardeslerini seçer
self
Bulunulan düğümün kendisini seçer



Şimdi başka bir örneği inceleyeceğiz. Bu örnekte XSD ile verilmiş bir XML dokümanı kullanacağız: 

otomobiller.xml
<?xml version="1.0" encoding="UTF-8" ?>
<otomobiller  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.omegaegitim.com/bte550/2011/hw2 otomobil.xsd"
             xmlns="http://www.omegaegitim.com/bte550/2011/hw2">
    <otomobil marka="Ford" model="Mustang">
        <uzunluk birim="mm">4610</uzunluk>
        <genislik birim="mm">1824</genislik>
        <yükseklik birim="mm">1351</yükseklik>
        <agirlik birim="kg">1490</agirlik>
        <bagaj_hacmi birim="m3">309</bagaj_hacmi>
        <motor_hacmi birim="cc">4601</motor_hacmi>
        <silindir_adedi birim="adet">8</silindir_adedi>
        <beygir_gucu birim="hp">228</beygir_gucu>
        <yuz_km_sn birim="sec">5.3</yuz_km_sn>
        <dingil_mesafesi birim="cm">1753</dingil_mesafesi>
        <yakit_tuketimi birim="lt">9.1</yakit_tuketimi>
    </otomobil>
    <otomobil marka="Ford" model="Mondeo">
        <uzunluk birim="mm">4214</uzunluk>
        <genislik birim="mm">1802</genislik>
        <yükseklik birim="mm">1573</yükseklik>
        <agirlik birim="kg">1250</agirlik>
        <bagaj_hacmi birim="m3">255</bagaj_hacmi>
        <motor_hacmi birim="cc">1600</motor_hacmi>
        <silindir_adedi birim="adet">4</silindir_adedi>
        <beygir_gucu birim="hp">110</beygir_gucu>
        <yuz_km_sn birim="sec">12.3</yuz_km_sn>
        <dingil_mesafesi birim="cm">1913</dingil_mesafesi>
        <yakit_tuketimi birim="lt">10.1</yakit_tuketimi>
    </otomobil>
    <otomobil marka="Ford" model="Focus">
        <uzunluk birim="mm">3897</uzunluk>
        <genislik birim="mm">1673</genislik>
        <yükseklik birim="mm">1350</yükseklik>
        <agirlik birim="kg">1203</agirlik>
        <bagaj_hacmi birim="m3">254</bagaj_hacmi>
        <motor_hacmi birim="cc">1600</motor_hacmi>
        <silindir_adedi birim="adet">4</silindir_adedi>
        <beygir_gucu birim="hp">120</beygir_gucu>
        <yuz_km_sn birim="sec">11.6</yuz_km_sn>
        <dingil_mesafesi birim="cm">1672</dingil_mesafesi>
        <yakit_tuketimi birim="lt">12.1</yakit_tuketimi>
    </otomobil>
    <otomobil marka='Renault' model='Fluence'>
        <uzunluk birim='mm'>3319</uzunluk>
        <genislik birim='mm'>1762</genislik>
        <yükseklik birim='mm'>1642</yükseklik>
        <agirlik birim='kg'>1500</agirlik>
        <bagaj_hacmi birim='m3'>312</bagaj_hacmi>
        <motor_hacmi birim='cc'>1600</motor_hacmi>
        <silindir_adedi birim="adet">4</silindir_adedi>
        <beygir_gucu birim='hp'>125</beygir_gucu>
        <yuz_km_sn birim='sec'>8.3</yuz_km_sn>
        <dingil_mesafesi birim='cm'>1632</dingil_mesafesi>
        <yakit_tuketimi birim='lt'>15.1</yakit_tuketimi>
    </otomobil>
    <otomobil marka='Renault' model='Megane'>
        <uzunluk birim='mm'>4209</uzunluk>
        <genislik birim='mm'>1782</genislik>
        <yükseklik birim='mm'>1641</yükseklik>
        <agirlik birim='kg'>1602</agirlik>
        <bagaj_hacmi birim='m3'>350</bagaj_hacmi>
        <motor_hacmi birim='cc'>1800</motor_hacmi>
        <silindir_adedi birim="adet">4</silindir_adedi>
        <beygir_gucu birim='hp'>145</beygir_gucu>
        <yuz_km_sn birim='sec'>15.3</yuz_km_sn>
        <dingil_mesafesi birim='cm'>1651</dingil_mesafesi>
        <yakit_tuketimi birim='lt'>10.1</yakit_tuketimi>
    </otomobil>
    <otomobil marka='Honda' model='Civic'>
        <uzunluk birim='mm'>3962</uzunluk>
        <genislik birim='mm'>1752</genislik>
        <yükseklik birim='mm'>1292</yükseklik>
        <agirlik birim='kg'>1648</agirlik>
        <bagaj_hacmi birim='m3'>401</bagaj_hacmi>
        <motor_hacmi birim='cc'>1600</motor_hacmi>
        <silindir_adedi birim="adet">4</silindir_adedi>
        <beygir_gucu birim='hp'>168</beygir_gucu>
        <yuz_km_sn birim='sec'>15.3</yuz_km_sn>
        <dingil_mesafesi birim='cm'>1852</dingil_mesafesi>
        <yakit_tuketimi birim='lt'>16.1</yakit_tuketimi>
    </otomobil>
    <otomobil marka='Honda' model='Jazz'>
        <uzunluk birim='mm'>3971</uzunluk>
        <genislik birim='mm'>1943</genislik>
        <yükseklik birim='mm'>1672</yükseklik>
        <agirlik birim='kg'>1532</agirlik>
        <bagaj_hacmi birim='m3'>376</bagaj_hacmi>
        <motor_hacmi birim='cc'>1400</motor_hacmi>
        <silindir_adedi birim="adet">4</silindir_adedi>
        <beygir_gucu birim='hp'>120</beygir_gucu>
        <yuz_km_sn birim='sec'>7.9</yuz_km_sn>
        <dingil_mesafesi birim='cm'>1962</dingil_mesafesi>
        <yakit_tuketimi birim='lt'>11.1</yakit_tuketimi>
    </otomobil>
    <otomobil marka='Honda' model='City'>
        <uzunluk birim='mm'>4986</uzunluk>
        <genislik birim='mm'>1954</genislik>
        <yükseklik birim='mm'>1574</yükseklik>
        <agirlik birim='kg'>1834</agirlik>
        <bagaj_hacmi birim='m3'>297</bagaj_hacmi>
        <motor_hacmi birim='cc'>1600</motor_hacmi>
        <silindir_adedi birim="adet">4</silindir_adedi>
        <beygir_gucu birim='hp'>135</beygir_gucu>
        <yuz_km_sn birim='sec'>15.3</yuz_km_sn>
        <dingil_mesafesi birim='cm'>1943</dingil_mesafesi>
        <yakit_tuketimi birim='lt'>14.7</yakit_tuketimi>
    </otomobil>
    <otomobil marka='Honda' model='Accord'>
        <uzunluk birim='mm'>3721</uzunluk>
        <genislik birim='mm'>1932</genislik>
        <yükseklik birim='mm'>1672</yükseklik>
        <agirlik birim='kg'>1203</agirlik>
        <bagaj_hacmi birim='m3'>402</bagaj_hacmi>
        <motor_hacmi birim='cc'>1250</motor_hacmi>
        <silindir_adedi birim="adet">4</silindir_adedi>
        <beygir_gucu birim='hp'>140</beygir_gucu>
        <yuz_km_sn birim='sec'>15.3</yuz_km_sn>
        <dingil_mesafesi birim='cm'>1629</dingil_mesafesi>
        <yakit_tuketimi birim='lt'>12.4</yakit_tuketimi>
    </otomobil>
</otomobiller>
otomobil.xsd:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://www.omegaegitim.com/bte550/2011/hw2"
           targetNamespace="http://www.omegaegitim.com/bte550/2011/hw2"
           elementFormDefault="qualified">
    <xs:element name="otomobiller">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="otomobil" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="uzunluk" type="olcuTipi"/>
                            <xs:element name="genislik" type="olcuTipi"/>
                            <xs:element name="yükseklik" type="olcuTipi"/>
                            <xs:element name="agirlik" type="olcuTipi"/>
                            <xs:element name="bagaj_hacmi" type="olcuTipi"/>
                            <xs:element name="motor_hacmi" type="olcuTipi"/>
                            <xs:element name="silindir_adedi" type="olcuTipi"/>
                            <xs:element name="beygir_gucu" type="olcuTipi"/>
                            <xs:element name="yuz_km_sn" type="olcuTipi"/>
                            <xs:element name="dingil_mesafesi" type="olcuTipi"/>
                            <xs:element name="yakit_tuketimi" type="olcuTipi"/>
                        </xs:sequence>
                        <xs:attribute name="marka" type="xs:string"
                                      use="required"/>
                        <xs:attribute name="model" type="xs:string"
                                      use="required"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="olcuTipi">
        <xs:simpleContent>
            <xs:extension base='xs:decimal'>
                <xs:attribute name="birim" type="birimTipi" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:simpleType name="birimTipi">
        <xs:restriction base="xs:string">
            <xs:enumeration value="mm"/>
            <xs:enumeration value="cm"/>
            <xs:enumeration value="km"/>
            <xs:enumeration value="m"/>
            <xs:enumeration value="sec"/>
            <xs:enumeration value="adet"/>
            <xs:enumeration value="hp"/>
            <xs:enumeration value="m3"/>
            <xs:enumeration value="lt"/>
            <xs:enumeration value="cc"/>
            <xs:enumeration value="kg"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

Şimdi yüksek motor hacimli araçları HTML tablo olarak listeyecek bir XSL yazalım:
araba1.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:car="http://www.omegaegitim.com/bte550/2011/hw2"
                version="1.0">
    <xsl:output method="html"/>
    <xsl:template match="/car:otomobiller">
        <html>
            <head>
                <title>Yüksek motor hacimli araçlar</title>
            </head>
            <body>
                <table border="1">
                    <thead>
                        <tr>
                            <th>Marka</th>
                            <th>Model</th>
                            <th>Genişlik</th>
                            <th>Yükseklik</th>
                            <th>Ağırlık</th>
                            <th>Motor Hacmi</th>
                        </tr>                            
                    </thead>
                    <tbody>
   <xsl:for-each 
    select="car:otomobil[car:motor_hacmi &gt; 1500 and car:motor_hacmi &lt; 2000]">
   <xsl:sort select="car:agirlik" order="decending"/>
                                <tr>
                                    <td>
                                        <xsl:value-of select="@marka"/>
                                    </td>
                                    <td>
                                        <xsl:value-of select="@model"/>
                                    </td>
                                    <td>
                                        <xsl:value-of select="car:genislik"/>
                                    </td>
                                    <td>
                                        <xsl:value-of select="car:yükseklik"/>
                                    </td>
                                    <td>
                                        <xsl:value-of select="car:agirlik"/>
                                    </td>
                                    <td>
                                        <xsl:value-of select="car:motor_hacmi"/>
                                    </td>
                                </tr>                          
                        </xsl:for-each>
                    </tbody>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Örnekleri içeren kodları NetBeans projesi olarak bu bağlantıdan indirebilirsiniz.

No comments:

Post a Comment