470 likes | 639 Views
C06. XSLT. Date Semistructurate, 2012-2013. C 06 . DS. XSLT. C06 - DS. XSL (eXtensible Style Sheet Language) = XSLT (transformarea documentelor XML), XPath (navigarea in documentele XML), XSL-FO (formatarea documentelor XML).
E N D
C06. XSLT Date Semistructurate, 2012-2013
C06. DS • XSLT
C06 - DS • XSL (eXtensible Style Sheet Language) = • XSLT (transformarea documentelor XML), • XPath (navigarea in documentele XML), • XSL-FO (formatarea documentelor XML). • XSLT este o aplicatie XML prin care se specifica reguli prin care un document XML este transformat intr-un alt document XML (sau alt format de document, de exemplu HTML). • O transformare XSLT nu schimba documentul sursa, ci se proceseaza un arbore (o ierarhie) din memorie (dat de structura documentului XML) si creeaza o structura de iesire (in generalun arbore) in memorie, bazat pe nodurile din arborele sursa si regulile de template continute in stylesheet. • Un XSLT document = XSLT stylesheet = contine reguli template. Fiecare regula template are un sablon (pattern) si un template.
C06 - DS • Workflow in transformarea XSLT: • Documentul sursa XML (documentul de intrare) • -> arborele sursa (ierarhie de noduri) in memorie – (procesorul XSLT) arborele rezultat (ierarhie de noduri) in memorie • -> versiunea serializata a arborelui rezultat (documentul de iesire) • Cand un document XML este procesat, sunt doi arbori in memorie: sursa si rezultatul. • O transformare XSLT, in general folosind expresii XPath, creeaza un arbore rezultat, forma, de asemenea, din noduri (chiar daca e un singur nod pentru fisierele text). • In general, documentul rezultat este un alt document XML sau un document HTML, pentru care structura ierarhica este clara. Chiar daca rezultatul este un simplu fisier text, insusi XSLT-ul aplicat da o anumita structura ierarhica. Documentul final este obtinut prin serializarea arborelui de iesire.
C06 - DS • xsl:stylesheet & xsl:transform • Fiind un document XML, un XSLT stylesheet ar trebui sa aiba o declaratie XML. • Elementul radacina este stylesheet sau transform: acestea sunt echivalente ca semnificatie, sub-elemente si atribute posibile. • Elementele stylesheet si transform, precum si celelalte elemente XSLT, sunt in s.n. http://www.w3.org/1999/XSL/Transform. Acest s.n. in general primeste prefixul xsl => elementele sunt folosite ca xsl:stylesheet & xsl:transform. • In elementul radacina se gaseste declaratia de s.n., precum si version=”1.0”.
C06 - DS • xsl:stylesheet & xsl:transform • Exemplu – document minimal XSLT: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> </xsl:stylesheet> • Asocierea in doc XML: <?xml-stylesheet type="application/xsl" href="xslt_min.xsl"?> sau <?xml-stylesheet type="text/xsl" href="xslt_min.xsl"?> (pentru Microsoft)
C06 - DS • Template-uri si reguli de template • Un stylesheet XSLT contine reguli de template pentru a controla modul de afisare al documentului XML dat ca intrare. • Fiecare regula de template este data ca element xsl:template. Acesta are un atribut match care contine un sablon XPath cu ajutorul caruia se aleg elementele pentru care sa se aplice regula data. • Acelasi element xsl:template contine un template care este instantiat si dat ca iesire atunci cand se gaseste un element al documentului care se potriveste sablonului XPath. • Observatie: Un element xsl:template contine un sablon si un template!!! • Observatie: Tot ceea ce apare intr-un stylesheet si nu este element XSLT (textul „in plus”, printre elementele XSLT), este pus in rezultat ca atare.
C06 - DS • Sabloane • Cel mai simplu sablon este prin specificarea numelui de element XML. • Exemplu: <xsl:template match="person"> A Person </xsl:template> • => la intalnirea unui element “person”, se afiseaza textul „A Person”,iar pentru celelalte elemente din document nu se afiseaza nimic. • Textul dat in exemplul de mai sus este numit literal data characters (text oarecare). • Este posibil ca template-ul sa contina text cu marcaje (literal result elements), care, de asemenea, sunt date la iesire. • Exemplu: output HTML <xsl:template match="person"> <p>A Person</p> </xsl:template> Orice marcaj care este inclus intr-un template trebuie sa fie well-formed!!!
C06 - DS • Continutul unui element • In general, un element nu se inlocuieste cu un text oarecare (constanta), ci se foloseste continutul sau:xsl:value-of. • Acest element calculeaza valoarea string a unei expresii XPath si o insereaza in rezultat. Valoarea elementului este considerata ca fiind continutul efectiv al sau (ceea ce ramane daca sunt eliminate tag-urile si s-au inlocuit referintele de caractere si entitati). • Elementul al carui valoare se considera este identificat prin atributul select, care contine o expresie XPath. • Exemplu: <xsl:template match="person"> <p> <xsl:value-of select="name"/> </p> </xsl:template> • => pentru un element “person” se ia continutul elementului “name”
C06 - DS • Aplicarea template-urilor • Implicit, procesorul XSLT citeste documentul XML de intrare de sus in jos, de la radacina, in preordine. • Regulile de template sunt activate in ordinea in care se gasesc elemente care se potrivesc sablonului respectiv => o regula de template pentru un element parinte este activata inainte de regula de template pentru un element fiu al acestuia. • Aceasta ordine poate fi schimbata prin specificarea elementului (elementelor) care sa fie procesat in continuare. Sau – se poate mentiona ca un element sa fie procesat in timpul procesarii unui alt element sau sa nu fie procesat deloc. • In exemplele anterioare – s-a prevenit procesarea elementelor fii ale elementului person prin simplul fapt ca pentru acest element s-a dat textul cu care sa fie inlocuit. • Elementele xsl:apply-templates permit exprimarea ordinii de procesare a elementelor. Acestea au un atribut select al carui valoare este o expresie XPath care spune procesorului XSLT care nod sa fie procesat in acel moment.
C06 - DS • Exemplu: sa se afiseze numele, apoi prenumele si nici o informatie despre profesie sau hobby: <xsl:template match="person"> <xsl:apply-templates select="name"/> </xsl:template> <xsl:template match="name"> <xsl:value-of select="last_name"/>, <xsl:value-of select="first_name"/> </xsl:template> => al doilea template este pentru person – sa se aplice template-ul numai pentru elementele fiu name, nu si pentru profession sau hobby • Observatie: Nu conteaza ordinea in care sunt date template-urile in stylesheet; conteaza ordinea elementelor in documentul XML de intrare.
C06 - DS • Este important ca in aplicarea template-ului pentru un element sa se ia in considerare si template-urile elementelor fiu. • Exemplu: <xsl:template match="people"> <html> <head><title>Famous Scientists</title></head> <body> <xsl:apply-templates select="person"/> </body> </html> </xsl:template> • => Documentul XML de intrare are un singur element people, pentru care stabileste head-ul documentului HTML rezultat. • Pentru a include rezultatul pentru elementele person in interiorul documentului HTML, trebuie ca template-ul pentru people sa specifice acest lucru – elementul body contine element xsl:apply-templates prin care se indica procesorului XSLT sa proceseze toti fiii person ai elementului curent people si sa insereze textul de iesire in elementul body al documentului de iesire.
C06 - DS • Pentru a aplica in sectiunea body template-urile tuturor elementelor fiu, nu se foloseste atributul select: <xsl:template match="people"> <html> <head> <title>Famous Scientists</title> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> • Obs: Exemplele de mai sus au acelasi efect in VS.
C06 - DS • Reguli de template built-in • 7 tipuri de noduri (vezi noduri XPath) • Daca nu se specifica un template pentru un anumit element, se pot stabili template-uri implicite • text() – nod text • comment() – nod comentariu • @* – orice nod atribut • * – orice nod element • / – nodul radacina • Exemple:
C06 - DS <?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="..."> <xsl:template match="people"> <html> <head><title>Famous Scientists</title> </head> <body> <dl> <xsl:apply-templates/> </dl> </body> </html> </xsl:template> <xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template> <xsl:template match="person"> <dt><xsl:apply-templates select="name"/></dt> <dd><ul> <li>Born: <xsl:apply-templates select="@born"/></li> <li>Died: <xsl:apply-templates select="@died"/></li> </ul></dd> </xsl:template> </xsl:stylesheet>
C06 - DS • Template valoare de atribut • Un template valoare de atribut este o expresie XPath, intre acolade, data ca valoare a unui atribut in stylesheet. • Exemplu: in loc de elementele “name”, sa se afiseze elemente “name” goale, unde numele, initiala si prenumele sunt date ca atribute <xsl:template match="name"> <name first="{first_name}" initial="{middle_initial}" last="{last_name}" /> </xsl:template> => <name first="Richard" initial="P" last="Feynman"/> • => valoarea atributului “first” din rezultat este inlocuita cu valoarea elementului “first_name” din documentul de intrare, s.a.m.d.
C06 - DS • Template valoare de atribut <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml"/> <xsl:template match="facultate"> <f> <xsl:apply-templates select="studenti"/> </f> </xsl:template> <xsl:template match="studenti"> <studenti nrmatr="{@NrMatricol}" nume="{Nume}"></studenti> </xsl:template> </xsl:stylesheet> • => se obtin elemente “studenti” care au atributul “nrmatr” egal cu valoarea atributului “NrMatricol” din input
C06 - DS • Elemente XSLT • Pentru XSLT sunt definite cateva elemente top-level – care pot sa apara ca element fiu imediat al elementului radacina. • <xsl:import> • Daca se foloseste elementul <xsl:import>, atunci acesta trebuie sa se gaseasca inaintea tuturor celorlalte elemente top-level. • Exemplu: <xsl:import href="ToBeImported.xsl"/> • Documentul care se importa trebuie sa fie un document XSLT complet / corect.Calea data poate fi absoluta sau relativa, pe masina locala sau la o adresa Web. • In momentul in care se importa documentul mentionat, i se elimina elementul radacina <xsl:stylesheet> si inlocuieste in documentul curent elementul de import. • (permite redefinire de template in XSLT curent)
C06 - DS • <xsl:include> - permite includerea unui modul XSLT in documentul curent. • Exemplu: <xsl:include href="ModuleToBeIncluded.xsl"/> • Diferenta fata de <xsl:import> este ca semnificatia”” stylesheet-ului inclus nu este modificat de includere (la import – un template cu un nume care este definit si in document, este suprascris de acesta). • (nu permite redefinire de template in XSLT curent)
C06 - DS • <xsl:attribute-set> - este folosit pentru definirea unui set de atribute si valori. • Acest set de atribute are un nume, a.i. este suficient sa fie definit o data si sa fie folosit ca un grup in oricare element de iesire. <xsl:attribute-set name="ats1"> <xsl:attribute name="a1">1</xsl:attribute> <xsl:attribute name="a2">2</xsl:attribute> </xsl:attribute-set> <xsl:template match="facultate"> <f> <xsl:apply-templates select="sectii"/> <xsl:apply-templates select="studenti"/> </f> </xsl:template> <xsl:template match="sectii"> <sectie xsl:use-attribute-sets="ats1"></sectie> </xsl:template> <xsl:template match="studenti">...</xsl:template> <?xml version=“1.0”?> <f> <sectie a1=“1” a2=“2” /> <sectie a1=“1” a2=“2” /> <sectie a1=“1” a2=“2” /> … </f>
C06 - DS • <xsl:decimal-format> - este folosit impreuna cu functia XSLT format-number(); cand un numar este convertit la string folosind aceasta functie, elementul defineste caracterele si simbolurile care sa fie folosite. • Acest element este intotdeauna gol, toate specificatiile necesare fiind date prin valori de atribute (optionale) (name, decimal-separator, grouping-separator, infinity, minus-sign, NaN, percent, per-mille, zero-digit, digit, and pattern-separator).
C06 - DS • <xsl:output> - este folosit pentru a determina formatul de iesire al unei transformari XSLT. • In timpul unei transformari XSLT se creeaza mai intai arborele rezultat, apoi acest rezultat este serializat pentru a obtine documentul final (XML, HTML, etc.). Acest element actioneaza in procesul de serializare, si nu la crearea arborelui rezultat. Practic, acest element se poate folosi pentru a specifica explicit, fara ambuguitati, tipul rezultatului. • Exemplu: <xsl:output method="html"/> • Implicit, method are valoarea „xml” (mai poate fi „html” sau „text”). Daca oricum elementul radacina al rezultatului este <html>, este clar tipul rezultatului. • Acest element mai are 9 atribute, printre care – de specificare de encoding, de indentare (daca rezultatul sa fie indentat conform structurii arborescente rezultate; yes/no), etc.
C06 - DS • <xsl:param> - folosit in top-level – defineste un parametru global; daca apare intr-un element <xsl:template>, trebuie sa fie primul element fiu al acestuia si atunci defineste un parametru local. • Atributul name contine numele parametrului (obligatoriu), si atributul select contine valoarea implicita a acestuia (optional). Daca acest element are atributul select, atunci trebuie sa fie un element gol; altfel – ar putea sa contina un corp de element <xsl:template>, sau direct valoarea dorita. • Pentru un parametru local se poate da o valoare explicita folosind elementul <xsl:with-param> ca si fiu al unui element <xsl:apply-templates> sau <xsl:call-template>. • Se foloseste: $nume_param. • <xsl:preserve-space> - controleaza cum sunt gestionate whitespace-urile din documentul sursa (tab, newline, CR, space character) – se da o lista de elemente din documentul XML pentru care „spatiile” sa fie pastrate.
C06 - DS • <xsl:template> - defineste un template care e folosit sa creeze o parte din (sau chiar tot) arborele rezultat. Un asemenea element este instantiat atunci cand se intalneste un nod care se potriveste sablonului specificat sau cand este „apelat” prin numele sau. • Potrivirea elementelor – cu ajutorul atributului „match” care contine o expresie XPath de selectie a nodurilor. • Numirea template-urilor: <xsl:template name="myTemplate"> • Apelul template-urilor cu nume: <xsl:call-template name="myTemplate"/> • Daca un template are si „name”, si „match”, acesta se poate folosi cu ajutorul <xsl:apply-template> sau <xsl:call-template>.
C06 - DS • <xsl:variable> - este folosit pentru a declara o variabila locala sau globala in stylesheet. Daca este folosit la top-level, atunci se declara o variabila globala, iar in interiorul unui element <xsl:template> se declara o variabila locala. • Exemplu: <xsl:variable name="CurrentPrice" select="//Stocks/MyStock/CurrentPrice"/> • => declara o variabila care se poate referi in interiorul stylesheet-ului prin $CurrentPrice. <elementatribut="{$CurrentPrice}"/> • In atributul „select” se da o expresie XPath care este evaluata pentru a da o valoare variabilei. Daca exista acest atribut, elementul trebuie sa fie gol. Altfel, valoarea variabilei este determinata de continutul elementului. • Exemplu: <xsl:variable name="Capital">Washington</xsl:variable> • Echivalent cu... <xsl:variable name="Capital" select="Washington"/> • Observatie: O variabila XSLT este mai degraba o constanta – nu exista o „instructiune” pentru atribuirea unei valori unei variabile deja declarate.
C06 - DS • Alte elemente XSLT – care pot sa apara in interiorul elementelor de top-level • <xsl:apply-imports> - este folosit in interiorul unui template; se foloseste pentru aplicarea unui template care este definit intr-un modul care se importa (<xsl:import>) • Daca in stylesheet-ul curent este definit un template cu un acelasi nume ca al unui element din modulul importat, template-ul intern are prioritate fata de template-ul importat • => se foloseste <xsl:apply-imports> pentru a folosi explicit template-ul importat.
C06 - DS • <xsl:apply-templates> - defineste un set de noduri pentru a fi procesat; este o instructiune care este intotdeauna folosita intr-un template si selecteaza setul de noduri din arborele de intrare si initiaza procesarea fiecarui nod din set prin determinarea template-ului corespunzator. • Daca <xsl:apply-templates> contine imbricat un element <xsl:sort>, atunci acesta determina ordinea in care nodurile din setul determinat sunt procesate. Un alt element care poate sa apara in interiorul <xsl:apply-templates> este <xsl:with-param>. • Elementul <xsl:apply-templates> poate sa aiba atributul „select” – selecteaza setul de noduri care urmeaza sa fie procesate. • Exemplu: <xsl:apply-templates select="person"/> ...are ca efect instantierea template-ului: <xsl:template match="person"> <!– Definitia de template. --> </xsl:template>
C06 - DS • <xsl:attribute> - este folosit pentru a adauga un nod de tip atribut in arborele de iesire. • Un asemenea nod atribut poate fi „scris” doar in anumite conditii • un nod element corespunzator trebuie sa fi fost scris in arborele de iesire • si nici un alt tip de nod in afara de un nod de tip atribut nu a fost adaugat inainte in arborele de iesire inainte de acest nod atribut. • Practic, un element <xsl:attribute> este folosit impreuna cu <xsl:element> sau <xsl:copy> sau cu un „literal result element”.
C06 - DS • <xsl:attribute> • Exemplu: scrierea in rezultat al unui element <div>, cu un atribut „align” <div><xsl:attribute name="align">left</xsl:attribute></div> • ...sau: <xsl:element name="person"> <xsl:attribute name="idPerson">123</xsl:attribute> </xsl:element> • Un element <xsl:attribute> poate sa apara intre tagurile unui element, intr-un element <xsl:element> sau <xsl:attribute-set>. • Un element <xsl:attribute> poate sa aiba doua atribute: „name” este obligatoriu – poate fi de forma unui „attribute value template”; „namespace” este optional. Valoarea atributului creat este data de continutul elementului (trebuie sa fie un string – e interpretat ca string).
C06 - DS • <xsl:call-template> • se foloseste pentru apelul explicit al unui template cu nume; • are un singur atribut obligatoriu, care reprezinta numele template-ului care se apeleaza. • Numele template-ului nu se poate specifica printr-o variabila – se poate face mai flexibila alegerea template-ului daca <xsl:call-template> se include intr-un element <xsl:choose>. • Intr-un element <xsl:call-template> se poate folosi <xsl:with-param>.
C06 - DS • <xsl:call-template> • Exemplu: <xsl:template name="myTemplate"> <!– template-ul --> </xsl:template> <xsl:call-template name="myTemplate"/> • Pentru a transmite un parametru: <xsl:call-template name="myTemplate"> <xsl:with-param name="myParam" select="myExpression"/> </xsl:call-template> • ... si pentru ca acest parametru transmis sa fie evaluat in template-ul apelat: <xsl:template name="myTemplate"> <xsl:param name="myParam"/> <!--restul template-ului --> </xsl:template>
C06 - DS • <xsl:choose> - folosit pentru a face o alegere dintr-un set de optiuni; nu are atribute; continutul este stabilit prin unul sau mai multe elemente <xsl:when> si un element optional <xsl:otherwise>. • Exemplu: <xsl:choose> <xsl:when test="Expresie1"> <!-- Actiune caz 1 --> </xsl:when> <xsl:when test="Expresie2"> <!--Actiune caz 2 --> </xsl:when> <xsl:otherwise> <!--Actiune alt caz --> </xsl:otherwise> </xsl:choose>
C06 - DS • <xsl:choose> • Daca, de exemplu, primul <xsl:when> al carui atribut se evalueaza la „true” este primul din lista, atunci toate restul, inclusiv <xsl:otherwise>, sunt ignorate (se opreste la primul care este „true”). • Daca nici un <xsl:when> nu are un atribut „true”, atunci se instantiaza elementul <xsl:otherwise>, daca exista. • Observatie: <xsl:choose> cu un singur element <xsl:when> si fara element <xsl:otherwise> este echivalent cu <xsl:if>.
C06 - DS • <xsl:comment> - este folosit pentru a scrie un comentariu in arborele rezultat; nu are atribute. • Exemplu: <xsl:comment> Acesta este un comentariu. </xsl:comment> • => va scrie in documentul rezultat: <!-- Acesta este un comentariu. -->
C06 - DS • <xsl:copy> - copiaza nodul curent din documentul sursa in arborele rezultat; doar nodul este copiat, nu si atributele sau nodurile descendente (shallow copy). Are un atribut optional „use-attribute-sets”. • Efectul lui <xsl:copy> difera, in functie de tipul nodului curent din document, in momentul in care <xsl:copy> este instantiat. • Daca nodul curent este un nod element, este ca si cum s-ar fi utilizat elementul <xsl:element> cu atributul „name” setat cu numele tipului de element al nodului curent. Daca se specifica atributul „use-attribute-sets”, atunci sunt copiate si atributele specificate. Daca nodul curent este un nod de tip atribut, este ca si cum elementul <xsl:attribute> ar fi folosit, cu „name” setat cu numele atributului = nod curent. Daca nodul curent este de tip text, se copiaza pur si simplu in rezultat. • In general, <xsl:copy> este folosit cand un document XML se transforma intr-un alt document XML.
C06 - DS • <xsl:copy-of> - copiaza un set de noduri in rezultat; are un atribut „select” obligatoriu, cu o valoare daca ca expresie XPath; este un element gol; copiaza si nodurile descendente nodurilor care se potrivesc sablonului dat (deep copy). • Exemplu: copiaza in arborele rezultat toate nodurile „Stocuri”, plus continutul lor <xsl:copy-of select="//Stocuri"/> • Este util mai ales in transformarea unui document XML in alt document XML, unde se poate copia complet un subarbore.
C06 - DS • <xsl:element> - cauzeaza crearea unui nod element in rezultat; poate avea trei atribute: „name” – obligatoriu (valoarea este un „attribute value template”); „namespace” si „use-attribute-sets” sunt optionale. • Pentru a adauga atribute pentru acest nou alement poate fi folosit atributul „use-attribute-sets”, sau elemente <xsl:attribute>, elemente <xsl:copy>, sau element <xsl:copy-of>. • Exemplu: transformare din XML sursa in XML rezultat; se ia fiecare nod atribut al elementului „Carte” si creeaza un element corespunzator in rezultat. <Cartetitlu="XPath si XSLT" autor="Ionel" editura="Studia"/> • ... foloseste:
C06 - DS <?xml version='1.0'?><xsl:stylesheet version="1.0" xmlns:xsl="..."> <xsl:template match="/"> <Carte> <xsl:for-each select="Carte/@*"> <xsl:element name="{name()}"> <xsl:value-of select="."/> </xsl:element> </xsl:for-each> </Carte> </xsl:template> </xsl:stylesheet> • ... are ca rezultat: <?xml version="1.0" encoding="utf-8" ?> <Carte> <titlu>XPath si XSLT</titlu> <autor>Ionel</autor> <editura>Studia</editura> </Carte>
C06 - DS • <xsl:for-each> • aplica aceeasi procesare pe fiecare nod dintr-un set de noduri, definit de o expresie XPath in atributul „select”; are un singur atribut „select”, obligatoriu. • Continutul este un template body, in care unul sau mai multe elemente <xsl:sort> sunt optionale, urmate de o alta parte a template body. • <xsl:sort> se foloseste daca expresia XPath nu intoarce nodurile care sa fie procesate in ordinea dorita; <xsl:sort> poate fi folosit ca element fiu imediat al elementului <xsl:for-each>.
C06 - DS • <xsl:for-each> • Exemplu: ordonarea cartilor dupa primul autor, crescator <?xml version='1.0'?> <carti> <carte titlu="AC" autor1="Al. Vancea" autor2="A. Gog" editura="Risoprint"/> <carte titlu="BD" autor1="L. Tambulea" autor2="A. Campan" editura="Studia"/> <carte titlu="SO" autor1="F. Boian" editura="StudioGraph"/> <carte titlu="Retele" autor1="D. Bufnea" editura="Studia"/> </carti>
C06 - DS <?xml version='1.0'?><xsl:stylesheet version="1.0" xmlns:xsl="..."> <xsl:template match="/"> <carti> <xsl:for-each select="/carti/carte"> <xsl:sort select="@autor1" order="ascending" data-type="text"/> <xsl:copy-of select="." /> </xsl:for-each> </carti> </xsl:template> </xsl:stylesheet> => <?xml version='1.0'?> <carti> <carte titlu="AC" autor1="Al. Vancea" autor2="A. Gog" editura="Risoprint"/> <carte titlu="Retele" autor1="D. Bufnea" editura="Studia"/> <carte titlu="SO" autor1="F. Boian" editura="StudioGraph"/> <carte titlu="BD" autor1="L. Tambulea" autor2="A. Campan" editura="Studia"/> </carti>
C06 - DS • <xsl:if> - un template se instanteaza numai daca se indeplineste o anumita conditie; primeste un atribut „test”, obligatoriu. • Exemplu: afisarea informatiei non-confidentiale <?xml version='1.0'?> <bazaDeDate> <Informatietip="Public">Info publica 1.</Informatie> <Informatietip="Public">Info publica 2.</Informatie> <Informatietip="Confidential">Info confidentiala 1.</Informatie> <Informatietip="Confidential">Info confidentiala 2.</Informatie> </bazaDeDate>
C06 - DS <?xml version='1.0'?><xsl:stylesheet version="1.0" xmlns:xsl="..."> <xsl:template match="/"> <html> <head> <title>Informatii cu caracter public.</title> </head> <body> <h3>Informatii disponibile:</h3> <xsl:apply-templates select="/bazaDeDate/Informatie"/> </body> </html> </xsl:template> <xsl:template match="Informatie"> <xsl:if test="@tip='Public'"> <p><xsl:value-of select="."/></p> </xsl:if> </xsl:template> </xsl:stylesheet>
C06 - DS • <xsl:otherwise> - in <xsl:choose> • <xsl:sort> - sortare, in elemente <xsl:apply-templates> sau <xsl:for-each>; poate sa aiba 5 atribute optionale: „select” – cheia de sortare (implicit, este valoarea string a nodului de context; „order” = ascending / descending; „data-type” – daca valorile sa fie tratate ca string sau numar (atunci cand e cazul) = text / number s.a. • <xsl:text> - scrie un text in rezultat; poate avea un atribut „disable-output-escaping” = yes / no – daca continutul elementului sa fie scris in rezultat fara escaping ale caracterelor speciale, sau nu. Spatiile din elementul <xsl:text> sunt pastrate (depinde si de cum este setat un nod parinte in acest sens). • <xsl:value-of> - scrie in rezultat valoarea string a expresiei continute in atributul „select” (obligatoriu). • <xsl:when> - folosit in <xsl:choose>
C06 - DS • <xsl:with-param> - seteaza valoarea parametrilor cand se folosesc <xsl:apply-templates> sau <xsl:call-templates>; are un parametru „name” obligatoriu care reprezinta numele parametrului; daca are atrobut „select”, acesta contine evaluarea parametrului, si atunci elementul este gol; daca nu are atributul „select”, atunci valoarea parametrului este data de continutul elementului. • Attribute value template – ofera posibilitatea de a determina in timpul executiei”” (procesarii) valoarea unui atribut. Sintaxa: expresie XPath intre acolade. • Exemplu: atributX="{$variabilaX}" atributX="{/carte/capitol [position()=1]/paragraf[last()]/notaSubsol}" • O alta posibilitate – folosirea elementelor <xsl:attribute>.
C06 - DS <xsl:template match="facultate"> <f at_fac="{$var1}"> <xsl:apply-templates select="sectii"/> <xsl:apply-templates select="discipline"> <xsl:sort select="CodD" order="descending"/> </xsl:apply-templates> <xsl:apply-templates select="studenti"/> </f> </xsl:template> <xsl:template match="discipline"> <xsl:call-template name="tdisc"> <xsl:with-param name="numar" select="position()"></xsl:with-param> </xsl:call-template> </xsl:template> <xsl:template name="tdisc"> <xsl:param name="numar"></xsl:param> [Numar...] <xsl:value-of select="$numar"/> [CodD...] <xsl:value-of select="CodD"/> [DenD...] <xsl:value-of select="DenumireD"/> [Count...] <xsl:value-of select="count(.//Sectie)"/> </xsl:template>
C06 - DS • Next 07 • XQuery