Lucrarea 5

Download: PDF ODT

Rezumat laborator

  1. Principii
    • Apelul unui template anume cu opțiunea de a transmite și parametri se face cu ajutorul tag-ului xsl:call-template
    • Importarea unor noduri din fișiere externe XML se face cu ajutorul funcției document()
  2. Cuvinte cheie
    • xsl:call-template, document()

Elementul <xsl:call-template>

Acest element este folosit atunci când dorim să apelăm în mod explicit un anumit şablon căruia opţional îi putem transmite şi parametri.

Sintaxa <xsl:call-template>:

<xsl:call-template name="nume-sablon">

<!-- Continut:xsl:with-param* -->

</xsl:call-template>

Atribut:

  • name - Necesar. Specifică şablonul care va fi apelat.

Exemplul de mai jos va apela şablonul denumit student căruia îi va transmite parametrul student_id cu valoarea @id:

<xsl:for-each select="//laborator/student">

Nume: <xsl:value-of select="nume" />

<xsl:call-template name="student">

<xsl:with-param name="student_id" select="@id"/>

</xsl:call-template>

</xsl:for-each>

Şablonul apelat va putea folosi parametrul primit în felul următor:

<xsl:template name="student">

<xsl:param name="student_id" select="0"/>

Am primit id-ul: <xsl:value-of select="$student_id"/>

</xsl:template>

Şablonul este denumit student şi specifică faptul că primeşte un parametru denumit student_id. Acest parametru are şi o valoare implicită care este 0. Referirea parametrului în interiorul şablonului se face prin prefixarea lui cu caracterul $ ($student_id). Parametrii pot să aibă orice tip de valoare (şir de caractere, numeric, element, mulţime de elemente, etc.). Orice şablon se poate apela recursiv (evitându-se însă buclele infinite).

Funcţia document()

Funcţia document este folosită pentru a accesa nodurile unui document XML din interiorul unei document XSL. Este astfel posibilă scrierea unui document XSL care să prelucreze simultan două sau mai multe documente XML.

Sintaxa document():

node-set document(uri, node-set?)

Atribute:

  • uri - Necesar. Specifică documentul care va fi folosit.
  • node-set - Opţional. Specifică o mulţime de noduri pentru a rezolva conflictele de nume.

Exemplu:

<xsl:for-each select="document('lista-prezenta.xml')//prezenta">

Va itera peste toate elementele <prezenta> care se află în documentul XML listaprezenta.xml

Atenţie:

Prin folosirea acestei funcţii nodul context se va afla în documentul XML referit de această funcţie şi nu în documentul XML pe care îl prelucrează implicit documentul XSL.

TEMĂ

1. Se consideră două documente XML care respectă următoarele :

studenti.dtd

<!ELEMENT studenti ( student+ ) >

<!ELEMENT student ( nume, prenume, anul-nasterii, luna-nasterii, ziua-nasterii ) >

<!ATTLIST student id NMTOKEN #REQUIRED >

<!ELEMENT nume ( #PCDATA ) >

<!ELEMENT prenume ( #PCDATA ) >

<!ELEMENT anul-nasterii ( #PCDATA ) >

<!ELEMENT luna-nasterii ( #PCDATA ) >

<!ELEMENT ziua-nasterii ( #PCDATA ) >

lista-prezenta.dtd

<!ELEMENT lista-prezenta ( prezenta+ ) >

<!ELEMENT prezenta ( student* ) >

<!ATTLIST prezenta data NMTOKEN #REQUIRED >

<!ELEMENT student EMPTY >

<!ATTLIST student id NMTOKEN #REQUIRED >

Se consideră documentul studenti.xml care reprezintă studenţii înregistraţi, prezenţa acestora este înregistrată în fişierul lista-prezenta.xml. În data de 8 ianuarie 2004 au fost prezenţi studenţii: Popescu Ion, Florescu Ioana şi Dumitrescu Maria.

2. Se cere realizarea unui document care să realizeze transformarea acestor două documente XML într-un document HTML cu următorul aspect:

sau

Thank you Anamaria !

Studenţii vor fi sortaţi crescător după data naşterii.