Lucrarea 4

Download: PDF

  1. Principii
    • Atributul unui nod poate fi prelucrat la fel de simplu ca și descendenții săi, prin expresii XPath.
    • Crearea de atribute pentru nodurile de ieșire se face cu instrucțiunea xsl:attribute.
    • La folosirea unor șabloane aflate în fișiere XSL externe, se apelează xsl:import la referirea inițială şi xsl:apply-imports la momentul apelării lor.
    • xsl:apply-imports funcționează prin înlocuirea șablonului curent cu cel(e) importat(e) în prealabil; poate să apară oriunde într-un XSL.
  2. Cuvinte cheie
    • xsl:attribute, xsl:import, xsl:apply:imports

Elementul <xsl:attribute>

Să presupunem că dorim să generăm un document HTML care să conţină o colecţie de fotografii. Aceste fotografii sunt stocate la o anumită locaţie pe disc, iar informaţiile despre ele sunt stocate într-un document XML. Structura documentului o considerăm cât se poate de simplă:

  • Colecţia de imagini, fişier imagini.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<colectie>

<imagine id="identificator">

<titlu>titlul imaginii</titlu>

<url>locatia imaginii</url>

<latime>latimea imaginii in pixeli</latime>

<inaltime>inaltimea imaginii in pixeli</inaltime>

</imagine>

<!-- alte elemente -->

</colectie>

Vom reţine deci despre fiecare imagine titlul imaginii, adresa unde se află imaginea, precum şi lăţimea şi lungimea imaginii. Afişarea imaginii în documentul HTML se va face utilizând eticheta <img>. Pentru fiecare etichetă <img> trebuie să setăm atributul src precum şi atributele width şi height. Setarea parametrilor ridică însă o problemă: nu vom putea atribui valori atributelor pentru elementele trimise la ieşire prin simpla folosire a elementelor XSL (<xsl:value-of> de exemplu). Pentru a rezolva această problemă vom avea nevoie de elementul <xsl:attribute>.

Sintaxa xsl:attribute

<xsl:attribute name="nume atribut" namespace="uri">

<!-- Continut -->

</xsl:attribute>

Atribute:

  • name (necesar) – Specifică numele atributului.
  • namespace (opţional) – Specifică un spaţiu de nume pentru atribut.

Folosirea acestui element se face ca în exemplul de mai jos:

  • Macheta colecţiei de imagini, fişier colectia.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<html>

<head>

<title>My images collection</title>

</head>

<body>

<xsl:apply-templates/>

</body>

</html>

</xsl:template>

<xsl:template match="imagine">

<p>

<xsl:value-of select="titlu"/>

</p>

<p>

<img>

<xsl:attribute name="height">

<xsl:value-of select="inaltime"/>

</xsl:attribute>

<xsl:attribute name="width">

<xsl:value-of select="latime"/>

</xsl:attribute>

<xsl:attribute name="src">

<xsl:value-of select="url"/>

</xsl:attribute>

</img>

</p>

</xsl:template>

</xsl:stylesheet>

Acesta este de fapt întregul document XSL care generează ieşirea pentru colecţia noastră de fotografii. Elementul <xsl:attribute> este folosit în interiorul unei etichete <img>, pentru a-i seta cei trei parametri. Acelaşi model va fi folosit de fiecare dată când vom dori să setăm un parametru a cărui valoare nu este implicită.

Elementul <xsl:import>

De obicei documentele XML au dimensiuni respectabile nu numai în ceea ce priveşte numărul de înregistrări, dar şi în ceea ce priveşte structura lor. Ele ar putea să conţină atât de multe noduri, încât să fie foarte greu pentru un singur programator să genereze documentul XSL necesar pentru afişare; numărul de şabloane ar fi prea mare.

În acest caz singura soluţie este diviziunea muncii. Un lucru esenţial pentru acest lucru îl reprezintă necesitate realizării unei independenţe între cei ce lucrează la acelaşi document (eliminarea timpilor de aşteptare dintre ei).

Modalitatea de a realiza acest lucru este ca fiecare programator să scrie un document separat care să conţină doar şabloanele sale, iar la final aceste documente individuale să fie referite dintr-un alt document XSL.

Referirea dintr-un alt document se poate face prin două metode: utilizând elementul <xsl:import> sau utilizând elementul <xsl:include>.

Primul va permite existenţa duplicitară a mai multor şabloane, însă cele din documentul importat vor avea o prioritate mai mică, şi nu vor fi aplicate decât dacă sunt referite în mod explicit. Includerea unui alt document XSL realizează practic o duplicare a şabloanelor pe care documentul inclus le conţine în documentul care îl include.

Sintaxa xsl:import

<xsl:import href="URI"/>

Atribut:

  • href (necesar) – Specifică locaţia documentului ce va fi importat.

Elementul <xsl:apply-imports>

După cum am văzut, importarea unui alt document XSL se face prin atribuirea unei precedenţe mai mici pentru şabloanele din documentul importat. Pentru a aplica un şablon dintr-un document importat acest lucru trebuie făcut în mod explicit, prin intermediul elementului <xsl:apply-imports>.

Sintaxa xsl:apply-imports

<xsl:apply-imports/>

Ca exemplu să reluăm exemplul colecţiei de CD-uri. Să presupunem că la crearea documentului au contribuit trei programatori. Primul a realizat documentul principal, care le va importa pe celelalte două (acestea din urmă

respectă definiţia unui document XSL şi conţin fiecare câte un singur şablon; fiecare din aceste şabloane este aplicat doar atunci când în documentul principal acest lucru este cerut în mod explicit prin intermediul elementului <xsl:apply:imports>).

Cele trei documente XSL ar putea arăta în felul următor:


  • Macheta principală a colecţiei de CD-uri, fişier catalog3.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:import href="title.xsl"/>

<xsl:import href="artist.xsl"/>

<xsl:template match="/">

<html>

<body>

<h2>My CD Collection</h2>

<xsl:apply-templates/>

</body>

</html>

</xsl:template>

<xsl:template match="cd">

<p>

<xsl:apply-templates select="title" />

<xsl:apply-templates select="artist"/>

</p>

</xsl:template>

<xsl:template match="title|artist">

<xsl:apply-imports />

</xsl:template>

</xsl:stylesheet>

  • Macheta a doua a colecţiei de CD-uri, fişier title.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="artist">

Artist: <span style="color:#ff0000">

<xsl:value-of select="."/>

</span>

<br />

</xsl:template>

</xsl:stylesheet>

  • Macheta a treia a colecţiei de CD-uri, fişier artist.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="artist">

Artist: <span style="color:#00ff00">

<xsl:value-of select="."/>

</span>

<br />

</xsl:template>

</xsl:stylesheet>


TEMĂ

1. Se consideră dat un document XML care respectă restricţiile de mai jos

(books.dtd):

Definiţia tipului documentului XML, fişier books.dtd

<!ELEMENT books (book)+ >

<!ELEMENT book (name, author, listprice, price, review, publish)>

<!ELEMENT name (#PCDATA )>

<!ATTLIST name link CDATA #REQUIRED>

<!ELEMENT author (#PCDATA)>

<!ELEMENT listprice (#PCDATA)>

<!ELEMENT price (#PCDATA)>

<!ELEMENT review (#PCDATA)>

<!ELEMENT publish (#PCDATA)>

2. Să se scrie un document XSL care să afişeze documente XML cu structura de mai sus şi care să îndeplinească următoarele restricţii:

o Există un document XSL rădăcină care va importa / include alte documente XSL;

o Fiecare carte va fi afişată într-un tabel, iar tabelele vor fi separate printr-o linie orizontală;

o Elementul <name> va constitui o legătură către adresa precizată prin atributul link;

o Elementul <review> va fi afişat sub forma unei imagini stocate în directorul curent şi care are numele “star-<review>.png”;

o Fiecare element din documentul XML va fi afişat printr-un şablon definit într-un fişier separat.

Aspectul documentului rezultat se poate vedea în imaginea de mai jos:

Utile: stars.zip