|
|
XML dokumentumhoz XSL készítése
XML 5. rész
|
|
Példaprogram letöltése
17340 bájt
|
Ez előző részben egy lekérdezés adatait tároltuk el XML dokumentumban. Most egy kicsit továbbfejlesztjük ezt a programot, és az XML dokumentumhoz létrehozunk egy DTD-t, valamint egy XSL stíluslapot, melynek használatával elérjük, hogy egy böngészővel is meg tudjuk jeleníteni az adatokat, méghozzá egy formázott HTML oldal formájában.
A DTD az XML dokumentum elemeinek definícióját tartalmazza. Ez a mellékelt példában a következőképpen néz ki:
<!ELEMENT customers (hiv?, customer+)>
A deklaráció szerint a customers elem (ami az összes többi elemet is tartalmazza) tartalmazhat hiv elemeket és legalább egy customer elemet, ami akár több is lehet. A "?" azt jelenti, hogy nem kell kötelezően léteznie ilyen elemnek, míg a "+" jel azt mondja meg, hogy az adott elemből legalább egy, de adott esetben akár több is előfordulhat.
<!ELEMENT customer (company, city, country, order+)>
A customer elem kötelezően tartalmaz egy darab company, city és country elemet, valamint legalább egy, vagy akár több order elemet.
<!ELEMENT order (employee+)>
Az order elem employee elemeket tartalmazhat csak, de legalább egy darabot.
<!ELEMENT hiv (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT country (#PCDATA)>
<!ELEMENT city (#PCDATA)>
A hiv, company, country és city elemek szöveges adatot tartalmaznak, ezt jelzi a #PCDATA deklaráció. Ezek további elemeket nem tartalmazhatnak.
<!ELEMENT employee (empno, firstname, lastname, phone, hiredate, salary)>
Az employee elemnek a következő elemeket kell tartalmaznia, de mindegyikből csak egyet: empno, firstname, lastname, phone, hiredate, salary. Ezek az elemek szintén csak szöveges adatot tartalmazhatnak, és más elemeket nem.
<!ELEMENT empno (#PCDATA)>
<!ELEMENT firstname (#PCDATA)>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT hiredate (#PCDATA)>
<!ELEMENT salary (#PCDATA)>
A customer, order és hiv elemeknek attribútuma is van, ezeket adhatjuk meg az !ATTLIST definícióban. A customer és az order elemek azon attribútuma (jellemzője) az azonosításra szolgál, ezt jelzi az ID, ami a HTML name megfelelője. Ez egy kötelezően megadandó attribútum, amit a #REQUIRED mutat. A hiv elem cel attribútuma, mint a neve is mutatja egy hivatkozás (IDREF), amit szintén kötelezően meg kell adni. Ez ugyanaz, mint a HTML-ben a href.
<!ATTLIST customer azon ID #REQUIRED>
<!ATTLIST order azon ID #REQUIRED>
<!ATTLIST hiv cel IDREF #REQUIRED>
Maga az XML dokumentum az előző példához képest annyiban változik, hogy a dokumentum elején hivatkozunk a DTD-re és a stíluslapra:
<!DOCTYPE customers SYSTEM "test.dtd">
<?xml:stylesheet type="text/xsl" href="test.xsl"?>
A !DOCTYPE után a dokumentum típusát kell megadni, ami megegyezik a gyökér elem nevével. A SYSTEM kulcsszó arra utal, hogy egy külső fájlra hivatkozunk, amit az adott ponttól kell beszúrni a dokumentumba. Ez a fájl nem más, mint a fent ismertetett DTD-t tartalmazó "test.dtd" állomány.
A következő sorban a stíluslapra hivatkozunk.
Más változás is van a dokumentumban. A customers elem hiv elemeket tartalmaz, melyek hivatkozások a dokumentumban szereplő customer elemekre. Ennek elsősorban a böngészőben való megjelenítésnél vesszük hasznát, ahol az oldal tetején fel lesznek sorolva ezek a hivatkozások.
A dokumentum átalakítása egy XSL állomány tartalma szerint történik, ezért létrehozzuk ezt a fájlt is. Ezt nem adatbázisból állítjuk elő, hanem előre megszerkesztjük. Egy ilyen XSL állomány ugyanúgy megnyitható Internet Explorer-rel, mint egy XML fájl, így a szerkezetét könnyebb áttekinteni. Ha az Explorer-rel megnyitunk egy XML állományt, amihez tartozik egy XSL állomány is, akkor nem a dokumentum szerkezetét fogja megjeleníteni, hanem az XSL tartalma szerint feldolgozza azt, és az így megformázott dokumentumot látjuk.
Az XSL fájl eleje így néz ki:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
Az első sor tulajdonképpen megegyezik az XML fájl elejével. Az encoding attribútum megadására azért van szükség, hogy ékezetes karaktereket is tudjunk használni.
A következő sor az XSL verziószámát, és a névteret azonosítja. A névtér használatára szükség lesz az XSL-specifikus parancsok használatánál, ezzel különböztetve meg azokat a többi elemtől.
A harmadik sorban egy minta deklaráció található. Minden XSL fájlban legalább egy ilyennek kell szerepelnie. A match attribútum értéke egy "/" karakter, amely a gyökeret azonosítja. Ezzel azt érjük el, hogy a template elemben megadott mintát az egész dokumentumra érvényesíteni akarjuk. Ettől kezdve már vegyesen használunk HTML és XSL elemeket a feldolgozáshoz.
Az XML dokumentumban előfordulnak ismétlődő elemek, melyeket ugyanúgy kell megformázni. Erre használható az XSL for-each utasítása:
<xsl:for-each select="customers/hiv">
<A><xsl:attribute name="href"><xsl:value-of select="@cel"/></xsl:attribute><xsl:value-of/></A>
</xsl:for-each>
A fenti példa az összes hiv elemre - amely a customers elemen belül található - vonatkozó átalakítási szabályt ír le. Az <A> elem egy egyszerű HTML elem, amely egy hivatkozást zár közre. Ennek kell, hogy legyen egy href attribútuma, aminek az értéke a hivatkozott elem azonosítója (name). Az attribute paranccsal létrehozzuk ezt. Az attribute parancs name jellemzője megadja az elem attribútumának nevét. Ezután ennek értéket is kell adni, ami a value-of paranccsal történik. Ennek select jellemzőjén keresztül adhatjuk meg ezt az értéket. A "@" karakter azt jelzi, hogy ezt egy attribútumból vesszük, méghozzá a hiv elem cel attribútumából. Ha a "@" karaktert nem adjuk meg, akkor a hiv elem cel elemének tartalmát adná meg, ami nem is létezik, hiszen cel nevű elem nincs. Ha megvan az érték is, akkor lezárjuk az attribute elemet, majd szintén a value-of paranccsal beszúrjuk a hiv elem tartalmát. Ha nem adunk meg a value-of parancs után select-et, akkor az éppen feldolgozott elem tartalma lesz az adott helyre beszúrva, mint ebben az esetben. Be kell még szúrnunk egy </A> HTML elemet, amivel lezárjuk a hivatkozást. Ha elvégeztünk minden szükséges műveletet, akkor a for-each elemet is le kell zárni. Ezzel a fenti kódrészlettel azt értük el, hogy az összes hivatkozás a dokumentum elején fel lesz sorolva egymás mellett úgy, hogy mindegyik a dokumentum megfelelő részére hivatkozik.
A következő feladat a customer elemek feldolgozása. Ebből szintén több található a dokumentumban, tehát megint a for-each parancsot használjuk. Elsőként szintén beszúrunk egy <A> HTML elemet, de most ennek a name attribútumát állítjuk be, majd le is zárjuk az elemet. A fenti hivatkozások ezekre a célpontokra fognak mutatni.
<xsl:for-each select="customers/customer">
<A><xsl:attribute name="NAME"><xsl:value-of select="@azon"/></xsl:attribute></A>
A következő rész elsőre talán bonyolultnak tűnhet, de csak a HTML elemek használata miatt. A lényeg
a kódrészletben a value-of parancsok. A select attribútumoknak most nem egy attribútumot adunk
értékül, hanem a company, country és city elemek tartalmát.
<P><H2 STYLE="margin-bottom: 0px;"><xsl:value-of select="company"/></H2>
<H3 STYLE="margin-top: 0px;"><xsl:value-of select="country"/>, <xsl:value-of select="city"/></H3></P>
A többi kódrészlet már értelmezhető a fentiek ismeretében. A fájl végén nem szabad elfeledkezni a
template és a stylesheet elemek lezárásáról:
</xsl:template>
</xsl:stylesheet>
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 409. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|