Transformarea unui document XML folosind XSLT. Cum arată XML într-un browser? Limbajul de transformare XSLT

Conversia formatului de date XML utilizând Extensible Stylesheet Language Transformations (XSLT)

Înainte de a începe lucrul

Acest tutorial este conceput pentru dezvoltatorii care doresc să folosească XSLT pentru a transforma datele XML în alte forme fără a fi nevoie să programeze în Java™ sau în alte limbi.

Acest tutorial presupune că sunteți familiarizat cu XML, dar autorul nu intră în niciuna dintre complexitățile arcane ale limbajului, așa că o înțelegere de bază este suficientă. Cu excepția unei mici secțiuni despre extensii, nu trebuie să aveți în spate niciun limbaj de programare special. Și chiar și în această secțiune, ideile sunt foarte simple și aplicabile oricărui limbaj de programare care este suportat de procesor.

Despre ce este acest ghid?

Acest tutorial este despre transformările XSLT (Extensible Style Sheet Language). XSLT este una dintre specificațiile de bază asociate cu XML, permițând ca datele XML să fie traduse cu ușurință dintr-o formă în alta.

În acest ghid veți învăța:

  • Bazele XSLT
  • Folosind șabloane simple
  • Publicarea datelor
  • Managementul spațiului
  • Bazele XPath
  • Funcții XPath
  • Bucle și instrucțiuni condiționale
  • Importarea și includerea altor foi de stil
  • extensia XSLT
  • Variabile XSLT

Începutul lucrărilor

Imaginați-vă pentru un moment că aveți un set de date în XML. Este posibil să fi ales să le stocați în acest fel datorită flexibilității XML. Știți că le veți putea folosi pe mai multe platforme și cu aproape orice limbaj de programare. Dar uneori va trebui să schimbați forma XML-ului dvs. De exemplu, poate fi necesar să traduceți datele într-un format XML diferit pentru a le stoca într-un sistem diferit, sau într-o formă diferită pentru prezentare sau altceva.

De exemplu, este posibil să aveți date în XML pe care doriți să le publicați pe web, ceea ce înseamnă să le traduceți în HTML. Desigur, puteți vizualiza manual documentul și puteți face în el modificările necesare, sau poate v-ați gândit să încărcați XML-ul în DOM și apoi să creați manual documentul de ieșire.

Ce este XSLT?

Extensible Style Sheet Language Transformations (XSLT) oferă o modalitate de a traducere automată Date XML de la un formular la altul. Formularul țintă este de obicei un alt document XML, dar nu trebuie să fie; puteți transforma XML în aproape orice prin simpla creare a unei foi de stil XSLT și manipularea datelor. Dacă doriți să modificați rezultatele, pur și simplu schimbați foaia de stil și reprocesați XML-ul. Există beneficiu suplimentar, care dă putere non-programatorilor, cum ar fi designerii, să modifice foaia de stil și să influențeze rezultatele.

Să vedem un exemplu.

Sarcină

În acest tutorial, vom lua un document XML și îl vom transforma într-un document XHTML care poate fi afișat ca pagină Web. Intrarea este pur și simplu un fișier de rețetă (vezi Lista 1).

Lista 1. Date de bază
Gush, Doamne 1livră hamburger 1livră cot macaroane 2cupe zahar brun 1sac ceapa tocata 1linguriţă mărar uscat Rumeniți hamburgerul. Adăugați ceapa și gătiți până devine transparent. Adăugați zahăr brun și mărar. Gatiti si scurgeti pastele. Combinați carnea și pastele. Un mic dejun echilibrat 1ceașcă cereale 1sticlă suc de portocale 1ceașcă lapte 2felii paine prajita Combinați cerealele și laptele într-un castron. Adăugați toate ingredientele pe masă.

Nota editorului: Aceste rețete sunt date pur și simplu ca exemplu, așa cum le imaginează autorul. Rețeta potrivită pentru Gush'gosh (primit de la soția sa, care pregătește acest fel de mâncare) constă din 1 liră (0,454 kg) carne tocată de vită, 1 liră coarne, 1/2 cană zahăr galben, 1 pachet mic (aproximativ 300 grame) ceapă tocată mărunt, 1 lingurita de marar uscat si 1 conserva mica de pasta de rosii, la care se adauga zahar galben.

Desigur, acesta este un exemplu foarte simplu, astfel încât să nu vă blocați în detaliile datelor în sine, dar puteți reprezenta orice, de la un proces de înregistrare până la finanțe ca date XML.

Scopul nostru este de a converti aceste date într-o pagină XHTML care va afișa rețetele individual și va forma ingredientele și instrucțiunile de gătit (vezi Lista 2).

Listarea 2. Rezultat
Reţetă

Gush, Doamne

Ingrediente:

Hamburger de 1 kilogram
1 kilogram de macaroane cot
2 căni de zahăr brun
1 sac ceapa tocata
1 lingurita marar uscat

Directii:

  1. Rumeniți hamburgerul.
  2. Adăugați zahăr brun și mărar.
  3. Gatiti si scurgeti pastele.
  4. Combinați carnea și pastele.

Un mic dejun echilibrat

Ingrediente:

1 cană de cereale
1 pahar suc de portocale
1 cană lapte
2 felii de pâine prăjită

Directii:

  1. Adăugați toate ingredientele pe masă.

Puteți afișa acest rezultat în browser, așa cum se arată în Figura 1.

Figura 1. Rezultatul afișat în browser

După cum am menționat, scopul final ar putea fi orice format, nu doar XHTML și nici măcar XML.

Să începem cu transformări simple.

Foaie de stil simplă

Cea mai simplă foaie de stil este pur și simplu un document XML care include rezultate XSLT (vezi Lista 3).

Lista 3. Cea mai simplă foaie de stil
Reţetă

Ingrediente:

Directii:

Observați utilizarea spațiului de nume xsl. Adăugarea acestui spațiu de nume îi spune procesorului ce elemente sunt asociate cu procesarea și care ar trebui pur și simplu să fie scoase. Elementele de valoare îi spun procesorului să introducă date specifice în acea locație. Ce date de inserat sunt determinate de conținutul atributului select.

Atributul select constă dintr-o expresie XPath. XPath va fi discutat mai detaliat în secțiune, dar aici puteți vedea că titlul, ingredientele și elementele de instrucțiuni de gătit sunt accesate prin ierarhia documentelor. Începem de la elementul rădăcină, /rețete, și ne coborăm de acolo.

Cum se convertesc

Cel mai simplu mod de a efectua transformarea XML este să adăugați un indiciu de foaie de stil la XML și să îl afișați în browser (vezi Lista 4).

Listarea 4. Adăugarea la instrucțiuni XML privind procesarea folosind o foaie de stil
Gush, Doamne ...

Această instrucțiune de procesare îi spune browserului să preia foaia de stil aflată în basicstylesheet.xsl și să o folosească pentru a transforma datele XML și a scoate rezultatele. Dacă deschideți documentul nostru XML în browser Microsoft® Internet Explorer®, veți vedea un rezultat similar cu Figura 2.

Figura 2. Extragerea foii de stil și transformarea datelor XML

Cu toate acestea, nu este exact ceea ce ne-am dorit. Dacă selectați Vizualizare>Vizualizare cod HTML în browser, veți vedea XML-ul original. Pentru a vedea rezultatul conversiei, trebuie să efectuați conversia și să creați un fișier de ieșire. Acest lucru se poate face prin linia de comandă folosind codul Java cu următoarea comandă(vezi Lista 5):

Lista 5. Convertirea unui document prin linia de comandă
java org.apache.xalan.xslt.Process -IN recipes.xml -XSL basicstylesheet.xsl -out result.html

Dacă primiți o ClassNotFoundException , poate fi necesar să descărcați Apache Xalan (consultați „Obține produse și tehnologii” în secțiune) și să adăugați fișierele JAR pe care le include la classpath.

După efectuarea transformării prezentate în Lista 5, veți vedea că fișierul result.html conține următorul cod (vezi Lista 6).

Lista 6. Rezultate
Reţetă

Gush, Doamne

Ingrediente:

1 poundhamburger 1 pouundelbow macaroane 2 cani de zahăr brun 1 pungă ceapă tocată 1 linguriță mărar uscat

Directii:

Rumeniți hamburgerul. Adăugați ceapa și gătiți până devine transparent. Adăugați zahăr brun și mărar. Gatiti si scurgeti pastele. Combinați carnea și pastele.

Am adăugat ceva spațiere pentru ușurința citirii, dar sunt câteva lucruri de remarcat aici. În primul rând, afișează doar informații pentru o rețetă. În al doilea rând, ingredientele sunt pietruite împreună fără goluri. Nici acesta nu este rezultatul pe care am vrut să-l obținem. Din fericire, puteți crea șabloane mai precise pentru a vă afișa datele exact așa cum doriți.

Adăugarea de șabloane

O transformare nu este de nici un folos dacă nu aduce datele exact în forma de care avem nevoie. Pentru a face acest lucru, trebuie să puteți utiliza șabloane, ceea ce îi este dedicată această secțiune.

Crearea de șabloane

Majoritatea foilor de stil nu au forma simplă pe care tocmai ați văzut-o în secțiunea anterioară. În schimb, acestea sunt împărțite într-un grup de modele, fiecare dintre ele se aplică unui anumit tip de date. Să traducem foaia noastră de stil în acest formular (vezi Lista 7).

Lista 7. Foaie de stil reproiectată
Reţetă

Ingrediente:

Directii:

Informațiile de aici sunt neschimbate, cu excepția faptului că procesorul se uită la foaia de stil și începe cu modelul care se potrivește cu elementul rădăcină al documentului, așa cum este specificat de atributul potrivire. Apoi scoate acest șablon, inclusiv toate valorile, la fel ca înainte. Dacă efectuați conversia acum, ar trebui să vedeți exact aceleași rezultate ca în .

Dar nu asta ne dorim. Vrem să putem formata ingredientele și instrucțiunile. Pentru a face acest lucru, putem crea șabloane separate pentru fiecare dintre aceste elemente și le putem include în foaia de stil (vezi Lista 8).

Lista 8. Crearea de șabloane suplimentare
Reţetă

Ingrediente:

Directii:

INGREDIENTE AICI

INSTRUCȚIUNI AICI

Observați că, în loc să redăm pur și simplu elementul value-of, acum îi spunem foii de stil să aplice șabloane adecvate elementelor ingrediente și instrucțiuni. Apoi am creat șabloane separate pentru aceste elemente, setându-le în atributul potrivire. Odată ce ajunge la elementul apply-templates, procesorul selectează toate elementele ingrediente din document. Apoi caută un model pentru ingrediente și, când găsește unul, emite acel model. Face același lucru cu elementul instrucțiuni. Rezultatul ar trebui să fie similar cu cel prezentat în Figura 3.

Figura 3. Aplicarea șabloanelor adecvate elementelor ingrediente și instrucțiuni

Bine, asta e puțin mai aproape, cel puțin e clar că sunt două rețete, dar probabil că nu vrei să combini ingredientele și instrucțiunile pentru toate rețetele. Din fericire, această problemă poate fi rezolvată cea mai buna organizareșabloane

Publicarea șabloanelor

Pentru a vă organiza mai bine datele, să aruncăm o privire la modul în care separăm și publicăm șabloanele. XSLT vă permite să procesați informații într-o manieră iterativă. De exemplu, puteți împărți informațiile în rețete individuale și apoi puteți formata instrucțiunile și ingredientele (vezi Lista 9).

Lista 9. Evidențierea rețetelor
Reţetă

Ingrediente:

Directii:

INGREDIENTE AICI

INSTRUCȚIUNI AICI

ÎN în acest caz, Foaia de stil redă pagina principală (HTML) și apoi parcurge fiecare rețetă, afișând numele, ingredientele și instrucțiunile pentru fiecare rețetă. Din nou, vom studia XPath în secțiune, dar în acest caz elementul rețetă devine un nod de context, astfel încât atributele selectate se referă la acest nod în același mod în care fișierele se referă la un director specific din sistemul de fișiere. Rezultatul ar trebui să fie similar cu figura 4.

Figura 4. Elementul de rețetă devine un nod de context

Grozav, formatul este aproape de ceea ce ne dorim, dar tot trebuie să afișăm informațiile reale. Pentru a face acest lucru, trebuie să schimbați ingredientele și șabloanele de instrucțiuni (vezi Lista 10).

Lista 10. Lucrul la ingrediente și șabloane de instrucțiuni
...

Ingrediente:

Directii:


  • Un punct important atunci când publicați șabloane: i-ați spus procesorului să aplice șabloane adecvate elementului ingrediente, dar nu avem un șablon specific pentru acel element. Dacă aplicați un șablon unui element, dar nu există un șablon în sine, datele pur și simplu nu vor apărea. Dar acesta nu este cazul nostru.

    În schimb, profităm de faptul că atunci când îi spunem procesorului să aplice modele adecvate elementului ingrediente, acesta caută nu numai elementul ingrediente, ci și elementele copil ale elementului ingrediente. Așadar, găsește un șablon pentru ingrediente în care afișați cantitatea, unitățile, numele produsului și ruptura de linie.

    Am făcut același lucru pentru instrucțiuni când le-am formatat ca elemente de listă. Observați că am creat o listă ordonată reală în șablonul principal pentru rețetă și apoi am trimis articolele pentru procesare individuală.

    Rezultatul ar trebui să fie similar cu figura 5.

    Figura 5: Crearea unei liste ordonate în șablonul principal de rețetă

    Formatul se apropie cu siguranță de ceea ce ne-am dorit. Cu toate acestea, dacă vă uitați la rezultat, veți vedea că problema spațiilor albe încă există (vezi Lista 11).

    Lista 11. Ieșire neterminată
    Reţetă

    Gush, Doamne

    Ingrediente:

    1 poundhamburger
    Macaroane cu arc de 1 kilogram
    2 cani de zahar brun
    1 pungă ceapă tocată
    1 lingurita marar uscat

    Directii:

    1. Rumeniți hamburgerul.
    2. Adăugați ceapa și gătiți până devine transparent.
    3. ...

      Adăugarea de spații

      De ce s-a întâmplat asta dacă am inclus spații în foaia de stil? Ar fi trebuit să apară în ieșire? Desigur, nu este necesar. Există modalități de a spune unei foi de stil să lase spațiu alb - le vom analiza în secțiunea Looping and Importing - dar în unele cazuri este mai ușor să adăugați text în mod explicit la rezultat (vezi Lista 12).

      Lista 12. Adăugarea de text
      ...
      ...

      Astfel, ne-am ocupat de spațiile lipsă. În același mod, folosind elementul text, puteți adăuga orice text arbitrar la șablon. (Nu uitați, acesta este doar text, nu elemente de tip întrerupere de pagină.) Rezultatul va fi rezultatul dorit (vezi Lista 13).

      Lista 13. Rezultatul final
      Reţetă

      Gush, Doamne

      Ingrediente:

      Hamburger de 1 kilogram
      1 kilogram de macaroane cot
      2 căni de zahăr brun
      1 sac ceapa tocata
      1 lingurita marar uscat

      Directii:

      1. Rumeniți hamburgerul.
      2. Adăugați ceapa și gătiți până devine transparent.
      3. Adăugați zahăr brun și mărar.
      4. Gatiti si scurgeti pastele.
      5. Combinați carnea și pastele.

      Un mic dejun echilibrat

      Ingrediente:

      1 cană de cereale
      1 pahar suc de portocale
      1 cană lapte
      2 felii de pâine prăjită

      Directii:

      1. Combinați cerealele și laptele într-un castron.
      2. Adăugați toate ingredientele pe masă.

      Rezultatul este prezentat în Figura 6.

      Figura 6. Problema spațiilor lipsă rezolvată

      Bazele XPath

      Capacitatea de a transforma datele în forma în care doriți să fie acestea necesită o înțelegere a XML Route Language, sau XPath, care vă permite să controlați ce date sunt publicate și/sau afișate. Aceasta sectiune explică conceptele de bază XPath și arată cum să creați expresii simple.

      Ce este XPath?

      Poate ați observat că o parte importantă a modului în care funcționează o foaie de stil este capacitatea de a selecta o anumită parte a unui document. De exemplu, dacă doriți să afișați instrucțiuni, trebuie să știți cum să le faceți referire. În XSLT, ne referim la informații folosind expresii XPath.

      O expresie XPath poate selecta un singur nod sau un set de noduri sau poate returna o singură valoare bazată pe unul sau mai multe noduri din document. Până acum ne-am ocupat de expresii XPath foarte simple care selectează un nod sau noduri care coboară într-o structură ierarhică. XPath oferă mai multe moduri de a defini grupuri de noduri bazate pe relații, cum ar fi părinte-copil sau strămoș-copil. În acest tutorial, vom explora toate aceste relații, numite topoare.

      Veți afla, de asemenea, despre unele dintre caracteristicile mai puternice ale XPath și predicate sunt practic enunțuri condiționate care pot fi adăugate expresiilor. De exemplu, în secțiunea Setare context, veți vedea cum să selectați toate elementele rețetei dintr-un document; predicatele vă permit să selectați doar un anumit element pe baza unor criterii specifice.

      În cele din urmă, veți afla despre funcții și mai puternice care vă permit să utilizați multe dintre tipurile de logică care sunt utilizate în programele procedurale.

      Să începem prin a examina contextul expresiei.

      Stabilirea contextului

      Primul pas în înțelegerea XPath este să înțelegem că rezultatele obținute sunt în mare măsură determinate de nodul context actual. Un nod de context poate fi gândit ca un fel de semn „ești aici”, din care te poți deplasa în diferite direcții în funcție de expresia XPath. De exemplu, luați în considerare o masă simplă stiluri din Lista 14.

      Lista 14. Demonstrație de context

      Există un nou element aici - copy-of. Acolo unde value-of scoate conținutul unui element, copy-of face exact ceea ce spune numele său și scoate nodul real la care se referă atributul select.

      În acest caz, atributul select conține una dintre cele mai simple expresii XPath posibile. Un singur punct (.) este o referință la un anumit nod de context, ca într-un sistem de fișiere când doriți să faceți referire la „directorul curent, indiferent de care este directorul”. Deci, dacă faceți această conversie, veți obține un rezultat ca Lista 15.

      Lista 15. Cea mai simplă conversie
      Gush, Doamne 1livră hamburger 1livră cot macaroane 2cupe zahar brun 1sac ceapa tocata 1linguriţă mărar uscat Rumeniți hamburgerul. Adăugați ceapa și gătiți până devine transparent. Adăugați zahăr brun și mărar. Gatiti si scurgeti pastele. Combinați carnea și pastele. ...

      Vedeți că aceasta este pur și simplu o repetare a aceluiași document; acest lucru se datorează faptului că nodul context, așa cum este indicat de atributul șablon de potrivire, este rădăcina documentului sau /. Dacă schimbați nodul context, rezultatul se va schimba. De exemplu, puteți seta nodul context la prima rețetă (vezi Lista 16).

      Lista 16. Mutarea unui nod context

      Acum, când executați conversia, veți vedea diferența (consultați Lista 17).

      Lista 17. Rezultate
      Gush, Doamne 1livră hamburger 1livră cot macaroane 2cupe zahar brun 1sac ceapa tocata 1linguriţă mărar uscat Rumeniți hamburgerul. Adăugați ceapa și gătiți până devine transparent. Adăugați zahăr brun și mărar. Gatiti si scurgeti pastele. Combinați carnea și pastele. Un mic dejun echilibrat 1ceașcă cereale 1sticlă suc de portocale 1ceașcă lapte 2felii paine prajita Combinați cerealele și laptele într-un castron. Adăugați toate ingredientele pe masă.

      Din moment ce am mutat nodul context, ieșirea s-a schimbat. Acest lucru este important atunci când doriți să selectați un nod în raport cu un nod de context. De exemplu, puteți selecta doar titlul rețetei (vezi Lista 18).

      Lista 18. Selectând doar antetul

      Aici, selectați un element de nume la un nivel sub nodul context curent, astfel încât rezultatul va fi ca Lista 19.

      Listarea 19. Rezultate
      Gush, Doamne Un mic dejun echilibrat

      Vom explora mai târziu specificarea nodurilor după număr, dar deocamdată rețineți că putem muta nodul context în a doua rețetă (vezi Lista 20).

      Lista 20. Mutarea din nou a nodului context

      (Ignorați celălalt șablon, acesta este acolo pentru a preveni apariția altui text de rețetă.)

      Putem vedea că transformarea rezultată arată această schimbare în context (vezi Lista 21).

      Lista 21. Rezultate
      Un mic dejun echilibrat

      Pentru ce sunt topoarele?

      Acum că știm de unde începem, ar fi util să știm unde putem merge. Până acum am folosit expresii XPath foarte simple, similare cu ierarhia dintr-un sistem de fișiere, dar XPath oferă mult mai multe funcționalități. De exemplu, până acum ați selectat doar copii, dar puteți căuta și părinții unui anumit nod, precum și copiii sau strămoșii acestuia.

      Mai întâi, să vorbim despre sistemul de notație. Am folosit o formă simplificată, scurtată de a solicita descendenți. În „forma lungă” expresiile sunt date ca child::name în loc de ./name

      În ambele cazuri, specificați orice nod care este un copil al nodului context și este, de asemenea, un element de nume. De asemenea, le puteți lega împreună ca în cazul anterior, folosind /child::recipes/child::recipe în loc de /recipes/recipe .

      Urmasi

      S-ar putea să vă întrebați de ce vă deranjați cu forma lungă când forma scurtă este mult mai ușoară. Acest lucru nu ar fi necesar dacă singurul lucru pe care l-ați putea face ar fi să selectați descendenți. Cu toate acestea, această notație poate fi folosită și pentru a selecta alte relații. De exemplu, expresia XPath descendant::instruction selectează toate elementele de instrucțiune care sunt descendente ale nodului context, nu doar elementele copil. În plus, puteți combina instrucțiunile. De exemplu, puteți selecta toate instrucțiunile celei de-a doua rețete: /rețete/rețetă/descendant::instruction .

      O variație a axei copil este axa copil sau element în sine, care selectează un nod dat din toți copiii și caută, de asemenea, nodul context în sine. De exemplu, expresia descendant-or-self::instructions selectează toate nodurile de instrucțiuni din și sub nodul context. Abrevierea obișnuită pentru această axă este dublă oblică, //. Aceasta înseamnă că expresiile: /rețete/rețetă//instrucțiuni și //instrucțiuni selectează toate instrucțiunile pentru a doua rețetă și, respectiv, toate instrucțiunile din document. Acest al doilea exemplu este folosit pe scară largă și este util atunci când doriți doar să selectați toate elementele de un anumit tip dintr-un document.

      Atribute

      O altă sarcină comună pe care o veți întâlni este necesitatea de a selecta un atribut pentru un anumit element. De exemplu, este posibil să doriți să selectați un ID de rețetă pentru o anumită rețetă. Expresia /rețete/rețetă/atribut::rețetă selectează atributul recipeId pentru toate elementele rețetei. Această axă are și o formă prescurtată: aceeași expresie poate fi scrisă astfel: /recipes/recipe/@recipeId .

      Părinţi

      Tot ce am văzut înainte ne-a transportat jos de-a lungul arborelui ierarhic, dar este și posibil să mergeți sus prin selectarea strămoșului unui anumit nod. Să presupunem că nodul context a fost unul dintre instrucțiuni și doriți să afișați recipeId-ul rețetei curente. Puteți proceda astfel: ./parent::node()/parent::node()/@recipeId .

      Această expresie începe de la nodul de instrucțiune curent și apoi se mută la strămoșul nodului respectiv, elementul de instrucțiuni și apoi la strămoșul ACELUI element, rețeta și apoi la atributul corespunzător. S-ar putea să fiți mai familiarizați cu forma prescurtată: ./../../@recipeId .

      Acum să vedem cum sunt stabilite unele condiții.

      Funcții XPath mai avansate

      În cele mai multe cazuri, tehnicile deja discutate sunt suficiente. Cu toate acestea, există adesea situații care necesită o selectivitate mai mare. Această secțiune arată cum să utilizați predicate pentru a selecta nodurile pe baza unor criterii specifice și introduce unele dintre caracteristicile încorporate în XPath.

      Utilizarea predicatelor

      Adesea, ceea ce este necesar nu este orice nod, ci un anumit nod selectat pe baza unor condiții specifice. Ați mai văzut un exemplu în care ați folosit expresia /rețete/rețete//instrucțiuni. Aceasta este de fapt o versiune scurtă a /rețetelor/rețetei//instructions , ceea ce înseamnă că procesorul XPath trebuie să treacă prin fiecare element de rețetă (există doar un astfel de element, desigur) și pentru fiecare element de rețetă, să parcurgă fiecare element de rețetă. Pentru fiecare element de rețetă, verificați dacă expresia position() = 2 este adevărată. (Cu alte cuvinte, aceasta a doua rețetă este în listă?) Dacă această propoziție, numită predicat, este adevărată, atunci procesorul folosește acel nod și continuă, returnând orice instrucțiuni.

      Există multe lucruri pe care le poți face cu predicate. De exemplu, puteți returna numai rețete care au numele: /rețete/rețetă . Această expresie testează pur și simplu dacă există un element de nume care este un copil al elementului rețetă. De asemenea, puteți căuta anumite valori. De exemplu, puteți returna numai articole care sunt numite „Un mic dejun echilibrat”: //rețetă .

      Rețineți că predicatul spune pur și simplu procesorului dacă să returneze nodul curent, deci în acest caz este returnat elementul rețetă, nu numele. Alternativ, puteți spune procesorului să returneze numai numele primei rețete folosind oricare dintre aceste două expresii (vezi Lista 22).

      Lista 22. Se returnează doar numele primei rețete
      //rețetă[@recipeId="1"]/nume //nume]

      În prima expresie, selectăm mai întâi toate elementele rețetei și apoi returnăm numai pe cel care are atributul element recipeId egal cu 1. Odată ce găsim acel nod, trecem la nodul său copil, care se numește name, și îl returnăm. A doua expresie caută mai întâi toate elementele de nume, apoi îl selectează numai pe cel al cărui părinte are un atribut de 1. În orice caz, obțineți aceeași ieșire (vezi Lista 23).

      Lista 23. Ieșire
      Gush, Doamne

      Funcții

      XPath oferă, de asemenea, o serie de funcții. Unele dintre ele se ocupă de noduri în sine, cum ar fi cele care caută o anumită poziție, altele se ocupă de șiruri, altele, cum ar fi sumarea, cu numere, altele cu boolean.

      Funcții legate de nod

      Funcțiile legate de nod ajută, de exemplu, la selectarea unui anumit nod în funcție de poziția acestuia. De exemplu, puteți solicita în mod specific cea mai recentă rețetă: //rețetă. Această expresie selectează toate elementele rețetei și apoi returnează doar ultimul. De asemenea, puteți utiliza funcții separat în loc să le folosiți ca parte a unui predicat. De exemplu, puteți solicita în mod specific să numărați elementele unei rețete: count(//recipe) .

      Ați văzut deja funcția position() și cum funcționează. Alte funcții legate de nod includ id() , local-name() , namespace-uri() și name() .

      Funcții șiruri

      Cele mai multe funcții de șir sunt concepute pentru a procesa șiruri mai degrabă decât pentru a le testa, cu excepția funcției contains(). Funcția contains() arată dacă linie dată parte dintr-un tot mai mare. Acest lucru va permite, de exemplu, să returnați numai noduri care conțin anumite șiruri de caractere, cum ar fi: //rețetă.

      Această expresie returnează un element de rețetă care conține șirul „mic dejun” în elementul său de nume.

      Funcția substring() vă permite să selectați o gamă specifică de caractere dintr-un șir. De exemplu, expresia: substring(//rețetă/nume, 1, 5) returnează A bal .

      Primul argument este șirul complet, al doilea este poziția primului caracter, iar al treilea este lungimea intervalului.

      Alte funcții de șir includ concat() , substring-before() , substring-after() , starts-with() și string-length() .

      Funcții numerice

      Funcțiile numerice includ funcția number(), care convertește o valoare într-o valoare numerică, astfel încât alte funcții să poată opera pe ea. Funcțiile numerice includ și: sum() , floor() , ceiling() și round() . De exemplu, puteți găsi suma tuturor valorilor recipeId folosind expresia: sum(//recipe/@recipeId) .

      Desigur, nu există niciun motiv special pentru a efectua un astfel de calcul, dar este simplu valoare numerica, dat ca exemplu.

      Funcția floor() găsește cel mai mare număr întreg care este mai mic sau egal cu valoarea dată, iar funcția plafon() găsește cel mai mic număr întreg care este mai mare sau egal cu valoarea dată. Funcția round() funcționează în mod tradițional - se rotunjește (vezi Lista 24).

      Lista 24. Rezultatele funcţiilor numerice
      podea(42,7) = 42 plafon(42,7) = 43 rotund(42,7) = 43

      Funcții booleene

      Funcțiile booleene sunt cele mai utile atunci când lucrați cu expresii condiționate, care vor fi discutate în secțiunea Procesare condiționată. Poate cea mai utilă funcție este not(), care poate fi folosită pentru a determina că un anumit nod nu există. De exemplu, //rețetă returnează fiecare rețetă care conține șirul „mic dejun” în elementul său de nume. Dar dacă ai nevoie de toate rețetele, cu excepția micului dejun? Puteți folosi expresia: //rețetă.

      Alte funcții booleene includ true() și false(), care returnează constante și boolean(), care convertește o valoare într-o booleană, astfel încât să poată fi folosită ca valoare de test.

      Organizarea și importul ciclului

      Să ne uităm la două aspecte mai importante ale utilizării foilor de stil XSLT: crearea buclelor și importarea foilor de stil externe.

      Cicluri de organizare

      Când lucrați cu XSLT, trebuie să vă obișnuiți cu faptul că este un limbaj funcțional, nu unul procedural. Cu alte cuvinte, de obicei nu aveți niciun control explicit asupra modului în care execută instrucțiunile care îi sunt date. Cu toate acestea, există și excepții. De exemplu, este posibil să organizați bucle și să efectuați operații condiționate. Să începem cu ciclurile.

      În exemplul anterior, am folosit expresii XSLT încorporate în șablonul de publicație pentru a aplica stilul unor elemente specifice. În unele cazuri, acest lucru funcționează excelent. Cu toate acestea, în situațiile în care aveți fișiere XML complexe sau cerințe complexe, uneori este mai ușor să accesați informațiile în mod explicit (vezi Lista 25).

      Lista 25. Aplicație directă stiluri folosind bucle

      Ingrediente:


      Directii:

      Structura buclei este foarte asemănătoare cu structura pentru fiecare pentru care este numită. La fel ca și omonim, fiecare instanță de buclă poartă următoarea valoare a listei. În programarea Java, aceasta ar putea fi următoarea valoare dintr-o matrice; aici este următorul nod din colecția de noduri returnate de expresia XPath în atributul select. Aceasta înseamnă că atunci când executați prima buclă, nodul context este primul element de ingredient. Acest lucru vă permite să selectați cantitatea, unitatea și descendenții alimentelor acestui element și să le adăugați în document în același mod ca și mai devreme folosind șablonul. Este același lucru cu instrucțiunile, cu excepția faptului că acestea sunt doar afișate direct.

      Rezultatele sunt identice cu cele obținute la publicarea prin șabloane – aproape. Fiecare model este adăugat documentului ca o linie individuală, dar deoarece trebuie să procesăm aceste informații ca un model, pierdem mult spațiul alb pe care l-am văzut înainte (vezi Figura 7).

      Figura 7. Rezultate

      Pentru unele aplicații XML acest lucru contează, dar aici folosim HTML, așa că nu contează. Cu toate acestea, rețineți acest lucru atunci când decideți ce metodă să utilizați.

      Activarea și importarea foilor de stil

      O altă variantă a foilor de stil se referă la structura lor. Până acum, toate informațiile noastre erau stocate într-o singură foaie de stil. Cu toate acestea, în unele cazuri, poate fi util să îl împărțiți în foi de stil separate. Această modularitate poate face mai ușor de întreținut, precum și flexibilitatea de a permite diferite foi de stil să fie utilizate în scopuri diferite. De exemplu, am putea crea două foi de stil diferite, dintre care una va fi folosită pentru ingrediente (vezi Lista 26).

      Lista 26. Fișier Ingredients.xsl

      De asemenea, puteți crea o foaie de stil separată pentru instrucțiuni (vezi Lista 27).

      Lista 27. Fișier Instructions.xsl
    4. Aceste șabloane sunt identice cu șabloanele din foaia de stil curentă. Ele pot fi adăugate la foaia de stil prin includere (vezi Lista 28).

      Lista 28. Inclusiv foile de stil
      ...

      Ingrediente:

      Directii:

      Deși am plasat foile de stil aici în același director ca foaia de stil principală, nu este necesar să facem acest lucru: atributul href poate conține orice URL disponibilă. Rețineți că trimitem procesorului să caute șabloane pentru ingrediente și elemente de instrucțiuni, care nu sunt în acest fișier. Cu toate acestea, dacă procesați foaia de stil, rezultatul este exact același ca și cum șabloanele ar fi incluse direct, mai degrabă decât prin elementul include (vezi Figura 8).

      Figura 8. Rezultate

      Elementul include produce același rezultat ca și cum am fi adăugat conținut începând din acel moment. Din punct de vedere semantic sunt identice. Pe de altă parte, există o altă modalitate de a include informații - importul.

      XSLT vă permite să importați o foaie de stil la începutul unui fișier. De ce până la început? Deoarece scopul importului unei foi de stil este de a putea ajusta orice șabloane care fac parte din import. De exemplu, putem importa șablonul de ingrediente și îl putem personaliza (vezi Lista 29).

      Lista 29. Importul unei foi de stil
      ... ...
    5. Aici, de fapt, am înlocuit un șablon cu două, care înlocuiesc șabloanele din foaia de stil importată (vezi Figura 9).

      Figura 9. Rezultate

      Rețineți că, deoarece ierarhia depinde de locație, același rezultat poate fi obținut folosind includerea. Cu toate acestea, XSLT vă permite să utilizați atributul de prioritate pentru a specifica prioritatea șabloanelor la procesarea importurilor.

      extensia XSLT

      Am văzut cum să facem XSLT mai mult ca programarea. Ce zici să adaugi o programare reală? Să aruncăm o privire la adăugarea funcționalității Java la o foaie de stil XSLT.

      În primul rând, trebuie remarcat faptul că, deși mecanismul de extensie face parte din recomandările XSLT, implementarea discutată aici este specifică procesorului Xalan XSLT. Ideile de bază sunt aproape aceleași pentru alte procesoare, dar va trebui să verificați documentația pentru detalii.

      Elemente de expansiune

      Extinderea XSLT se face folosind diferite tehnici. Prima este utilizarea elementelor de extensie. Elementul de extensie este un element dintr-un spațiu de nume care indică o clasă Java. De exemplu, aruncați o privire la următorul element de extensie (vezi Lista 30).

      Lista 30. Utilizarea elementului de extensie
      Rețete ...

      Am creat un spațiu de nume care corespunde clasei comp.backstop.RecipeScaler, care include metoda statica numit scaleMessage (vezi Lista 31).

      Lista 31. Clasa RecipeScaler
      pachet com.backstop; clasă publică RecipeScaler ( public static String scaleMessage (org.apache.xalan.extensions.XSLProcessorContext context, org.w3c.dom.Element thisElement)( return "Această rețetă a fost scalată de un factor de " + thisElement.getAttribute("porții" ) + "."; ))

      Când procesorul ajunge la element, vede scaler-ul de prefix al spațiului de nume: și știe că este desemnat ca prefix al elementului de extensie și, astfel, înțelege ce clasă este desemnată în definiția spațiului de nume. Metoda pe care o apelează răspunde nume local element - scaleMessage . Metoda în sine primește două argumente, dintre care de fapt folosim unul. Parametrul de context se referă la contextul procesorului, ceea ce ne permite să privim elementele legate de elementul de extensie, dar ne vom concentra doar pe elementul de extensie în sine. Deoarece primim acest element ca parametru de metodă, putem extrage valorile oricăror atribute adăugate acestui element, cum ar fi porțiile în acest caz. Textul returnat de metodă este adăugat la ieșire în locul elementului de extensie.

      Aceasta înseamnă că dacă aplicăm o foaie de stil, vom obține rezultatele prezentate în Figura 10.

      Figura 10. Rezultatele elementului de extensie

      Elementele de extensie pot fi destul de utile, deși pot fi puțin dificil de utilizat.

      funcții de extensie

      O altă modalitate de a adăuga funcționalitate folosind foile de stil este utilizarea funcțiilor de extensie, care sunt oarecum mai ușor de implementat decât elementele de extensie. De exemplu, am putea crea o funcție care înmulțește numărul de ingrediente și numărul de porții (vezi Lista 32).

      Lista 32. metoda scaleIngredient().
      pachet com.backstop; clasă publică RecipeScaler ( public static String scaleMessage (org.apache.xalan.extensions.XSLProcessorContext context, org.w3c.dom.Element thisElement)( return "Această rețetă a fost scalată de un factor de " + thisElement.getAttribute("porții" ) + "."; ) public static int scaleIngredient(int porții, int original)( return (porții * original); ) )

      Adăugarea acestei funcții la o foaie de stil este identică cu adăugarea unui element de extensie care are deja o hartă a spațiului de nume pentru clasă (vezi Lista 33).

      Lista 33. Adăugarea funcției de extensie
      ...
      ...

      Rețineți că apelul de funcție include un prefix de spațiu de nume. Ca și înainte, procesorul vede prefixul și știe să facă un apel către clasa RecipeScaler. Ca rezultat, numărul de ingrediente este înmulțit cu doi (vezi Figura 11).

      Figura 11. Utilizarea funcției de extensie

      Deși acest cod funcționează, este dificil de întreținut. Să vedem cum să facem sprijinul mai ușor.

      Programare XSLT

      Înainte de a încheia, să ne uităm la două aspecte ale XSLT care oferă unele dintre aceleași caracteristici găsite în limbajele obișnuite de programare.

      Variabile XSLT

      Este grozav că putem executa o funcție, dar ajunge să fie o constantă ascunsă adânc în foaia de stil. Nu ar fi mai bine să setați variabilele la începutul paginii? Bineînțeles că da (vezi Lista 34).

      Lista 34. Setarea unei variabile
      Rețete ...
      ...
      Figura 12. Utilizarea unei variabile

      Rețineți că ingredientele au fost înmulțite cu numărul de porții, așa cum era de așteptat. Cu toate acestea, dacă te uiți mai atent, vei vedea că elementul de extensie s-a comportat greșit, confundând variabila cu un șir în loc să folosească valoarea variabilei în sine. Aceasta nu este o eroare; specificația nu necesită ca procesorul să facă nimic cu valorile atributelor înainte de a procesa elementul de extensie. Prin urmare, trebuie să evităm cumva această problemă.

      Prelucrare condiționată

      Primul lucru pe care îl putem face este să folosim procesarea condiționată, astfel încât mesajul să fie afișat doar atunci când este necesar. De exemplu, vezi Lista 35.

      Lista 35. Folosind elementul if
      Rețete ...

      Conținutul elementului if specificat de atributul test trebuie să fie adevărat. Dacă nu este cazul, ceea ce sa întâmplat în acest caz, rezultatul nu va apărea deloc (vezi Figura 13).

      Figura 13. Rezultatele clauzei if

      Așa cum este scrisă, propoziția nu are prea mult sens; dacă valoarea este mai mare de unu, elementul de extensie va apărea cu valoarea „3”. Este mai bine să utilizați selecția multiplă (vezi Lista 36).

      Lista 36. Elementul alege
      Rețete Rețetele au fost scalate cu un număr nevalid. Rețetele au fost scalate pentru mai multe porții. ...

      În acest caz avem o combinație a elementelor if-then-else și clauza case from limbi tradiționale programare. Elementul select acționează ca un container, dar elementul when își afișează conținutul numai dacă atributul său de testare este adevărat. În cele din urmă, dacă niciunul dintre elementele când nu este adevărat, procesorul afișează conținutul elementului altfel.

      Rezultatul este cel așteptat (vezi Figura 14).

      Figura 14. Rezultat

      Acum puteți seta mai flexibil afișarea unui număr mai mare de porții sau vă puteți adapta la alte condiții.

      Concluzie

      Rezumând

      Acest ghid v-a dus de la o introducere inițială a transformărilor XSLT la crearea unui program destul de cuprinzător tabele complexe stiluri. Mai întâi ai învățat elementele de bază ale foilor de stil, apoi expresiile XPath, una dintre Bazele XSLT. În ultima parte acest manual Am acoperit câteva dintre aspectele mai avansate ale foilor de stil XSLT - variabile, procesare condiționată și extensii. Ca rezultat, acum ar trebui să aveți suficiente cunoștințe pentru a face aproape orice aveți nevoie să faceți cu foile de stil XSLT - sau cel puțin să înțelegeți ce altceva trebuie să vă dați seama dacă vă confruntați cu o problemă.

      Adnotare: Discută generarea de cod folosind transformări XSLT. Sunt studiate sintaxa XSLT, caracteristicile aplicării transformărilor, precum și efectuarea de operațiuni precum filtrarea, sortarea și selecția condiționată în șabloane. Efectuarea transformării în mod programatic în C#. Avantajele și dezavantajele tehnologiei.

      Limbajul de transformare XSLT

      În a doua prelegere ne-am uitat deja la un exemplu folosind XSLT. În această prelegere ne vom uita la această tehnologie mai detaliat. XSL (limbaj extensibil pentru foi de stil)înseamnă Extensible Style Language și este un limbaj pentru creare Stiluri XML documente. XSLT(Transformări XSL) este limbajul de transformare XSL și face parte din acesta. Stilul XSLT este conceput pentru a transforma structura ierarhică și formatul unui document XML. Rezultatele transformării pot fi un fișier XML, fisier text, cod de program, fișier HTML, fișier în format PDF, și așa mai departe. Acest limbaj oferă capabilități puternice de manipulare a datelor, informațiilor și textului într-o formă ierarhică.

      Și asta este exact ceea ce este necesar pentru a genera cod. Utilizarea XSLT poate ajuta foarte mult generarea de cod. În plus, oferă o alternativă convenabilă la tehnologia șablonului T4.

      XSLT a fost dezvoltat de un consorțiu W3C (Lumea Wide Web Consorţiu). Prima versiune a limbajului, XSLT 1.0, a devenit o recomandare pe 16 noiembrie 1999, iar XSLT 2.0 a devenit o recomandare pe 23 ianuarie 2007. Ambele versiuni sunt folosite destul de activ, iar în această prelegere ne vom uita la funcționalitatea de bază care le este comună. Aceasta înseamnă că vom lua în considerare în principal prima versiune. Vom aminti și câteva comenzi din a doua versiune.

      Cum funcționează XSLT

      Modelul XSLT include următoarele părți:

      • documente XML,
      • stiluri XSLT,
      • procesor XSLT,
      • documente de ieșire.

      Documente XML sunt date de intrare care trebuie convertite în alte documente. Document stilul XSLT este un document XML bine format și conține un set de reguli pentru efectuarea transformării. Cu alte cuvinte, un document de stil este un șablon.

      Procesor XSLT este o aplicație care acceptă documente XML și stiluri XSLT ca intrare. Efectuează transformarea, adică aplicarea unui set de reguli în stiluri XSLT documentelor XML. Rezultatul acestei lucrări este documente de ieșire.

      Procesoarele XSLT au multe implementări și sunt încorporate în multe browsere precum Internet Explorer, Firefox, Mozilla, Opera și altele. Internet Explorer utilizează instrumentul MSXML dezvoltat de Microsoft. Procesorul XSLT este încorporat în Internet Explorer începând cu versiunea 4.5. Ieșirea generată a exemplelor din această prelegere poate fi vizualizată prin deschiderea fișierelor XML într-unul dintre browsere. La finalul prelegerii, vom analiza posibilitățile de lansare a transformării în mod programatic, folosind clasele de limbaj de programare adecvate.

      XPath

      O altă parte a tehnologiei XSL este limbajul XPath, conceput pentru a accesa nodurile dintr-un document XML prin specificarea căilor și expresiilor. Limbajul XPath este folosit în fișierele de stil pentru a naviga în documentele XML, identificând părți ale documentului XML sursă care se potrivesc cu unul sau mai multe modele predefinite. Când se găsește o potrivire, procesorul XSLT îi va aplica regulile corespunzătoare din fișierul de stil și îl va transforma într-o parte a documentului rezultat. Fișierele în stil XSLT folosesc intens expresiile XPath.

      Folosind XSLT

      Limbajul XSLT constă din multe instrucțiuni scrise ca etichete. Numele fiecărei instrucțiuni începe de obicei cu caracterele xsl. Pentru a efectua transformarea, documentul în stil XSLT trebuie să fie un document XML valid.

      Pentru a transforma un document XML, trebuie să adăugați o declarație similară cu următoarea la începutul documentului:

      O foaie de stil XSL conține de obicei multe elemente, dintre care cel mai important este elementul xsl:foaie de stil. El este cel care indică faptul că acest fișier XML este un fișier de stil. Pe lângă acesta, poate conține și alte elemente, de exemplu xsl:template, xsl:value-of. Documentul XML și fișierul de stil sunt transmise procesorului XSLT, care procesează aceste fișiere, efectuează transformarea și scoate rezultatul transformării.

      Mai jos este document XML, care conține o listă de limbaje de programare.

      C# Visual Basic Delphi Prolog Exemplul 5.1. Fișier Languages.xml

      Trebuie să scoateți această listă în format HTML. În acest scop folosim instrucțiunile xsl :pentru-fiecare, care va aplica o parte din șablon secțiunilor de document ale căror nume sunt specificate în atributul select. În cazul nostru, vom specifica select="languages/language" .

      Fișierul de stil care va fi folosit este:

      Limbile mele preferate:

      -

      Exemplul 5.2. Fișier languages.xsl

      Șablon în interior xsl :pentru-fiecare imprimă conținutul fiecărui element de limbă din limbi. În acest scop, se folosește instrucțiunea xsl:value-ofși atributul specificat select="." . Aceasta înseamnă că procesorul trebuie să selecteze conținutul text al elementului curent din document. Pe lângă afișarea conținutului, puteți specifica numele anumitor etichete, precum și atribute pentru a selecta valorile stocate în ele. Exemplele vor fi discutate mai jos.

      Să deschidem fișierul XML prin Internet Explorer sau alt browser. Va fi afișat următorul text:

      Limbile mele preferate:

      • Visual Basic
      • Delphi
      • Prolog

      Unul dintre cele mai importante elemente ale stilului este xsl:template. Servește la definirea unui șablon reutilizabil și conține regulile prin care va fi transformat documentul XML. Atributul potrivire conține o expresie pentru selectarea nodurilor la care va fi aplicat șablonul. Poate fi prezent și un atribut de nume. În acest caz, este posibil să apelați un șablon după nume cu o instrucțiune xsl:apply-templates.

      Pentru a repeta rezultatul șablonului pentru fiecare element al documentului, utilizați instrucțiunea xsl :pentru-fiecare. Modelul este executat pentru fiecare element care se potrivește cu condiția specificată în atributul select.

      Instrucțiuni xsl:value-of servește la evaluarea expresiei scrise în atributul select și apoi la afișarea rezultatului în locul în care se află elementul în sine.

      Filtrare

      Am luat în considerare cazul în care sunt citite valorile fiecărui nod. Cu toate acestea, adesea este nevoie să selectați doar o parte a datelor, adică acestea trebuie să fie filtrate. Șabloanele XSLT acceptă două metode de filtrare.

      Una dintre ele folosește atributul select al declarației xsl :pentru-fiecare, iar al doilea este aplicarea atributului de potrivire al elementului xsl:template. Ne vom uita la utilizarea potrivirii mai târziu, dar deocamdată ne vom uita la select .

      Să modificăm puțin fișierul de date: adăugați un atribut înalt, indicând dacă o limbă din lista noastră este o limbă nivel inalt. Vom extinde, de asemenea, lista de limbi.

      C# Visual Basic Delphi Prolog Asamblator Java Perl Exemplul 5.3. Limbi fișierelor4.xml

      Rețineți că valoarea false pentru atribut înalt valorează doar pentru valoarea „Asamblator” . Să schimbăm puțin fișierul foaie de stil:

      Limbi de nivel înalt:

      -
      Exemplul 5.4. Limbi fișierelor4.xsl

      În secțiunea [@ mare = "adevărat"] precizăm că numai acele noduri de document care au atributul înalt are valoarea „adevărat”. Semnul @ este un simbol care indică faptul că este urmat de un nume de atribut.

      Să ne uităm la rezultat:

      Limbi de nivel înalt:

      • Visual Basic
      • Delphi
      • Prolog

      După cum puteți vedea, valoarea „Assembler” nu este afișată în lista de limbi, adică procesorul XSLT a filtrat datele în funcție de condițiile specificate.

      Triere

      Pe lângă filtrare, o altă operație frecvent utilizată în generarea codului este sortarea. Atributul de ordine al declarației xsl :pentru-fiecare servește la sortarea rezultatului, pentru a indica ordinea de trecere a nodurilor documentului la efectuarea unei transformări. Câmpurile de sortat sunt enumerate separate prin punct și virgulă și au, de asemenea, semnele „+” sau „-” în fața numelui lor, indicând sortarea în ordine crescătoare sau descrescătoare.

      Să luăm în considerare o versiune ușor modificată a documentului - în loc de atribut înalt vom folosi elementul level, care ia valori înalt sau scăzut. Și vom scrie numele limbii în elementul de nume.

      C# înalt Visual Basic înalt Delphi înalt Prolog înalt Asamblator scăzut Java înalt Perl înalt Exemplul 5.5. Limbi ale fișierului6.xml

      În următoarea foaie de stil pentru instrucțiuni xsl :pentru-fiecare aplicați atributul order-by cu valoarea +name , unde semnul plus înseamnă că trebuie să sortați în ordine crescătoare.

      Limbi de nivel înalt:

      -
      Exemplul 5.6. Limbi fișierelor6.xsl

      În atributul select, filtrăm după valoarea elementului de nivel. De asemenea, în atributul select al declarației

      XSLT(e X tensionabile S foaie de stil L limbaj T transformări) - un limbaj pentru transformarea documentelor xml.

      Introducere

      Sarcina de a genera rapoarte în sistemul DIRECTUM este una dintre cele mai populare.

      Acest articol descrie ceea ce poate să nu fie cea mai răspândită metodă de a genera rapoarte HTML bazate pe transformări xslt. Dar, fără îndoială, merită atenție ca fiind unul dintre cele mai convenabile și vizuale (dacă îl comparați, de exemplu, cu un raport rtf).

      Pe scurt, transformarea xslt constă în transformarea unei scheme xml cu date într-un raport bazat pe un șablon pre-preparat.

      Pentru exemplul de raport descris în articol, va fi afișată o listă de contrapărți cu numele, TIN-ul și adresa acestora.

      Pentru a genera un raport veți avea nevoie de două componente:

      Date XML pentru raport

      Șablon de raport Xsl

      Date în format xml

      Date în format xml poate fi obținut cu o interogare SQL directă:

      Selectați Analit, -- ID înregistrare pentru generarea legăturii NameAn, -- Numele contractantului EdIzm, -- INN Dop2 -- Adresa din dbo.MBAnalit unde Vid = %s și Sost = "D" și XRecStat = "+" pentru calea xml ("org"), tastați -- Obțineți un set de șiruri ca xml

      Interogarea descrisă mai sus va returna date în acest format:

      101702Mobile-Auto LLC123456789 148965JSC Trinity631000001 148966SRL Orientul Îndepărtat011101001

      Datele trebuie împachetate într-o etichetă și salvați-l într-un fișier, adăugând antetul:

      A doua linie a antetului fișierului de date xml este importantă, indică faptul că fișierul C:\Temp\template.xsl stochează șablonul de raport în care trebuie transferate datele.

      Rezultatul va fi un fișier xml ca acesta:

      101702Mobile-Auto LLC123456789426000, Izhevsk, st. Revoluționar, 44 148965JSC Trinity631000001443000, regiunea Samara, Samara, str. Lenina, 11 ani 148966SRL Orientul Îndepărtat011101001100006, Vladivostok, str. În primul rând, 1

      Dacă deschideți fișierul xml primit, browserul va folosi șablonul specificat în antet și va înlocui datele în el.

      șablon xsl

      Lista contrapartidelor

      Acum trebuie să creați puțină magie și să specificați ce date din xml și sub ce formă să introduceți în șablonul de raport.

      Pentru a lucra cu datele din șablonul xsl, sunt utilizate etichete speciale.


      pentru fiecare buclă și reguli de selecție

      Pentru a itera prin toate nodurile dintr-un fișier de date xml, trebuie să utilizați următoarea construcție:

      Vă va permite să parcurgeți întregul arbore de date. Pentru a selecta doar anumite date din arbore, se folosește o regulă de selecție select="orgs/org". Regulile sunt descrise în limbajul de interogare XPath. În exemplul curent, fiecare nod va fi selectat secvenţial din .


      Triere

      Dacă este necesar ca înregistrările să fie afișate nu în ordine în fișierul xml, ci sortate, atunci trebuie să indicați acest lucru în șablon:

      Acum, înregistrările vor fi sortate în prealabil după nume.


      Valoarea afișată

      Dar doar sortarea nu este suficientă, trebuie să afișați datele necesare în raport, pentru aceasta există o construcție:

      Construcția va afișa valoarea etichetei (numele contrapărții).


      Hiperlinkuri

      Pentru a crea un link de la numele unei contrapărți care poate fi folosit pentru a deschide o intrare de director, trebuie să modificați ușor codul:


      Operator de caz și filtrare

      Lăsați TIN-ul contrapărții să apară în raport pentru un motiv. Dacă nu există TIN pe card, va fi afișat un mesaj care indică absența unui TIN. Pentru a face acest lucru, trebuie să utilizați următoarea construcție:

      Număr de identificare a contribuabilului: . TIN nu este specificat.

      În proiectare alege folosind un filtru Test conținutul etichetei este verificat (TIN) la o valoare goală ( ). Dacă conținutul nu este gol, atunci valoarea este tipărită. În alte cazuri, este afișat mesajul „TIN nu este specificat”.


      Un alt filtru

      Folosind filtrul, este posibil să se implementeze un alt „lucru mic” care va marca contrapărțile cu un INN începând, de exemplu, cu codul de regiune „18”. Va arata asa:

      Designul pentru toate înregistrările TIN care încep cu „18” va afișa suplimentar pictograma.

      Rezultatul final este un cod șablon ca acesta:

      Lista contrapartidelor

      Număr de identificare a contribuabilului: . TIN nu este specificat. Abordare: .


      Rezultat

      Și dacă deschideți fișierul xml în browser, veți obține următorul raport:

      Concluzie

      Acest articol descrie doar câteva capabilități de bază xsl, cum ar fi filtre, sortare, buclă, construcție a carcasei. Pe langa ei mai sunt si oportunități interesante. Sper că articolul vă va încuraja și pe voi să le studiați. Poate că după aceasta, raportarea va deveni mai interesantă.

      Și dacă conectați acest lucru la raport Unealtă puternică ca javascript, raportul descris poate fi ușor de făcut interactiv. De exemplu, adăugați un element care vă permite să efectuați un fel de filtrare. Sau afișați grafice bazate pe datele raportului.

      Care sunt avantajele implementării rapoartelor în modul descris:

      Necesită o dezvoltare relativ mică cantitate mare calcul aplicat;

      Dezvoltarea unui șablon este clară și, de asemenea, relativ ieftină.

      Tot ceea ce este descris în articol este ușor de integrat în raportul analitic, al cărui link este dat mai jos.

      Au trecut mai puțin de trei ani de când am avut ideea că este timpul să învăț XSLT -))). Ideea a apărut, dar peste tot mai exista PHP 4 și atrocitățile lui Salbotron, care, ca să spunem ușor, nu era diferit. performanta ridicata. Și era rar ca vreun browser să se laude că acceptă acest XSLT. Din aceste motive, am amânat studiul unei astfel de direcții promițătoare până la vremuri mai bune. Pe acest moment putem spune cu siguranță că aceste vremuri au venit, deoarece PHP 5 a fost lansat cu suport XSLT și un sistem decent. model de obiect, iar toate browserele de top gestionează deja transformările cu încredere, trebuie doar să trimiteți XML. :)

      • http://w3c.org - comitet pentru dezvoltarea și promovarea standardelor de Internet World Wide Web. În prezent, este sursa principală a aproape tuturor standardelor și recomandărilor orientate către web.
      • http://www.w3.org/TR/xml - Specificația Extensible Markup Language XML, care este baza web modern. La momentul redactării, este disponibilă cea de-a cincea ediție, versiunea 1.0, precum și cea de-a doua ediție, versiunea 1.1.
      • http://www.w3.org/TR/xml-names - specificație de utilizare spații de numeîn XML.
      • http://www.w3.org/TR/xpath - specificație pentru utilizarea unui limbaj pentru căutarea părților unui document XML XPath.
      • http://www.w3.org/TR/xsl/ - specificație extinsă a limbajului de stil XSL.
      • http://www.w3.org/TR/xslt - specificația limbajului de transformare XSLT.
      • http://validator.w3.org/ - validator HTML.
      • http://www.w3.org/TR/xhtml1/ - specificație XHTML1.0.

      Traduceri în rusă:

      • http://www.rol.ru/news/it/helpdesk/xml01.htm - Extensible Markup Language XML1.0(a doua editie). /Radik Usmanov/
      • http://www.rol.ru/news/it/helpdesk/xnamsps.htm - Spații de numeîn XML. /Radik Usmanov/
      • http://www.rol.ru/news/it/helpdesk/xpath01.htm - XML ​​​​Path Language ( XPath). /Radik Usmanov/
      • http://www.rol.ru/news/it/helpdesk/xslt01.htm - Limbajul de transformare XSL (XSLT). /Radik Usmanov/

      Pentru a înțelege mai bine ce se întâmplă, vă recomand să citiți specificațiile în următoarea ordine:

      1. XML(aceasta este baza!)
      2. spații de nume(mecanism pentru codul XML eterogen într-un singur fișier)
      3. XPath(limbaj pentru selectarea elementelor din arborele de structură)
      4. XSLT(conversii)
      5. XHTML(la ce trebuie să te străduiești)

      Cei care sunt deosebit de curioși pot fi atenți și la limbajul de stil extins XSL.

      2. XHTML valid

      Ce este XHTML valid? În primul rând, este un document XML care trebuie să se conformeze specificației XML. În al doilea rând, este o pagină HTML aproape obișnuită cu care toată lumea este obișnuită.

      De ce este nevoie de XHTML? Doar din motive de compatibilitate și între browsere. O pagină în XHTML are mai multe șanse să se afișeze corect în browserele populare decât HTML obișnuit.

      Pentru nituitoarea medie a paginilor, expresia document XML ar trebui să însemne următoarele:

      1. Documentul conține o declarație de document XML la începutul paginii:
      2. Documentul conține un element rădăcină, care conține toate celelalte.
      3. Toate elementele (etichetele) trebuie să aibă o parte de închidere (
        , ).
      4. Atributele au întotdeauna o semnificație, care trebuie specificată între ghilimele (single sau duble). De exemplu, "radio" disabled="disabled" /> .
      5. Caractere de control și ,< и >ar trebui să poarte întotdeauna o deghizare. De exemplu, „?a=1&b=2” >&. Singura excepție este, în care caracterele speciale nu trebuie să fie mascate.

      De asemenea, XHTML în sine obligă să fie îndeplinite următoarele condiții:

      1. Documentul trebuie să declare spațiul de nume în care vor fi utilizate elementele HTML.
      2. Documentul trebuie să declare un DOCTYPE înaintea elementului rădăcină și să specifice unul dintre tipurile XHTML și DTD-ul corespunzător din acesta.

      Exemplu de document XHTML1.0 simplu:

      Și așa despre totul în ordine.

        O declarație a unui document XML care specifică versiunea și codificarea acestuia.

        Declarația spațiului de nume și a limbii utilizate.

      Trei versiuni de XHTML1.0 sunt concepute pentru o mai bună compatibilitate cu versiunile inverse:

      • Strict - oferă cea mai mare conformitate cu recomandările W3C din partea browserelor. Cu toate acestea, codul HTML în sine trebuie să respecte aceste instrucțiuni.
      • Tranziția este o potrivire mai puțin strictă care face ca browserul să se comporte ca și cum ar fi un document HTML obișnuit.
      • Set de cadre - vă permite să utilizați cadre.

      XHTML1.1 este în esență același cu XHTML1.0 Strict și este destinat să înlocuiască alte versiuni de XHTML1.0. Cu toate acestea, în comparație cu XHTML1.0 Strict, are o serie de diferențe:

      1. Atributul lang a fost eliminat, rolul său este jucat de xml:lang . (Modulul [ XHTMLMOD ])
      2. Pentru elementele a și map, trebuie să utilizați atributul id în loc de atributul name. (Modulul [ XHTMLMOD ])
      3. Este disponibil un set de elemente rubin. (Modulul [RUBY])

      Deci, dacă doriți cea mai bună compatibilitate între browsere și compatibilitate W3C, atunci XHTML1.1 este!

      Din aceste motive, rezultatul transformărilor mele va fi exact XHTML1.1.

      3. Transformări XSLT

      Ce este XSLT? Este un limbaj de transformare a documentelor XML care a fost dezvoltat ca parte a limbajului XSL (Extended Stylesheet Language).

      De ce este nevoie de XSLT? Vă permite să implementați o schemă în care datele sunt stocate separat și prezentarea lor este separată. Adică, un document XML este transformat folosind un alt document XML (XSL-ul care conține șabloanele XSLT) într-un document final. Ieșirea poate fi XML, HTML sau Document text orice format.

      Pentru a utiliza transformările XSLT, mai întâi trebuie să generați stilul XSL corect și să îl conectați la fișierul XML.

      Un document XSL valid este un document XML care are spațiul de nume xsl specificat și are un element rădăcină foaie de stil. În chiar caz simplu stilul ar putea arăta astfel, de exemplu:

      Acest stil nu conține nicio definiție explicită a șabloanelor sau a altor elemente XSL. Cu toate acestea, poate fi deja folosit. Pentru a vedea rezultatul, generați un document XML arbitrar și atașați-i acest stil:

      Linia este responsabilă pentru conectarea stilului:

      În acest caz, codarea rezultatului va fi UTF-8, în ciuda faptului că documentul sursă a fost generat în Windows-1251. Din păcate, browserele de obicei nu vă permit să vizualizați codul în documentul rezultat, dar modulul XSLT al PHP5 face posibilă trecerea codului rezultat într-o variabilă care poate fi salvată într-un fișier. Prin urmare, folosind PHP, voi furniza codul sursă al documentului rezultat:

      Acest cod nu este un document XML valid, cu atât mai puțin XHTML1.1. Pentru a genera codul necesar, voi complica stilul XSL original și voi adăuga șabloanele și transformările necesare. În acest caz, documentul XML original va rămâne neschimbat.

      Ca exemplu, voi da un stil XSL care, folosind XSLT, va afișa o listă de atribute ale documentului XML sursă cu valorile acestora, în timp ce va fi generat XHTML1.1 valid. Deci, stilul:

      Fișier - test.xsl
      "/" > „http://www.w3.org/1999/xhtml” xml:lang="ro" > Primul meu XSLT
      Lista mea:
      1. culoare de fundal: #eee;

      Pentru a înțelege cum funcționează, voi descrie fiecare acțiune separat:

        Declarație de document XML:

        Atribut obligatoriu este de a defini un spațiu de nume xsl printr-un atribut xmlns:xsl= „http://www.w3.org/1999/XSL/Transform”.

        Următorul pas în element rădăcină foaia de stil declară cum ar trebui să fie format documentul rezultat:

        „http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd” />

        Principalele atribute:

        • metoda= "xml"- metoda de ieșire a documentului. Documentul rezultat va fi în format XML.
        • codificare= „Windows-1251”- codificarea documentului rezultat.
        • omit-xml-declaration="nu"- dacă să omiteți sau nu declarația inițială a documentului XML (). Poate avea valoarea „da” sau „nu” (relevant doar pentru html).
        • indent= "da"- formează indentări în funcție de nivelul de cuibărit. Poate fi „da” sau „nu”.
        • tip media= „text/xml”- Tipul MIME al documentului rezultat (utilizat numai pentru metoda de ieșire html).
        • doctype-public="-//W3C//DTD XHTML 1.1//EN"- tipul documentului rezultat (DOCTYPE)
        • doctype-system= „http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”- link la DTD

        Dacă metoda de ieșire este declarată ca html, atunci valorile atributelor de codificare și tip media vor fi înlocuite în titlul paginii ( ...) printr-o metaetichetă.

        Declarație șablon principală:

        Atribut xmlns= „http://www.w3.org/1999/xhtml” indică către spațiul de nume xhtml care va fi aplicat implicit acestui element și la toate elemente copil, pentru care nu este specificat în mod explicit.

        xml:lang= atribut "ru" indică limba în care este generată pagina (viitorul).

      Această parte a stilului a fost necesară pentru a forma atributele codului XHTML1.1 valid.

      Acum, pentru transformările XSLT:

        Introduce text simplu:

        Atributul select acceptă o expresie XPath, pe baza căreia face o selecție. Dacă selecția a returnat o listă de noduri, atunci bucla începe să ruleze pentru fiecare element.

        În acest caz, selecția va returna o listă de atribute pentru această (rădăcină) și toate elementele copil.

        Verificarea starii:

        În acest caz, dacă poziția elementului este uniformă (determinată de mai mare dacă), atunci stilul elementului

      1. Culoarea de fundal va fi gri.

        Afișarea valorilor elementelor:

        Acest cod va insera în elementul părinte un șir compilat din numele elementului curent și valoarea acestuia. Conținutul atributului select se potrivește cu XPath.

        Dezvoltator analizator: "proprietate-sistem ("xsl:url-furnizor")" /> "proprietate-sistem ("xsl:url-furnizor")" /> "proprietate-sistem ("xsl:vendor")" />

      Rezultatul procesării acestui stil (test.xsl) va fi următorul cod:

      Rezultat - cod sursă
      "1.0" encoding="windows-1251"?> „http://www.w3.org/1999/xhtml” xml:lang="ro" > Primul meu XSLT
      Lista mea:
      1. attr1 = Atribut principal
      2. stil=" culoare de fundal : #eee ;" > attr1 = atributul meu1
      3. attr2 = atributul meu2
      4. stil=" culoare de fundal : #eee ;" > attr5 = Atribut liber
      Dezvoltator analizator: libxslt

      Acest cod este conform standardului XHTML1.1 și a fost generat din documentul XML original. Pentru a verifica, puteți utiliza validatorul W3C, care se află la http://validator.w3.org/.

      În browser, acest cod arată cam așa:

      // Afișează codul HTML ca text header("Tip de conținut: text/plat;"); // Obiect document XML sursă$xml = document DOMD nou (null , "windows-1251" ); $xml ->load("test.xml"); // Obiect de stil $xsl = new DOMDocument(null , "windows-1251" ); $xsl ->load("test.xsl"); // Crearea unui parser$proc = nou XSLLTProcessor(); // Conectarea stilului la parser$proc ->importStylesheet($xsl ); // Procesarea documentului XML sursă de către parser$parsed = $proc ->transformToXml($xml ); // Afișează codul rezultat echo $parsed ; // Scrieți un fișier cu codul rezultat file_put_contents("parsed.html" , $parsed );?>
      IE 6 FireFox 3 Opera 9.02

      Informații suplimentare despre utilizarea XSLT în PHP5 pot fi găsite la http://ru2.php.net/manual/ru/book.xslt.php.

      Gândind cu voce tare

      „Tovarăși, stăm pe marginea unui abis imens! Și îmi propun să facem un pas mare, decisiv înainte!”

      2019 Anton Pribora. Când copiați materiale de pe site, vă rugăm să furnizați un link către sursă.

      O introducere alternativă la utilizarea transformărilor XSL în PHP folosind Sablotron.

      Acest material ar trebui luat ca o introducere alternativă la utilizarea XSLT cu Sablotron în PHP.

      Termenii XSL și XSLT sunt apropiați unul de celălalt, iar pentru începători pot fi considerați sinonimi. Detaliile despre care sunt diferențele sunt descrise în specificația XSL Transformations W3C.

      Oricine este interesat de capabilitățile XSLT citește exemplu standard din manual, sau exemple date în articole despre XSLT de pe diverse site-uri. Un exemplu de lucru din aceeași serie:

      Railroad Tycoon II Platinum strategie economică Software-ul PopTop DUMNEZEU. jocuri 2001 Marele Premiu 4 simulator de mașină Geoff Crammond și Simergy Infogrames Entertainment 2002 "; $xslData = " Jocuri

      Jocuri

      Nume gen an dezvoltator editor
      "; $xh = xslt_create(); $arguments = array("/_xml" => $xmlData, "/_xsl" => $xslData); $rezultat = @xslt_process($xh, "arg:/_xml", " arg:/_xsl", NULL, $argumente); if ($result) print ($result); else (print ("A existat o eroare care a avut loc la transformarea XSL...n"); print ("tError number" : " . xslt_errno($xh) . "n"); print („șir de eroare: " . xslt_error($xh) . "n"); ieșire; ) ?>

      Există o mulțime de exemple similare pe Internet. Toate arată bine că transformarea XSL în php funcționează, dar după citirea lor rămâne neclar de ce este nevoie de XSL, sau mai degrabă opusul - de ce nu este nevoie de XSL.

      „Într-adevăr”, se va gândi cititorul, „dacă datele sunt în baza de date, de ce să vă deranjați mai întâi să creați XML și apoi să îl convertiți prin XSL? Clasa șablon HTML va face acest lucru la fel de bine.”

      După aceasta, programatorul dezamăgit își pierde complet interesul pentru XSL și etichetează tehnologia drept „tocilar inutil”.

      Voi, dragi cititori, sunteți norocoși că ați găsit un site atât de minunat ca „php în detaliu”. Aici veți citi despre modul în care XSL nu numai că poate converti XML în HTML, ci și despre cum XSL poate face lucrul cu scripturi PHP mai ușor.

      Începutul lucrărilor

      Exemplul de mai sus, deși prea simplu, ilustrează bine cum se face transformarea XSL în PHP.

      Pentru ca acest cod să funcționeze, trebuie să instalați procesorul Sablotron XSLT. Pe o mașină Windows, acest lucru se face astfel:

      1. puneți iconv(-1.3).dll, expat.dll și sablot.dll în C:windowsSystem (toate fișierele sunt în distribuția standard php)
      2. deschideți C:windowsphp.ini și găsiți în el parametrul extension_dir. Dacă valoarea parametrului este "." sau ceva de genul „./”, schimbați, de exemplu, „f:usrlocalphpextension” (sau adresa directorului în care aveți/veți avea extensii php). Acesta va fi acum directorul de extensii php.
      3. puneți fișierul php_xslt.dll (acesta este pentru versiunea php 4.2.x) sau php_sablot.dll (pentru versiunea 4.0.x) în directorul de extensii
      4. în php.ini decomentați extensia de linie=php_xslt.dll (4.2.x) sau extensia=php_sablot.dll (4.0.x)

      Teorie

      Utilizarea XSLT vă permite să separați munca de formatare și prezentare a datelor din scripturile PHP. Aceasta nu este doar o reducere a cantității de cod, ci și eliminarea unui număr mare de coduri constructe logice(dacă, altfel, comută) și, prin urmare, facilitează munca de scriere și depanare a programelor. Îndrăznesc să spun că oricine nu a încercat să lucreze cu XSLT nu are idee cât de ușoară va fi codarea PHP.

      Cu toate acestea, nu vă amăgiți: dacă ați avut mai multe constructe if... else într-un script PHP, cel mai probabil vor apărea în același număr în fișierul XSL.

      Acum la exemple.

      Ieșirea listelor

      Toate complicațiile care provin din necesitatea de a afișa lista într-o formă care poate fi citită de om sunt transferate pe umerii XSL. Exemplul #2. O listă de articole de pe site cu evidențierea articolului care se citește acum, alternând culorile în rânduri și numerotarea listei.

      2002-05-30 Detectarea erorilor în PHP Un proiect viu și o revistă moartă Lucrul cu MySQL. Partea 7. Copaci Sortare manuală în interfața web Cum să te înțelegi între un designer și un programator Relaxează-te, acesta este PHP

      ...

      ... #cccccc <

      Markup personalizat

      Când traduceți un site cu texte (cum ar fi acesta) în XML, este firesc să doriți să vă creați propriul markup pentru articole. De exemplu, în containerul important, evidențiați locuri foarte importante și să le puteți evidenția nu neapărat cu font aldine, ci poate cu culoare, stil CSS. Sau scrie citate de genul citat text și să-și poată schimba stilul de design împreună cu designul site-ului.

      Trecând încet de la cel mai simplu prim exemplu, mulți dau peste această problemă și nu pot găsi o soluție. La urma urmei, dacă selectați un paragraf din etichetă Și pentru a face un șablon pentru acesta, la prima vedere, există trei moduri de a afișa conținutul:

      1. eticheta xsl:value-of afișează text, dar elimină toate etichetele din paragraf
      2. eticheta xsl:copy-of afișează o copie a întregului conținut (fără posibilitatea de a aplica șabloane copiilor - etichete interne) și containerul în sine (ceea ce nu este foarte frumos în HTML).
      3. în cele din urmă xsl:apply-templates va aplica șabloanele copiilor, dar va omite textul

      Problema pare fără speranță, dar există o soluție. Folosesc șabloane „magice” care afișează atât textul, cât și etichetele din el cu toate atributele și fără modificări. Exemplul #3:

      Acest exemplu folosește modele magice pentru analizarea markupurilor arbitrare. Acest lucru evită următoarele reclamații: Oameni buni, vă rugăm să ne spuneți, nu suntem locali! Nu pot afișa etichete în text folosind value-of!


      Amintiți-vă de aceste modele odată pentru totdeauna! Apoi puteți procesa orice text Aproape oricare.

      Primul lucru pe care îl face procesorul XSLT când apelează instrucțiunea apply-templates este să caute un șablon pentru fiecare element. Există un șablon pentru elementul puternic și în conformitate cu acesta vor fi procesate astfel de elemente. Nu există un șablon pentru hyperlink, așa că va fi afișat așa cum este. Puteți adăuga un șablon la XSL pentru link-uri care s-ar afișa lângă fiecare link text imagine pentru a o deschide într-o fereastră nouă:

      * șablonul folosește parametrul match="a[@href]" - acest șablon va fi aplicat numai acelor etichete de link care au un câmp href și vor sări peste ancore ().

      Cod invalid și

      Necesitatea aparentă de a scrie cod XML valid descurajează, de asemenea, mulți neofiți XSLT. Bine, de mâine vom scrie doar articole valide, din fericire acasă poți verifica dacă există o eroare XML în text - etichetă nepotrivită sau token invalid - ne vom ocupa de asta cumva. Dar, pe cale amiabilă, întreaga arhivă trebuie tradusă într-un cod valid! Și m-am gândit și eu când a apărut oportunitatea de a reproiecta site-ul în XML.

      Soluția problemei este destul de simplă: dacă nu o doriți, nu o scrieți în mod valid. Scrie așa cum te-ai obișnuit - fără ghilimele în atributele etichetei, folosește simplu
      Și așa mai departe. Suficient pentru a include textul într-un container(exemplu de mai jos).

      În ceea ce privește situația de aici: nu există niciun element nbsp în XML. Există lt, gt, quot, dar nu nbsp (destul de logic - acesta este un spațiu fără frânare, care se referă la formatare și a fost inventat pentru HTML). Prin urmare, trebuie să fie declarat în document, sau folosit doar intern.

      Exemplul #4:

      Oameni buni, vă rugăm să rețineți, noi înșine nu suntem localnici!


      Amintiți-vă și de aceste modele!

      Foarte confortabil! Schimbări mari nu este nevoie să-l adăugați în arhivă. Puteți începe să scrieți în mod valid, dar continuați la întâmplare. Sau puteți combina aceste două abordări. Pentru a nu scrie fișiere de arhivă CDATA tag, am făcut o conversie simplă folosind expresii obisnuite(De asemenea, este important să rețineți că o etichetă CDATA nu trebuie să conțină alta).

      $doc = preg_replace ("~<(p|h|pre)>(.*?)~", "<\1>\2", $doc);

      Cicluri

      Să presupunem că trebuie să facem un formular pentru editarea unui articol, inclusiv data acestuia. Pentru ușurință în utilizare, trebuie să faceți trei liste derulante (denumite în continuare „întorsături”) - data de la 1 la 31, lună, an. Prima soluție care vă vine în minte este să faceți codul HTML al spinnerilor în php, să-l lipiți în XML într-un container CDATA și apoi să îl scoateți în XSL cu parametrul disable-output-escaping="yes".

      De fapt, XSLT poate face și asta. Este suficient să introduceți data, luna și anul în datele XML. Învârtitoarele pot fi desenate direct în XSLT.

      Să scriem un șablon care nu este destinat niciunui element de document. Va fi apelat de comanda xsl:call-template și va primi doi parametri: valoarea contorului și maximul. Mai întâi, va scoate datele de care avem nevoie cu valoarea contorului, apoi se va apela cu parametrii maxim și contorul crește cu 1. Exemplul #5:

      februarie Martie Aprilie Mai iunie iulie August Septembrie octombrie noiembrie decembrie

      ... 7 10 2002

      ... ...

      Ca teme, vă las cu un șablon pentru afișarea unei întorsături cu anul.