XSLT

XSLT ( e X tensible Stylesheet Language Transformations ) este un limbaj pentru transformarea documentelor XML . Specificația XSLT face parte din XSL și este o recomandare W3C .

Aplicarea unei foi de stil XSLT , constând dintr-un set de șabloane , la un document XML ( arborele sursă ) produce un arbore rezultat care poate fi serializat ca document XML, document XHTML (numai XSLT 2.0), document HTML sau fișier text simplu . Regulile pentru selectarea (și, în parte, transformarea) datelor din arborele sursă sunt scrise în limbajul de interogare XPath .

XSLT are multe utilizări diferite, în principal în domeniile programării web și raportării. Una dintre sarcinile rezolvate de limbajul XSLT este separarea datelor de prezentarea lor, ca parte a paradigmei generale MVC ( Model-view-controller ) .  O altă sarcină comună este convertirea documentelor XML dintr-o schemă XML în alta.

Istorie

XSLT a fost dezvoltat de grupul de lucru XSL al World Wide Web Consortium .

Versiunea 1.0 a fost aprobată ca recomandare pe 16 noiembrie 1999 . După lansarea primei versiuni, au început lucrările la versiunea 1.1, dar în 2001 a fost întreruptă și grupul de lucru XSL s-a alăturat grupului de lucru XQuery pentru a colabora la XPath 2.0 . Ulterior, XPath 2.0 a servit drept bază pentru dezvoltarea versiunii XSLT 2.0.

Versiunea 2.0 a fost aprobată ca recomandare pe 24 ianuarie 2007 .

Versiunea 3.0 a fost aprobată pe 8 iunie 2017.

Procesul de realizare a unei transformări XSLT

În procesul de realizare a transformărilor XSLT sunt implicate următoarele:

În cel mai simplu caz, un procesor XSLT preia două documente ca intrare, un document XML de intrare și o foaie de stil XSLT și creează un document de ieșire pe baza acestora.

XSLT și XPath

XSLT folosește limbajul XPath pentru a accesa părți individuale ale unui document XML de intrare și pentru a organiza calculele.

XSLT 1.0 utilizează XPath 1.0, iar XSLT 2.0 utilizează XPath 2.0.

Exemple

Transformare din XML în XSLT

Document XML sursă :

<?xml version="1.0"?> <persons> <person username= "MP123456" > <name> Ivan </name> <surname> Ivanov </surname> </person> <person username= "PK123456" > < nume> Petru </name> <surname> Petrov </surname> </persoană> </persoane>

Foaie de stil XSLT (transformări):

<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" version= "1.0" > <xsl:output method= "xml" indent= "da" /> <xsl:template match= "persons" > <transform> <xsl:apply-templates/> </transform> </xsl:template> <xsl:template match= "person" > <record> <xsl:apply-templates select= "@*|*" /> </record> </xsl:template> <xsl:template match= "@username" > <username> <xsl:value-of select= "." /> </username> </xsl:template> <xsl:template match= "name" > <fullname> <xsl:apply-templates/> <xsl:apply-templates select= "following-sibling::surname" mode= "fullname" /> </fullname> </ xsl:template> <xsl:template match= "nume" /> <xsl:template match= "surname" mode= "fullname" > <xsl:text> </xsl:text> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>

Document XML rezultat:

<?xml version="1.0" encoding="UTF-8"?> <transform> <record> <username> MP123456 </username> <fullname> Ivan Ivanov </fullname> </record> <record> <username> PK123456 </username> <fullname> Petr Petrov </fullname> </record> </transform>

Transformarea de la XML la XHTML

Document XML de intrare:

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="my-style.xsl"?> <domenii> <sun.com ownedBy= "Sun Microsystems Inc." > <gazdă> www <utilizare> site-ul World Wide Web </utilizare> </gazdă> <gazdă> java <use> Informații Java </use> </host> </sun.com> <w3.org ownedBy= „Consorțiul World Wide Web” > <gazdă> www <utilizare> site-ul World Wide Web </utilizare> </gazdă> <gazdă> validator <use> dezvoltatori web care doresc să o facă corect </use> </host> </w3.org> </domains>

Stil pentru transformarea XSLT:

<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" xmlns= "http://www.w3.org/1999/xhtml" > <xsl :output method= "xml" indent= "yes" doctype-public= "-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system= "http://www.w3.org/TR/xhtml1/ DTD/xhtml1-strict.dtd" /> <!--XHTML document outline--> <xsl:template match= "/" > <html xmlns= "http://www.w3.org/1999/xhtml" xml:lang= "ro" lang= "ro " > <head> <meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" /> <title> test1 </title> <style type= "text/css" > h1 { umplutură: 10px; lățime umplutură: 100% culoare de fundal: argintiu } td, th { lățime: 40%; chenar: 1px argint masiv; umplutură: 10px td:primul copil, th:primul copil { lățime: 20% } tabel {lățime: 650px} </style> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <!--Anteturi de tabel și schiță--> <xsl:template match= "domains/*" > <h1><xsl:value-of select= "@ownedBy" /></h1> <p> Următoarea gazdă numele sunt utilizate în prezent la <strong><xsl:value-of select= "local-name(.)" /></strong> </p> <table> <tr><th> Host name </th> <th> Adresa URL </th><th> Folosită de </th></tr> <xsl:apply-templates/> </table> </xsl:template> <!--Rând tabel și primele două coloane--> <xsl:template match= "gazdă" > <!--Creați variabilă pentru „url”, deoarece este folosită de două ori--> <xsl:variable name= „url” select= "normalize-space(concat('http://', ​​​​normalize-space(node()), '.', local-name(..)))" /> <tr> <td>< xsl: value-of select= "node()" /></td> <td><a href= "{$url}" ><xsl:value-of select= "$url" /></a> </ td> <xsl:apply-templates select= "use" /> </tr> </xsl:template> <!--Coloana „Utilizat de”--> <xsl:template match= "use" > <td><xsl:value-of select= "." /></td> </xsl:template> </xsl:stylesheet>

XHTML-ul pe care îl obținem ca rezultat (au fost adăugate spații pentru claritate):

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns= "http://www.w3.org/1999/xhtml" lang= "ro" xml:lang= "ro" > <head> <meta content= "text/html;charset=UTF-8" http-equiv= "Content-Type" /> <title> test1 </title> <style type= "text/css" > h1 { umplutură: 10px; lățime umplutură: 100% culoare de fundal: argintiu } td, th { lățime: 40%; chenar: 1px argint masiv; umplutură: 10px td:primul copil, th:primul copil { lățime: 20% } tabel {lățime: 650px} </style> </head> <body> <h1> Sun Microsystems Inc. </h1> <p> Următoarele nume de gazdă sunt în prezent utilizate la <strong> sun.com </strong></p> <table> <tr> <th> Nume gazdă </th> <th> URL < /th> <th> Folosit de </th> </tr> <tr> <td> www </td> <td><a href="http://www.sun.com" > http :// www.sun.com </a></td> <td> Site-ul World Wide Web </td> </tr> <tr> <td> java </td> <td><a href= "http:/ /java.sun.com" > http://java.sun.com </a></td> <td> Informații Java </td> </tr> </table> <h1> Consorțiul World Wide Web </h1> <p> Următoarele nume de gazdă sunt în prezent utilizate la <strong> w3.org </strong></p> <table> <tr> <th> Nume de gazdă < /th> <th> URL </th> <th> Folosit de </th> </tr> <tr> <td> www </td> <td><a href= "http://www.w3 .org" > http://www.w3.org </a></td> <td> Site World Wide Web </td> </tr> <tr> <td> validator </td> <td> <a href="http://validator.w3.org" > http://validator.w3.org </a> </td> <td> dezvoltatori web care doresc să o rezolve corect </td> </ tr> </table> </body> </html>

Ieșirea nu este neapărat XHTML corectă. XSLT 2.0 a remediat acest lucru prin adăugarea metodei de ieșire „XHTML”, împreună cu „HTML” care exista deja în XSLT 1.0.

Aplicarea regulilor șablon

Limbajul XSLT este declarativ, nu procedural. În loc să definească o secvență de instrucțiuni executabile, acest limbaj definește regulile care vor fi aplicate în timpul conversiei. Transformarea în sine este efectuată conform unui algoritm fix.

În primul rând, procesorul XSLT analizează fișierul de transformare și construiește un arbore XML al fișierului de intrare. Apoi caută șablonul care se potrivește cel mai bine cu nodul rădăcină și evaluează conținutul șablonului găsit. Instrucțiunile din fiecare șablon pot fie să spună direct procesorului XSLT „creați această etichetă aici”, fie să spună „procesați alte noduri în același mod ca nodul rădăcină”.

Acest algoritm, care este oarecum netrivial, este descris mai detaliat mai jos, deși multe dintre detaliile sale exotice sunt omise.

Fiecare procesor XSLT trebuie să parcurgă următorii pași pentru a se pregăti pentru transformare.

  1. Citiți o foaie de stil XSLT cu un parser XML și traduceți conținutul acesteia într-un arbore de noduri ( arborele foii de stil ) conform modelului de date XPath. Erorile de sintaxă „timpul de compilare” sunt detectate în această etapă. Foile de stil pot fi modulare, astfel încât toate incluziunile (instrucțiuni xsl:include, xsl:import) vor fi, de asemenea, procesate în această etapă pentru a combina toate regulile șablonului și alte elemente din alte foi de stil într-un singur arbore de foi de stil.
  2. Citiți datele XML de intrare folosind un parser XML, traduceți conținutul acestora într-un arbore de noduri ( arborele sursă ), conform modelului de date XPath. Un document XML poate face referire la alte surse XML folosind apeluri de funcții document(). Aceste apeluri sunt de obicei gestionate în timpul execuției, deoarece locația lor poate fi calculată și apelurile de funcții corespunzătoare pot să nu apară deloc. (Exemplul de mai sus nu face legătura cu alte documente.)
  3. Eliminați nodurile goale din foaia de stil XSLT, cu excepția celor care sunt copii ale xsl:text. Acest lucru elimină aspectul spațiilor „în plus”.
  4. Eliminați nodurile de text goale din arborele sursă dacă instrucțiunile xsl:strip-spacesunt prezente în documentul sursă. Acest lucru elimină aspectul spațiilor „în plus”. (Exemplul de mai sus nu folosește această caracteristică.)
  5. Populați arborele XSLT cu trei reguli care oferă un comportament implicit pentru orice tip de noduri care pot fi întâlnite în timpul procesării. Prima regulă este de a gestiona nodul rădăcină ; instruiește procesorul să proceseze fiecare copil al nodului rădăcină. A doua regulă este pentru orice noduri de text sau noduri de atribute ; instruiește procesorul să facă o copie a nodului respectiv în arborele rezultat. A treia regulă este pentru toate nodurile de comentarii și nodurile de instrucțiuni de procesare ; nu se efectuează nicio operațiune. Șabloanele definite în mod explicit în XSLT pot suprascrie unele sau toate șabloanele de reguli implicite. Dacă șablonul nu conține reguli explicite, regulile încorporate vor fi aplicate pentru a parcurge arborele sursă în mod recursiv și numai nodurile text vor fi copiate în arborele rezultat (nodurile de atribute nu vor fi atinse deoarece nu sunt „copii” ale părintelui lor. noduri). Rezultatul obținut în acest fel este de obicei nedorit, deoarece este pur și simplu o concatenare a tuturor fragmentelor de text din documentul XML original.

Procesorul parcurge apoi următorii pași pentru a obține și a serializa arborele rezultat.

  1. Creează nodul rădăcină al arborelui rezultat.
  2. Procesează nodul rădăcină al arborelui sursă. Procedura de procesare a nodurilor este descrisă mai jos.
  3. Serializează arborele rezultat, dacă este necesar, conform indicațiilor descrise de xsl:output.

La procesarea unui nod, sunt efectuate următoarele acțiuni.

  1. Se caută cel mai potrivit șablon de regulă. Acest lucru se realizează prin verificarea modelului (care este o expresie XPath) pentru fiecare regulă, indicând nodurile pe care poate fi aplicată regula. Fiecărui model i se atribuie o prioritate și o prioritate relativă de către procesor pentru a facilita rezolvarea conflictelor. Ordinea regulilor șablonului într-o foaie de stil poate ajuta, de asemenea, la rezolvarea conflictelor dintre șabloanele care se potrivesc cu aceleași noduri, dar nu afectează ordinea în care sunt procesate nodurile.
  2. Conținutul regulilor șablonului este instanțiat. Elementele din spațiul de nume XSLT (prefixate de obicei cu xsl:) sunt tratate ca instrucțiuni și au o semantică specială care indică modul în care ar trebui interpretate. Unele sunt pentru adăugarea de noduri la arborele rezultat, altele sunt constructe de control. Elementele non-XSLT și nodurile de text găsite în regulă sunt copiate „verbatim” în arborele rezultat. Comentariile și instrucțiunile de control sunt ignorate.

Instrucțiunea xsl:apply-templates, atunci când este procesată, face ca un nou set de noduri să fie preluat și procesat. Nodurile sunt identificate folosind o expresie XPath. Toate nodurile sunt procesate în ordinea în care sunt conținute în documentul sursă.

XSLT extinde biblioteca de funcții XPath și vă permite să definiți variabile XPath. Aceste variabile au un domeniu de aplicare diferit în foaia de stil, în funcție de locul în care sunt definite, iar valorile lor pot fi setate în afara foii de stil. Valorile variabilelor nu pot fi modificate în timpul procesării.

Deși această procedură poate părea complicată, face ca caracteristicile XSLT să fie similare cu alte limbi de șabloane web. Dacă foaia de stil constă dintr-o singură regulă pentru a procesa nodul rădăcină, întregul conținut al șablonului este pur și simplu copiat în rezultat, iar instrucțiunile XSLT ( xsl:…elementele ' ') sunt înlocuite cu conținutul calculat. XSLT oferă chiar și un format special („element de rezultat literal ca foaie de stil”) pentru astfel de transformări simple, cu un singur șablon. Cu toate acestea, capacitatea de a defini șabloane și reguli individuale crește foarte mult flexibilitatea și eficiența XSLT, mai ales atunci când se generează un rezultat care seamănă foarte mult cu documentul original.

Vezi și

Literatură

  • Tidwell D. XSLT. Ediția a 2-a = XSLT, ediția a 2-a. - Sankt Petersburg. : Symbol-Plus , 2009. - 960 p. - 1200 de exemplare.  - ISBN 978-5-93286-150-9 .
  • Mangano S. XSLT. Carte de bucate = Carte de bucate XSLT: Soluții și exemple pentru dezvoltatorii XML și XSLT, ediția a 2-a. - Sankt Petersburg. : BHV , 2008. - 864 p. - ISBN 978-5-9775-0292-4 .
  • Kay M. XSLT. Manualul programatorului. Ediția a 2-a = XSLT, Referința programatorului, Ediția a 2-a. - Sankt Petersburg. : Symbol-Plus , 2002. - 1016 p. - 2000 de exemplare.  — ISBN 5-93286-039-1 .
  • Holzner S. XSLT. Biblioteca programatorului. Ediția a 2-a = În interiorul XSLT. - Sankt Petersburg. : Peter , 2002. - 544 p. - 3 exemplare.  - ISBN 5-94723-271-5 .

Link -uri