Xslt konvertering xml til html. Sådan konverteres

Det er også muligt at konvertere ikke til XML-udvidelsen, men til et hvilket som helst andet struktureret format, for eksempel til (HTML- og XHTML-standarderne ligner meget, men kun eksternt) eller blot til en vilkårlig tekstrepræsentation.

Ord stilark i standardens navn får mange til at tegne en analogi med et andet formateringsværktøj til markup-sprog - (Cascading Style Sheets) – cascading style sheets. Begge disse standarder har én ting til fælles, højst sandsynligt kun netop dette ord i navnet. Ved at bruge XSL kan du opnå effekten af ​​at bruge CSS, men CSS er aldrig en analog af XSL. Her er deres grundlæggende forskelle:

  • CSS påvirker kun stilen på datapræsentationen, mens XSL nemt kan ændre selve indholdet.
  • CSS anvendes på klientsiden af ​​internetbrowseren såvel som på serversiden.
  • XSL er XML-udvidelse, og CSS er et separat formelt sprog.

XSL-standarden, i forbindelse med XML til HTML-transformationer, er i formål tættere på et scriptsprog, der bruges på serversiden. Både PHP og XSL kan reducere størrelsen på internetressourcesider betydeligt ved kun at tillade, at deres indhold gemmes (i en database eller i XML-fil ah): uden formateringsstilparametre, mest HTML-markering, links og metatags. Desuden kan de bruges sammen: i det første trin genereres et XML-dokument ved hjælp af PHP, svarende til strukturen på den internetside, som brugeren anmoder om, og i det andet trin . I sidste fase formateres og "farves" det hele af browseren på klientsiden i henhold til reglerne specificeret i CSS. Dermed spares ikke kun plads på serveren, men også mængden af ​​trafik, da data transmitteres på en optimal måde for alle konkret tilfælde XML-format.

Anvendelserne af XSL er meget brede. For eksempel bruges XSL-transformation i forbindelse med arbejde til en form, der er praktisk til perception, udskrivning og yderligere behandling. Dernæst vil du blive præsenteret for en oversigt over de vigtigste XSL-konstruktioner, et værktøj til fejlretning af transformationsskemaer og et eksempel på konvertering af en XML-rapport til HTML.

Grundlæggende elementer eller syntaks for XSL

For at sammensætte XSL-transformationer kræves kendskab til følgende standarder:

  1. Syntaks eller XML-skema for XSL-transformationssproget.
  2. Et sprog til forespørgsel i XML-dokumentelementer.
  3. Formatet på måldokumentet (oftest HTML).

Mange mennesker er fortrolige med HTML, du kan lære om XPath ved at klikke på det tilsvarende link, og en liste over de vigtigste XSL-elementer vil blive præsenteret nedenfor.

XSL Transformation Schema Header

XSL-transer rodelementet i det tilsvarende XML-dokument. Filer med transformationsskemaer får oftest filtypenavnet .xsl. Ud over at definere xsl-navnerummet, kan transformationsskemaheaderen indeholde outputparametre for transformationsresultatet: xml, html eller tekst. Hvis outputelementet ikke er specificeret eksplicit, bestemmes dets parametre af fortolkeren under parsingen af ​​transformationsskemaet. Outputindstillinger - forskellige attributter for outputelementet kan påvirke formateringen af ​​det endelige resultat: udseendet af yderligere mellemrum, vognretur osv. Jeg lægger normalt ikke meget mærke til dette element, for i tilfælde af konvertering til XML generer yderligere formatering eller mangel på samme mig ikke, men i tilfælde af HTML er behandlingen af ​​det et problem for internetbrowseren. Jeg har ikke stødt på det sædvanlige tekstoutputformat.

XSL skabelon

En XSL-skabelon bruges til at anvende en gruppe af transformationer til et specifikt fragment af et XML-dokument. Transformationsgruppen placeres inde i skabelondefinitionen, og måldokumentfragmentet hentes ved hjælp af den XPath-forespørgsel, der er angivet i match-attributten. Den mest almindelige forespørgselsmulighed er navnet på børnene af analyse kontekst elementer. Parsing kontekst Før transformationen begynder, er selve dokumentet, og efterhånden som XSL-skabeloner anvendes, bevæger konteksten sig gennem dokumentstrukturen i overensstemmelse med resultaterne af XPath-forespørgsler. Et eksempel på skabelon er nedenfor.

Som du kan se i eksemplet, er skabelonen anvendt på XML-elementer Datasæt. Som et resultat af transformationen genereres en HTML-header med tekst svarende til Caption-attributten for det transformerede element, HTML-tabel og to skabeloner anvendes på skift til underordnede elementer i datasættet: med anmodninger om kolonner og poster elementer. Skabeloner til behandling af kolonnerne og poster-elementerne skal defineres separat i transformationsskemaet.

XSL-betingede erklæringer og parametreret skabelonopkald

Med ordentlig viden om XSL kan du endda skrive små programmer med det. Jeg mener ikke programmatisk kontrol af databehandling, men løsning af problemer, der slet ikke er relateret til databehandling. Sådanne sager er bestemt eksotiske, men i processen med at behandle komplekst strukturerede data er kontrol af betingelser og cyklusser nogle gange uundværlige. XSL-specifikationen understøtter betingede sætninger, skabelonkald, der sender parametre, ændring af værdien af ​​parametre i henhold til matematiske udtryk osv. Et eksempel på skabelon med et udvalgsudsagn og et betinget udsagn er givet nedenfor:

højre centrum

-

Ved behandling af kolonneelementer analyseres værdien af ​​attributten Navn, og en specifik skabelon kaldes afhængigt af dens værdi. Skabeloner kan have et navn, og opkaldsskabelonkonstruktionen bruges til at kalde dem. Selve Name- og AnyColumn-skabelonerne er defineret separat i dokumentet. AnyColumn-skabelonen er også parametreret - den accepterer tekstjusteringsparametre i en tabelcelle. Hvert når-element svarer til et valg, og det ellers element svarer til alle andre muligheder. Fuld beskrivelse Et eksempel på transformation vil blive givet i næste afsnit.

I slutningen af ​​skabelonens brødtekst er der en betinget operator, der bestemmer udseendet af en tom celle: hvis værdien af ​​Caption-attributten er tom linje, så viser vi symbolet "-". Bemærk venligst, at skabelonen, ud over betingelsen for valg af kolonneelement, indeholder en tilstandsattribut med rækkeværdien. Mode-attributten kan bruges til forskellige mønstre med samme match-attributværdi. Under transformationen er det værdien af ​​tilstandsattributten i application-template-skabelonapplikationskonstruktionerne, der bestemmer valget af skabelon. Her er et eksempel.

Og

Således, hvis en skabelon ikke har et navn angivet, bestemmes muligheden for dens brug af transformationskonteksten i overensstemmelse med værdierne af match-attributten og desuden mode-attributten. Hvor skabelonen anvendes i konteksten, bestemmes af anvende-skabelonkonstruktionen. Hvis en skabelon har et navn, kan den tvinges til den aktuelle kontekst ved hjælp af opkaldsskabelonkonstruktionen uden at ændre selve konteksten.

Looping og sortering i XSL

XSL-sproget giver dig ikke kun mulighed for fleksibelt at tilpasse datatransformation, men også forhåndssortere den. Sortering er kun tilgængelig i forbindelse med iteration over elementer, organiseret af en for-hver-løkke. Hvilke elementer der skal sorteres igennem bestemmes af select-attributten for hvert element, og hvilke data der skal sorteres efter bestemmes af select-attributten sorteringselement. Værdierne for begge disse attributter skal være et XPath-udtryk.

Definering af en parametriseret XSL-skabelon og tildeling af attributværdier

Følgende eksempel viser, hvordan en skabelon kan defineres med parametre, og hvordan disse parametre kan bruges i skabelonens brødtekst. Selve opkaldet til skabelonen præsenteret som et eksempel blev diskuteret i afsnittet om betingede operatører lige ovenfor.

Læg mærke til, hvordan outputelementet p tildeles værdien af ​​align-attributten – ved hjælp af en separat attributkonstruktion og en værdi-af-konstruktion, der får adgang til værdien af ​​inputparameteren.

XSL Schema Debugger

Nå, afslutningsvis præsenterer jeg dig for en XSL-skemadebugger, som kan bruges som et træningsprogram om emnet konvertering af XML-dokumenter.

Konvertering af XML-dataformat ved hjælp af Extensible Stylesheet Language Transformations (XSLT)

Inden arbejdet påbegyndes

Denne vejledning er designet til udviklere, der ønsker at bruge XSLT til at transformere XML-data til andre former uden at skulle programmere i Java™ eller andre sprog.

Denne tutorial forudsætter, at du er fortrolig med XML, men forfatteren går ikke ind i nogen af ​​sprogets mystiske forviklinger, så en grundlæggende forståelse er tilstrækkelig. Med undtagelse af et lille afsnit om udvidelser, behøver du ikke have noget særligt programmeringssprog bag dig. Og selv i dette afsnit er ideerne meget enkle og anvendelige til ethvert programmeringssprog, der understøttes af processoren.

Hvad handler denne guide om?

Denne vejledning handler om Extensible Style Sheet Language (XSLT) transformationer. XSLT er en af ​​de kernespecifikationer, der er forbundet med XML, hvilket gør det nemt at oversætte XML-data fra en form til en anden.

I denne guide lærer du:

  • Grundlæggende om XSLT
  • Brug af simple skabeloner
  • Offentliggørelse af data
  • Håndtering af mellemrum
  • Grundlæggende om XPath
  • XPath-funktioner
  • Sløjfer og betingede erklæringer
  • Import og medtagelse af andre typografiark
  • XSLT-udvidelse
  • XSLT-variabler

Begyndelse af arbejdet

Forestil dig et øjeblik, at du har et datasæt i XML. Du har muligvis valgt at gemme dem på denne måde på grund af fleksibiliteten ved XML. Du ved, at du vil være i stand til at bruge dem på tværs af flere platforme og med stort set alle programmeringssprog. Men nogle gange bliver du nødt til at ændre formen på din XML. For eksempel skal du muligvis oversætte data til et andet XML-format for at gemme dem i et andet system, eller en anden form til præsentation eller noget andet.

For eksempel kan du have data i XML, som du ønsker at publicere på nettet, hvilket betyder at oversætte det til HTML. Selvfølgelig kunne du manuelt inspicere dokumentet og foretage de nødvendige ændringer i det, eller måske tænkte du på at indlæse XML'en i DOM'en og derefter manuelt oprette outputdokumentet.

Hvad er XSLT?

Extensible Style Sheet Language Transformations (XSLT) giver en måde at automatisk oversættelse XML-data fra en formular til en anden. Målformularen er normalt et andet XML-dokument, men behøver ikke at være det; du kan transformere XML til næsten hvad som helst ved blot at oprette et XSLT-stylesheet og manipulere dataene. Hvis du vil ændre resultaterne, skal du blot ændre stilarket og genbehandle XML. Dette har den ekstra fordel, at det giver ikke-programmører, såsom designere, mulighed for at ændre stilarket og påvirke resultaterne.

Lad os se et eksempel.

Opgaven

I denne vejledning tager vi et XML-dokument og transformerer det til et XHTML-dokument, der kan vises som en webside. Indtastningen er simpelthen en opskriftsfil (se liste 1).

Liste 1. Grundlæggende data
Gush" gosh 1pund hamburger 1pund albue makaroni 2kopper brunt sukker 1taske hakkede løg 1teskefuld tørret dild Brun hamburgeren. Tilsæt løg og steg indtil gennemsigtigt. Tilsæt brun farin og dild. Kog og afdryp pasta. Kombiner kød og pasta. En afbalanceret morgenmad 1kop korn 1glas Appelsinjuice 1kop mælk 2skiver ristet brød Kombiner korn og mælk i en skål. Tilføj alle ingredienser til bordet.

Redaktørens note: Disse opskrifter er blot givet som et eksempel, som forfatteren forestiller sig dem. Den korrekte opskrift på Gush"gosh (fået fra hans kone, som tilbereder denne ret) består af 1 pund (0,454 kg) hakket oksekød, 1 pund horn, 1/2 kop gult sukker, 1 lille pakke (ca. 300 gram) finthakket løg, 1 tsk tørret dild og 1 lille dåse tomatpure, hvortil der tilsættes gult sukker.

Dette er selvfølgelig et meget simpelt eksempel, så du ikke bliver hængende i detaljerne i selve dataene, men du kan repræsentere alt fra en logningsproces til økonomi som XML-data.

Vores mål er at konvertere disse data til en XHTML-side, der viser opskrifterne individuelt og formaterer deres ingredienser og madlavningsinstruktioner (se liste 2).

Notering 2. Resultat
Opskrift

Gush" gosh

Ingredienser:

1 pund hamburger
1 pund albuemakaroni
2 kopper brun farin
1 pose hakkede løg
1 tsk tørret dild

Rutevejledning:

  1. Brun hamburgeren.
  2. Tilsæt brun farin og dild.
  3. Kog og afdryp pasta.
  4. Kombiner kød og pasta.

En afbalanceret morgenmad

Ingredienser:

1 kop korn
1 glas appelsinjuice
1 kop mælk
2 skiver toast

Rutevejledning:

  1. Tilføj alle ingredienser til bordet.

Du kan vise dette resultat i browseren som vist i figur 1.

Figur 1. Resultatet vises i browseren

Som nævnt kunne slutmålet være et hvilket som helst format, ikke kun XHTML, og ikke engang nødvendigvis XML.

Lad os starte med simple transformationer.

Simpelt stilark

Det enkleste typografiark er simpelthen et XML-dokument, der indeholder XSLT-output (se liste 3).

Liste 3. Det enkleste stilark
Opskrift

Ingredienser:

Rutevejledning:

Bemærk brugen af ​​xsl-navneområdet. Tilføjelse af dette navneområde fortæller processoren, hvilke elementer der er knyttet til behandling, og hvilke der blot skal udlæses. Værdi-af elementer fortæller processoren at indsætte specifikke data på det pågældende sted. Hvilke data der skal indsættes, bestemmes af indholdet af select-attributten.

Select-attributten består af et XPath-udtryk. XPath vil blive diskuteret mere detaljeret i afsnittet, men her kan du se, at titlen, ingredienserne og tilberedningsinstruktionerne er tilgået gennem dokumenthierarkiet. Vi starter ved rodelementet, /recipes , og arbejder os ned derfra.

Sådan konverteres

Den enkleste måde at udføre XML-transformation på er at tilføje et typografiark-tip til XML og vise det i browseren (se liste 4).

Liste 4. Tilføjelse af sttil XML
Gush" gosh ...

Denne behandlingsinstruktion beder browseren om at hente typografiarket placeret i basicstylesheet.xsl og bruge det til at transformere XML-dataene og udlæse resultaterne. Hvis du åbner vores XML-dokument i Microsoft browser® Internet Explorer®, vil du se et resultat svarende til figur 2.

Figur 2. Udpakning af typografiarket og transformation af XML-data

Det er dog ikke lige det, vi ønskede. Hvis du vælger Vis > Vis HTML-kode i din browser, vil du se den originale XML. For at se resultatet af konverteringen skal du udføre konverteringen og oprette en outputfil. Dette kan gøres via kommandolinje ved hjælp af Java-kode med følgende kommando (se liste 5):

Liste 5. Konvertering af et dokument via kommandolinjen
java org.apache.xalan.xslt.Process -IN recipes.xml -XSL basicstylesheet.xsl -out result.html

Hvis du modtager en ClassNotFoundException, skal du muligvis downloade Apache Xalan (se "Hent produkter og teknologier" i afsnittet) og tilføje de JAR-filer, den indeholder, til klassestien.

Efter at have udført transformationen vist i liste 5, vil du se, at filen result.html indeholder følgende kode (se liste 6).

Liste 6. Resultater
Opskrift

Gush" gosh

Ingredienser:

1 pund hamburger 1 pund makaroni 2 kopper brunt sukker 1 posehakkede løg 1 tsk tørret dild

Rutevejledning:

Brun hamburgeren. Tilsæt løg og steg indtil gennemsigtigt. Tilsæt brun farin og dild. Kog og afdryp pasta. Kombiner kød og pasta.

Jeg har tilføjet nogle mellemrum for at lette læsningen, men der er et par ting at bemærke her. For det første viser den kun information for én opskrift. For det andet er ingredienserne flettet sammen uden huller. Det er heller ikke det resultat, vi ønskede at få. Heldigvis kan du oprette mere præcise skabeloner til at vise dine data præcis, som du ønsker det.

Tilføjelse af skabeloner

En transformation nytter ikke, hvis den ikke bringer dataene i præcis den form, vi har brug for. For at gøre dette skal du være i stand til at bruge skabeloner, hvilket er hvad dette afsnit er helliget.

Oprettelse af skabeloner

De fleste typografiark har ikke den enkle form, du lige har set i det foregående afsnit. I stedet er de opdelt i en gruppe af mønstre, som hver især gælder for en bestemt datatype. Lad os oversætte vores stilark til denne formular (se liste 7).

Liste 7. Redesignet stilark
Opskrift

Ingredienser:

Rutevejledning:

Oplysningerne her er uændrede, bortset fra at processoren ser på typografiarket og starter med det mønster, der matcher dokumentets rodelement, som angivet af match-attributten. Den udsender derefter denne skabelon, inklusive alle værdierne, ligesom før. Hvis du udfører konverteringen nu, skulle du se nøjagtig de samme resultater som i .

Men det er ikke det, vi ønsker. Vi ønsker at kunne formatere ingredienser og instruktioner. Til dette kan vi skabe individuelle skabeloner for hvert af disse elementer og inkludere dem i typografiarket (se liste 8).

Fortegnelse 8. Oprettelse yderligere skabeloner
Opskrift

Ingredienser:

Rutevejledning:

INGREDIENSER HER

INSTRUKTIONER HER

Bemærk, at i stedet for blot at gengive elementets værdi, beder vi nu stilarket om at anvende passende skabeloner til ingredienserne og instruktionerne. Vi oprettede derefter separate skabeloner for disse elementer ved at indstille dem i match-attributten. Når den når elementet anvende skabeloner, vælger processoren alle ingredienselementer i dokumentet. Den leder derefter efter et mønster for ingredienserne, og når den finder et, udsender den det mønster. Det gør det samme med instruktionselementet. Resultatet skal svare til det, der er vist i figur 3.

Figur 3. Anvendelse af passende skabeloner til ingredienserne og instruktionerne

Okay, det er lidt tættere på, det er i hvert fald tydeligt, at der er to opskrifter, men du vil nok ikke kombinere ingredienser og instruktioner til alle opskrifterne. Heldigvis kan dette problem løses ved bedre organisering af skabeloner.

Udgivelse af skabeloner

For bedre at organisere dine data, lad os tage et kig på, hvordan vi adskiller og udgiver skabeloner. XSLT giver dig mulighed for at behandle information på en iterativ måde. For eksempel kan du opdele oplysningerne i individuelle opskrifter og derefter formatere instruktionerne og ingredienserne (se liste 9).

Liste 9. Fremhæv opskrifter
Opskrift

Ingredienser:

Rutevejledning:

INGREDIENSER HER

INSTRUKTIONER HER

I I dette tilfælde Stylearket gengiver hovedsiden (HTML) og gennemgår derefter hver opskrift og viser navn, ingredienser og instruktioner for hver opskrift. Igen vil vi studere XPath i afsnittet, men i dette tilfælde bliver opskriftselementet en kontekstknude, så de udvalgte attributter relaterer til denne node på samme måde som filer relaterer til en specifik mappe i filsystemet. Resultatet skal svare til figur 4.

Figur 4. Receptelementet bliver en kontekstknude

Fantastisk, formatet er tæt på det, vi ønsker, men vi skal stadig vise de faktiske oplysninger. For at gøre dette skal du ændre ingredienserne og instruktionerne (se liste 10).

Liste 10. Arbejder på ingredienserne og instruktionerne skabeloner
...

Ingredienser:

Rutevejledning:


  • Et vigtigt punkt, når du udgiver skabeloner: du har bedt processoren om at anvende de relevante skabeloner til ingredienselementet, men vi har ikke en specifik skabelon for det element. Hvis du anvender en skabelon på et element, men der ikke er nogen skabelon i sig selv, vises dataene simpelthen ikke. Men dette er ikke vores tilfælde.

    I stedet udnytter vi det faktum, at når vi fortæller processoren om at anvende passende mønstre på ingredienselementet, kigger den ikke kun efter ingredienselementet, men også efter underelementerne i ingredienselementet. Så den finder en skabelon til ingredienser, hvor du udskriver mængde, enheder, produktnavn og linjeskift.

    Vi gjorde det samme for instruktioner, da vi formaterede dem som listeelementer. Bemærk, at vi oprettede en faktisk bestilt liste i hovedskabelonen for opskriften og derefter sendte varerne til individuel behandling.

    Resultatet skal svare til figur 5.

    Figur 5: Oprettelse af en bestilt liste i hovedopskriftsskabelonen

    Formatet er bestemt tættere på det, vi ønskede. Men hvis du ser på outputtet, vil du se, at problemet med hvidt mellemrum stadig eksisterer (se liste 11).

    Liste 11. Ufærdig output
    Opskrift

    Gush" gosh

    Ingredienser:

    1 pund hamburger
    1 pund bue makaroni
    2 kopper brun farin
    1 posehakkede løg
    1 tsk tørret dild

    Rutevejledning:

    1. Brun hamburgeren.
    2. Tilsæt løg og steg indtil gennemsigtigt.
    3. ...

      Tilføjelse af mellemrum

      Hvorfor skete dette, hvis vi inkluderede mellemrum i stilarket? Skulle de have vist sig i outputtet? Selvfølgelig ikke nødvendigt. Der er måder at fortælle et typografiark om at efterlade hvidt mellemrum - vi vil se på disse i afsnittet Looping og import - men i nogle tilfælde er det nemmere eksplicit at tilføje tekst til outputtet (se Liste 12).

      Liste 12. Tilføjelse af tekst
      ...
      ...

      Dermed fik vi taget hånd om de manglende pladser. På samme måde kan du ved hjælp af tekstelementet tilføje enhver vilkårlig tekst til skabelonen. (Husk, at dette kun er tekst, ikke elementer af sideskift.) Resultatet bliver det output, vi ønsker (se liste 13).

      Liste 13. Slutresultat
      Opskrift

      Gush" gosh

      Ingredienser:

      1 pund hamburger
      1 pund albuemakaroni
      2 kopper brun farin
      1 pose hakkede løg
      1 tsk tørret dild

      Rutevejledning:

      1. Brun hamburgeren.
      2. Tilsæt løg og steg indtil gennemsigtigt.
      3. Tilsæt brun farin og dild.
      4. Kog og afdryp pasta.
      5. Kombiner kød og pasta.

      En afbalanceret morgenmad

      Ingredienser:

      1 kop korn
      1 glas appelsinjuice
      1 kop mælk
      2 skiver toast

      Rutevejledning:

      1. Kombiner korn og mælk i en skål.
      2. Tilføj alle ingredienser til bordet.

      Resultatet er vist i figur 6.

      Figur 6. Problem med manglende mellemrum løst

      Grundlæggende om XPath

      Muligheden for at transformere data til den form, du ønsker det skal være i, kræver en forståelse af XML Route Language, eller XPath, som giver dig mulighed for at kontrollere, hvilke data der publiceres og/eller vises. Dette afsnit forklarer de grundlæggende begreber i XPath og viser, hvordan man skaber enkle udtryk.

      Hvad er XPath?

      Du har måske bemærket, at en vigtig del af, hvordan et typografiark fungerer, er muligheden for at vælge en bestemt del af et dokument. For eksempel, hvis du vil vise instruktioner, skal du vide, hvordan du refererer til dem. I XSLT henviser vi til information ved hjælp af XPath-udtryk.

      Et XPath-udtryk kan vælge en enkelt node eller et sæt noder eller returnere en enkelt værdi baseret på en eller flere noder i dokumentet. Indtil videre har vi beskæftiget os med meget simple XPath-udtryk, der vælger en eller flere noder, der går ned i en hierarkisk struktur. XPath giver flere måder at definere grupper af noder baseret på relationer, såsom forælder-barn eller forfader-barn. I denne tutorial vil vi udforske alle disse relationer, kaldet akser.

      Du vil også lære om nogle af XPaths mere kraftfulde funktioner og prædikater er grundlæggende betingede udsagn, der kan tilføjes til udtryk. For eksempel vil du i afsnittet Indstilling af kontekst se, hvordan du vælger alle opskriftselementer i et dokument; prædikater giver dig mulighed for kun at vælge et specifikt element baseret på specifikke kriterier.

      Endelig vil du lære om endnu mere kraftfulde funktioner, der gør dig i stand til at bruge mange af de typer logik, der bruges i procedureprogrammer.

      Lad os starte med at undersøge konteksten af ​​udtrykket.

      Opsætning af kontekst

      Det første skridt til at forstå XPath er at forstå, at de opnåede resultater i vid udstrækning bestemmes af den aktuelle kontekstknude. En kontekstknude kan opfattes som en slags "du er her"-tegn, hvorfra du kan bevæge dig i forskellige retninger i henhold til et XPath-udtryk. Overvej f.eks et simpelt bord stilarter i liste 14.

      Liste 14. Kontekst demonstration

      Der er et nyt element her - kopi af. Hvor value-of udlæser indholdet af et element, gør copy-of nøjagtigt, hvad dets navn siger og udlæser den faktiske node, som select-attributten refererer til.

      I dette tilfælde indeholder select-attributten et af de enklest mulige XPath-udtryk. En enkelt prik (.) er en reference til en given kontekstnode, som i et filsystem, når du vil henvise til "den aktuelle mappe, uanset hvad mappen er." Så hvis du laver denne konvertering, får du et resultat som fortegnelse 15.

      Liste 15. Enkleste konvertering
      Gush" gosh 1pund hamburger 1pund albue makaroni 2kopper brunt sukker 1taske hakkede løg 1teskefuld tørret dild Brun hamburgeren. Tilsæt løg og steg indtil gennemsigtigt. Tilsæt brun farin og dild. Kog og afdryp pasta. Kombiner kød og pasta. ...

      Du ser, at dette blot er en gentagelse af det samme dokument; dette skyldes, at kontekstknudepunktet, som angivet af matchskabelon-attributten, er dokumentroden eller /. Hvis du ændrer kontekstnoden, ændres outputtet. For eksempel kan du indstille kontekstnoden til den første opskrift (se liste 16).

      Liste 16. Flytning af en kontekstknude

      Nu, når du kører konverteringen, vil du se forskellen (se liste 17).

      Notering 17. Resultater
      Gush" gosh 1pund hamburger 1pund albue makaroni 2kopper brunt sukker 1taske hakkede løg 1teskefuld tørret dild Brun hamburgeren. Tilsæt løg og steg indtil gennemsigtigt. Tilsæt brun farin og dild. Kog og afdryp pasta. Kombiner kød og pasta. En afbalanceret morgenmad 1kop korn 1glas Appelsinjuice 1kop mælk 2skiver ristet brød Kombiner korn og mælk i en skål. Tilføj alle ingredienser til bordet.

      Siden vi flyttede kontekstknuden, ændrede outputtet sig. Dette er vigtigt, når du vil vælge en knude i forhold til en kontekstknude. For eksempel kan du kun vælge titlen på opskriften (se liste 18).

      Liste 18. Vælger kun overskriften

      Her vælger du et navneelement et niveau under den aktuelle kontekstknude, så resultatet bliver som liste 19.

      Notering 19. Resultater
      Gush" gosh En afbalanceret morgenmad

      Vi vil udforske at specificere noder efter nummer senere, men bemærk indtil videre, at vi kan flytte kontekstknuden ind i den anden opskrift (se liste 20).

      Liste 20. Flytning af kontekstknudepunktet igen

      (Ignorer den anden skabelon, den er der for at forhindre, at anden opskriftstekst vises.)

      Vi kan se, at den resulterende transformation viser denne ændring i kontekst (se liste 21).

      Notering 21. Resultater
      En afbalanceret morgenmad

      Hvad er akser til?

      Nu hvor vi ved, hvor vi starter fra, ville det være nyttigt at vide, hvor vi kan gå hen. Indtil videre har vi brugt meget simple XPath-udtryk, der ligner hierarki i et filsystem, men XPath giver meget mere funktionalitet. For eksempel har du indtil videre kun udvalgt børn, men du kan også søge efter forældrene til en bestemt node, såvel som dens børn eller forfædre.

      Lad os først tale om notationssystemet. Vi brugte en forenklet, forkortet form for at anmode om efterkommere. I "lang form" angives udtryk som child::name i stedet for ./name

      I begge tilfælde angiver du enhver node, der er en underordnet af kontekstknuden og også er et navneelement. Du kan også linke dem sammen som i det foregående tilfælde ved at bruge /child::recipes/child::recipe i stedet for /recipes/recipe .

      Efterkommere

      Du undrer dig måske over, hvorfor du bøvler med den lange form, når den korte form er så meget nemmere. Dette ville ikke være nødvendigt, hvis det eneste, du kunne gøre, var at vælge efterkommere. Denne notation kan dog også bruges til at vælge andre relationer. For eksempel vælger XPath-udtrykket descendant::instruction alle instruktionselementer, der er efterkommere af kontekstnoden, ikke kun underordnede elementer. Derudover kan du kombinere instruktioner. For eksempel kan du vælge alle instruktionerne i den anden opskrift: /recipes/recipe/descendant::instruction .

      En variation af underordnet akse er underordnet-eller-vare-selv-aksen, som vælger en given knude fra alle underordnede og også søger i selve kontekstknuden. For eksempel vælger udtrykket descendant-or-self::instructions alle instruktionsknuder i og under kontekstknuden. Den sædvanlige forkortelse for denne akse er den dobbelte skråstreg, //. Det betyder, at udtrykkene: /recipes/recipe//instructions og //instructions vælger alle instruktioner til henholdsvis den anden opskrift og alle instruktioner i dokumentet. Dette andet eksempel er meget udbredt og er nyttigt, når du blot ønsker at vælge alle elementer af en bestemt type i et dokument.

      Egenskaber

      Endnu en fælles opgave Det problem, du vil støde på, er behovet for at vælge en attribut for et specifikt element. For eksempel vil du måske vælge et recept-id for en bestemt opskrift. Udtrykket /recipes/recipe/attribute::recipeId vælger attributten recipeId for alle opskriftselementer. Denne akse har også en forkortet form: det samme udtryk kan skrives som følger: /recipes/recipe/@recipeId .

      Forældre

      Alt, hvad vi så før, transporterede os ned langs hierarkitræet, men det er også muligt at gå op ved at vælge forfaderen til en bestemt node. Lad os antage, at kontekstnoden var en af ​​instruktionerne, og du vil vise recept-id'et for den aktuelle opskrift. Du kan gøre det sådan her: ./parent::node()/parent::node()/@recipeId .

      Dette udtryk starter ved den aktuelle instruktionsknude og flytter derefter til den nodes forfader, instruktionselementet, og derefter til DET elements forfader, opskrift og derefter til den tilsvarende attribut. Du er måske mere bekendt med den forkortede form: ./../../@recipeId .

      Lad os nu se, hvordan nogle betingelser er sat.

      Mere avancerede XPath-funktioner

      I de fleste tilfælde er de allerede diskuterede teknikker tilstrækkelige. Der er dog ofte situationer, der kræver større selektivitet. Dette afsnit viser, hvordan man bruger prædikater til at vælge noder baseret på specifikke kriterier og introducerer nogle af de funktioner, der er indbygget i XPath.

      Brug af prædikater

      Ofte er det, der kræves, ikke en hvilken som helst node, men en specifik node valgt ud fra specifikke forhold. Du har set et eksempel før, hvor du brugte udtrykket /recipes/recipe//instructions. Dette er faktisk en stenografi af /recipes/recipe//instructions , hvilket betyder, at XPath-processoren skal gennemgå hvert opskriftselement (der er kun et sådant element, selvfølgelig) og for hvert opskriftselement gennemgå hvert opskriftselement. For hvert opskriftselement skal du kontrollere, om udtrykket position() = 2 er sandt. (Med andre ord, er denne anden opskrift på listen?) Hvis denne sætning, kaldet et prædikat, er sand, så bruger processoren den node og fortsætter og returnerer alle instruktioner.

      Der er mange ting, du kan gøre med prædikater. For eksempel kan du kun returnere opskrifter, der har navnet: /recipes/recipe . Dette udtryk tester blot, om der findes et navneelement, der er et underordnet opskriftselement. Du kan også søge efter specifikke værdier. For eksempel kan du kun returnere varer, der hedder "A balanced breakfast": //recipe .

      Husk, at prædikatet blot fortæller processoren, om den aktuelle node skal returneres, så i dette tilfælde returneres opskriftselementet, ikke navnet. Alternativt kan du bede processoren om kun at returnere navnet på den første opskrift ved at bruge et af disse to udtryk (se liste 22).

      Liste 22. Returnerer kun navnet på den første opskrift
      //opskrift[@opskriftId="1"]/navn //navn]

      I det første udtryk vælger vi først alle opskriftselementer og returnerer derefter kun det, der har elementattributten recipeId lig med 1. Når vi har fundet den node, flytter vi til dens underordnede node, som kaldes navn, og returnerer den. Det andet udtryk søger først efter alle navneelementer og vælger derefter kun det, hvis forælder har en attribut på 1. Uanset hvad, får du det samme output (se liste 23).

      Notering 23. Output
      Gush" gosh

      Funktioner

      XPath tilbyder også en række funktioner. Nogle af dem beskæftiger sig med noder selv, såsom dem, der leder efter en specifik position, nogle håndterer strenge, nogle, såsom summering, omhandler tal, nogle med booleske værdier.

      Node relaterede funktioner

      Node-relaterede funktioner hjælper for eksempel med at vælge en specifik node afhængigt af dens position. For eksempel kan du specifikt anmode om den seneste opskrift: //recipe. Dette udtryk vælger alle opskriftselementer og returnerer derefter kun det sidste. Du kan også bruge funktioner separat i stedet for at bruge dem som en del af et prædikat. For eksempel kan du specifikt anmode om at tælle elementerne i en opskrift: count(//recipe) .

      Du har allerede set position()-funktionen og hvordan den virker. Andre node-relaterede funktioner inkluderer id() , local-name() , namespace-uri() og name() .

      String funktioner

      De fleste strengfunktioner er designet til at behandle strenge i stedet for at teste dem, med undtagelse af funktionen contains(). Funktionen contains() viser, om en given streng er en del af en større helhed. Dette vil for eksempel tillade kun at returnere noder, der indeholder visse strenge såsom: //recipe.

      Dette udtryk returnerer et opskriftselement, der indeholder strengen "morgenmad" i dets navneelement.

      Funktionen substring() giver dig mulighed for at vælge et specifikt interval af tegn fra en streng. For eksempel returnerer udtrykket: substring(//recipe/name, 1, 5) A bal .

      Det første argument er den fulde streng, det andet er placeringen af ​​det første tegn, og det tredje er længden af ​​området.

      Andre strengfunktioner inkluderer concat() , substring-before() , substring-after() , starts-with() , og string-length() .

      Numeriske funktioner

      Numeriske funktioner inkluderer nummer()-funktionen, som konverterer en værdi til en numerisk værdi, så andre funktioner kan fungere på den. Numeriske funktioner inkluderer også: sum() , floor() , loft() og round() . For eksempel kan du finde summen af ​​alle receptId-værdier ved at bruge udtrykket: sum(//recipe/@recipeId) .

      Der er naturligvis ingen særlig grund til at foretage en sådan beregning, men det er enkelt numerisk værdi, givet som eksempel.

      Floor()-funktionen finder det største heltal, der er mindre end eller lig med den givne værdi, og loft()-funktionen finder det mindste heltal, der er større end eller lig med den givne værdi. Funktionen round() fungerer på den traditionelle måde - den runder (se oversigt 24).

      Liste 24. Resultater af numeriske funktioner
      floor(42.7) = 42 loft(42.7) = 43 runde(42.7) = 43

      booleske funktioner

      Boolske funktioner er mest nyttige, når du arbejder med betingede udtryk, hvilket vil blive diskuteret i afsnittet Betinget behandling. Den mest nyttige funktion er måske not(), som kan bruges til at bestemme, at en bestemt node ikke eksisterer. For eksempel returnerer //recipe hver opskrift, der indeholder strengen "morgenmad" i dens navneelement. Men hvad hvis du har brug for alle opskrifterne undtagen morgenmad? Du kan bruge udtrykket: //opskrift.

      Andre booleske funktioner inkluderer true() og false(), som returnerer konstanter, og boolean(), som konverterer en værdi til en boolean, så den kan bruges som en testværdi.

      Cyklus organisering og import

      Lad os se på to mere vigtige aspekter Brug af XSLT-typografiark: oprettelse af sløjfer og import af eksterne typografiark.

      Organisering af cyklusser

      Når du arbejder med XSLT, skal du vænne dig til, at det funktionelt sprog, ikke proceduremæssigt. Med andre ord har du normalt ingen eksplicit kontrol over den måde, den udfører de instruktioner, den får. Der er dog undtagelser. For eksempel er det muligt at organisere sløjfer og udføre betingede operationer. Lad os starte med cyklusser.

      I det foregående eksempel brugte vi XSLT-udtryk indbygget i udgivelsesskabelonen til at anvende styling på specifikke elementer. I nogle tilfælde fungerer dette glimrende. Men i situationer, hvor du har komplekse XML-filer eller komplekse krav, er det nogle gange lettere at få eksplicit adgang til oplysningerne (se liste 25).

      Liste 25. Direkte påføring af stilarter ved hjælp af loops

      Ingredienser:


      Rutevejledning:

      Sløjfestrukturen minder meget om den for hver struktur, som den er opkaldt efter. Ligesom sin navnebror bærer hver loop-instans den næste værdi af listen. I Java-programmering kan dette være den næste værdi i et array; her er det den næste node i samlingen af ​​noder, der returneres af XPath-udtrykket i select-attributten. Dette betyder, at når du først udfører den første løkke, er kontekstnoden det første ingredienselement. Dette giver dig mulighed for at vælge antal, enhed og mad efterkommere af dette element og tilføje dem til dokumentet på samme måde, som du gjorde tidligere ved at bruge skabelonen. Det er det samme med instruktioner, bortset fra at de bare udsendes direkte.

      Resultaterne er identiske med dem, der opnås ved udgivelse gennem skabeloner - næsten. Hvert mønster føjes til dokumentet som en individuel linje, men da vi skal behandle denne information som ét mønster, mister vi meget af det hvide mellemrum, vi så før (se figur 7).

      Figur 7. Resultater

      For nogle XML-applikationer betyder dette noget, men her bruger vi HTML, så det betyder ikke noget. Husk dog dette, når du beslutter dig for, hvilken metode du skal bruge.

      Aktivering og import af typografiark

      En anden variation af style sheets vedrører deres struktur. Indtil nu blev alle vores oplysninger gemt i et enkelt typografiark. I nogle tilfælde kan det dog være nyttigt at dele det op i separate typografiark. Denne modularitet kan gøre det lettere at vedligeholde, såvel som fleksibiliteten til at tillade, at forskellige style sheets kan bruges til forskellige formål. For eksempel kunne vi lave to forskellige stilark, hvoraf det ene vil blive brugt til ingredienser (se liste 26).

      Liste 26. Ingredienser.xsl-fil

      Du kan også oprette et separat typografiark for instruktioner (se oversigt 27).

      Liste 27. Instructions.xsl fil
    4. Disse skabeloner er identiske med skabelonerne fra det aktuelle typografiark. De kan føjes til stilarket gennem inklusion (se liste 28).

      Liste 28. Inklusive style sheets
      ...

      Ingredienser:

      Rutevejledning:

      Selvom vi har placeret typografiarkene her i samme mappe som hovedstilarket, er det ikke nødvendigt at gøre det: href-attributten kan indeholde enhver tilgængelig URL. Bemærk, at vi sender processoren for at lede efter skabeloner til ingredienserne og instruktionerne, som ikke er i denne fil. Men hvis du behandler typografiarket, er resultatet nøjagtigt det samme, som hvis skabelonerne var inkluderet direkte, snarere end gennem include-elementet (se figur 8).

      Figur 8. Resultater

      Inkluder-elementet giver det samme resultat, som hvis vi havde tilføjet indhold fra det tidspunkt. Semantisk er de identiske. På den anden side er der en anden måde at inkludere information på - import.

      XSLT giver dig mulighed for at importere et typografiark i begyndelsen af ​​en fil. Hvorfor til begyndelsen? Fordi formålet med at importere et typografiark er at kunne justere eventuelle skabeloner, der er en del af importen. For eksempel kan vi importere ingrediensskabelonen og tilpasse den (se liste 29).

      Liste 29. Import af et typografiark
      ... ...
    5. Her har vi faktisk erstattet en skabelon med to, som erstatter skabelonerne i det importerede stylesheet (se figur 9).

      Figur 9. Resultater

      Bemærk, at da hierarki afhænger af placering, kan det samme resultat opnås ved hjælp af inklusion. XSLT giver dig dog mulighed for at bruge prioritetsattributten til at angive prioriteten for skabeloner, når du behandler importer.

      XSLT-udvidelse

      Vi har set, hvordan man gør XSLT mere som programmering. Hvad med at tilføje egentlig programmering til det? Lad os tage et kig på at tilføje Java-funktionalitet til et XSLT-stylesheet.

      For det første skal det bemærkes, at selvom udvidelsesmekanismen er en del af XSLT-anbefalingerne, er implementeringen, der diskuteres her, specifik for Xalan XSLT-processoren. De grundlæggende ideer er stort set de samme for andre processorer, men du bliver nødt til at tjekke dokumentationen for detaljer.

      Udvidelseselementer

      Udvidelse af XSLT sker ved hjælp af forskellige teknikker. Den første er brugen af ​​forlængelseselementer. Udvidelseselementet er et element i et navneområde, der peger på en Java-klasse. Tag for eksempel et kig på følgende udvidelseselement (se liste 30).

      Liste 30. Brug af forlængelseselementet
      Opskrifter ...

      Vi har oprettet et navneområde, der svarer til klassen comp.backstop.RecipeScaler, som inkluderer en statisk metode kaldet scaleMessage (se oversigt 31).

      Liste 31. RecipeScaler klasse
      pakke com.backstop; public class RecipeScaler ( public static String scaleMessage (org.apache.xalan.extensions.XSLProcessorContext context, org.w3c.dom.Element thisElement)( return "Denne opskrift er blevet skaleret med en faktor på " + thisElement.getAttribute("servings" ) + "."; ) )

      Når processoren når elementet, ser den navneområdepræfikset scaler: og ved, at det er udpeget som præfikset for udvidelseselementet, og forstår dermed, hvilken klasse der er udpeget i navnerumsdefinitionen. Metoden, den kalder, svarer til elementets lokale navn, scaleMessage . Selve metoden modtager to argumenter, hvoraf vi faktisk bruger det ene. Kontekstparameteren refererer til processorkonteksten, som giver os mulighed for at se på de elementer, der er relateret til udvidelseselementet, men vi vil blot fokusere på selve udvidelseselementet. Da vi modtager dette element som en metodeparameter, kan vi udtrække værdierne af alle attributter, der er tilføjet til dette element, såsom serveringer i dette tilfælde. Teksten, der returneres af metoden, føjes til outputtet i stedet for udvidelseselementet.

      Det betyder, at hvis vi anvender et typografiark, får vi resultaterne vist i figur 10.

      Figur 10. Resultater af forlængelseselementet

      Udvidelseselementer kan være ret nyttige, selvom de kan være lidt vanskelige at bruge.

      udvidelsesfunktioner

      En anden måde at tilføje funktionalitet ved hjælp af typografiark er at bruge udvidelsesfunktioner, som er noget nemmere at implementere end udvidelseselementer. For eksempel kunne vi oprette en funktion, der multiplicerer antallet af ingredienser og antallet af portioner (se liste 32).

      Liste 32. scaleIngredient() metode
      pakke com.backstop; public class RecipeScaler ( public static String scaleMessage (org.apache.xalan.extensions.XSLProcessorContext context, org.w3c.dom.Element thisElement)( return "Denne opskrift er blevet skaleret med en faktor på " + thisElement.getAttribute("servings" ) + "."; ) public static int scaleIngredient(int servings, int original)( return (servings * original); ) )

      Tilføjelse af denne funktion til et typografiark er identisk med at tilføje et udvidelseselement, der allerede har et navneområdekort til klassen (se liste 33).

      Liste 33. Tilføjelse af udvidelsesfunktionen
      ...
      ...

      Bemærk, at funktionskaldet indeholder et navneområdepræfiks. Som før ser processoren præfikset og ved at foretage et opkald til RecipeScaler-klassen. Som følge heraf ganges antallet af ingredienser med to (se figur 11).

      Figur 11. Brug af forlængelsesfunktionen

      Selvom denne kode og det virker, det er svært at vedligeholde. Lad os se på, hvordan man gør support lettere.

      XSLT programmering

      Før vi afslutter, lad os se på to aspekter af XSLT, der giver nogle af de samme funktioner, som findes i almindelige programmeringssprog.

      XSLT-variabler

      Det er dejligt, at vi kan udføre en funktion, men det ender med at være en konstant gemt dybt i typografiarket. Ville det ikke være bedre at indstille variablerne i begyndelsen af ​​siden? Selvfølgelig ja (se liste 34).

      Liste 34. Indstilling af en variabel
      Opskrifter ...
      ...
      Figur 12. Brug af en variabel

      Bemærk, at ingredienserne blev ganget med antallet af portioner, som forventet. Men hvis du ser nærmere efter, vil du se, at udvidelseselementet opførte sig forkert, idet det forvekslede variablen med en streng i stedet for at bruge værdien af ​​selve variablen. Dette er ikke en fejl; specifikationen kræver ikke, at processoren skal gøre noget med attributværdier, før udvidelseselementet behandles. Derfor skal vi på en eller anden måde undgå dette problem.

      Betinget behandling

      Det første, vi kan gøre, er at bruge betinget behandling, så beskeden kun vises, når det er nødvendigt. Se f.eks. liste 35.

      Liste 35. Brug af if-elementet
      Opskrifter ...

      Indholdet af if-elementet angivet af testattributten skal være sandt. Hvis dette ikke er tilfældet, hvilket er hvad der skete i dette tilfælde, vil outputtet slet ikke vises (se figur 13).

      Figur 13. Resultater af if-klausulen

      Som skrevet giver sætningen ikke meget mening; hvis værdien er større end én, vises udvidelseselementet med værdien "3". Det er bedre at bruge flere valg (se liste 36).

      Liste 36. Vælg elementet
      Opskrifter Opskrifter er blevet skaleret med et ugyldigt tal. Opskrifter er blevet skaleret til flere portioner. ...

      I dette tilfælde har vi en kombination af if-then-else-elementer og case-klausuler fra traditionelle programmeringssprog. Vælg-elementet fungerer som en beholder, men når-elementet viser kun dets indhold, hvis dets testattribut er sandt. Endelig, hvis ingen af ​​når-elementerne er sande, viser processoren indholdet af det ellers element.

      Resultatet er som forventet (se figur 14).

      Figur 14. Resultat

      Nu kan du indstille displayet mere fleksibelt mere portioner, eller tilpasse sig andre forhold.

      Konklusion

      Opsummerende

      Denne guide tog dig fra en grundlæggende forståelse af XSLT-transformationer til oprettelsen af ​​ret komplekse typografiark. Du lærte først det grundlæggende i typografiark, derefter XPath-udtryk, et af grundlaget for XSLT. Den sidste del af denne tutorial så på nogle af de mere avancerede aspekter af XSLT-typografiark - variabler, betinget behandling og udvidelser. Som et resultat bør du nu have nok viden til at gøre næsten alt, hvad du skal gøre med XSLT-typografiark - eller i det mindste forstå, hvad du ellers skal finde ud af, hvis du løber ind i et problem.

      En alternativ introduktion til brug af XSL-transformationer i PHP ved hjælp af Sablotron.

      Dette materiale bør tages som en alternativ introduktion til at bruge XSLT med Sablotron i PHP.

      Begreberne XSL og XSLT ligger tæt på hinanden, og for begyndere kan de betragtes som synonymer. Detaljer om, hvad forskellene er, er beskrevet i XSL Transformations W3C-specifikationen.

      Enhver, der var interesseret i XSLT's muligheder, læste standardeksemplet fra manualen eller eksemplerne givet i artikler om XSLT på forskellige websteder. Et fungerende eksempel fra samme serie:

      Railroad Tycoon II Platinum økonomisk strategi PopTop software GUD. spil 2001 Grand Prix 4 bil simulator Geoff Crammond og Simergy Infogram underholdning 2002 "; $xslData = " Spil

      Spil

      Navn genre år Udvikler forlægger
      "; $xh = xslt_create(); $arguments = array("/_xml" => $xmlData, "/_xsl" => $xslData); $result = @xslt_process($xh, "arg:/_xml", " arg:/_xsl", NULL, $arguments); if ($result) print ($result); else (print ("Der var en fejl, der opstod i XSL-transformationen...n"); print ("tError number : " . xslt_errno($xh) . "n"); print ("tError string: " . xslt_error($xh) . "n"); exit; ) ?>

      Der er masser af lignende eksempler på internettet. Alle af dem viser godt, at XSL-transformation i php virker, men efter at have læst dem er det stadig uklart, hvorfor XSL er nødvendig, eller rettere modsat - hvorfor XSL ikke er nødvendig.

      "Virkelig," vil læseren tænke, "hvis dataene er i databasen, hvorfor så lave XML først og derefter konvertere det via XSL. HTML-skabelonklassen vil gøre dette lige så godt."

      Herefter mister den skuffede programmør fuldstændig interessen for XSL og betegner teknologien som "unødvendig nørd."

      I, kære læsere, er heldige at have fundet sådan en vidunderlig side som "php i detaljer". Her kan du læse om, hvordan XSL ikke kun kan konvertere XML til HTML, men også hvordan XSL kan gøre arbejdet med PHP-scripts nemmere.

      Begyndelse af arbejdet

      Ovenstående eksempel, selvom det er for simpelt, illustrerer godt, hvordan XSL-transformation udføres i PHP.

      For at denne kode skal fungere, skal du installere Sablotron XSLT-processoren. På en Windows-maskine gøres dette sådan:

      1. sæt iconv(-1.3).dll, expat.dll og sablot.dll i C:windowsSystem (alle filer er i standard php-distributionen)
      2. åbn C:windowsphp.ini og find extension_dir-parameteren i den. Hvis parameterværdien er "." eller noget som "./", ret det til f.eks. "f:usrlocalphpextension" (eller adressen på den mappe, hvor du har/vil have php udvidelser). Dette vil nu være mappen med php-udvidelser.
      3. læg filen php_xslt.dll (dette er til php version 4.2.x) eller php_sablot.dll (for version 4.0.x) i udvidelsesmappen
      4. i php.ini afkommenterer linjen extension=php_xslt.dll (4.2.x) eller extension=php_sablot.dll (4.0.x)

      Teori

      Brug af XSLT giver dig mulighed for at adskille arbejdet med formatering og præsentation af data fra PHP-scripts. Dette er ikke kun en reduktion i mængden af ​​kode, men også fjernelse af et stort antal logiske konstruktioner (hvis, ellers, switch), og derfor letter arbejdet med at skrive og fejlfinde programmer. Jeg tør godt sige, at enhver, der ikke har prøvet at arbejde med XSLT, ikke aner, hvor meget nemmere PHP-kodning vil være.

      Du skal dog ikke narre dig selv: Hvis du havde flere if ... else-konstruktioner i et PHP-script, vil de højst sandsynligt optræde i samme nummer i XSL-filen.

      Nu til eksemplerne.

      Udskriver lister

      Alle de komplikationer, der kommer fra behovet for at vise listen i en menneskelig læsbar form, overføres til skuldrene af XSL. Eksempel #2. En liste over artikler på webstedet med fremhævelse af den artikel, der læses nu, skiftende farver i linjerne og nummerering af listen.

      2002-05-30 Fange fejl i PHP Et levende projekt og et dødt blad Arbejder med MySQL. Del 7. Træer Manuel sortering i webgrænsefladen Sådan kommer du ud af det mellem en designer og en programmør Slap af dette er PHP

      ...

      ... #cccccc <

      Brugerdefineret opmærkning

      Når du oversætter et websted med tekster (som denne) til XML, er det naturligt at lave din egen artikelmarkering. I den vigtige beholder skal du for eksempel fremhæve meget vigtige steder og være i stand til at fremhæve dem ikke nødvendigvis med fed skrift, men måske med farve, CSS-stil. Eller skriv citater som citat tekst og være i stand til at ændre deres designstil sammen med webstedets design.

      Langsomt bevæger sig fremad fra det enkleste første eksempel, falder mange over dette problem og kan ikke finde en løsning. Når alt kommer til alt, hvis du vælger et afsnit i tagget Og for at lave en skabelon til det er der ved første øjekast tre måder at vise indholdet på:

      1. xsl:value-of tag viser tekst, men fjerner alle tags i afsnittet
      2. xsl:copy-of tag viser en kopi af alt indhold (uden mulighed for at anvende skabeloner til børn - interne tags) og selve containeren (hvilket ikke er særlig rart i HTML).
      3. til sidst anvender xsl:apply-templates skabelonerne til børnene, men springer teksten over

      Problemet virker håbløst, men der er en løsning. Jeg bruger "magiske" skabeloner, der viser både teksten og taggene i den med alle attributter og uden ændringer. Eksempel #3:

      Dette eksempel bruger magiske mønstre til at analysere vilkårlig markup. Dette undgår følgende klager: Folk, fortæl os venligst, vi er ikke lokale! Jeg kan ikke vise tags i tekst ved hjælp af value-of!


      Husk disse mønstre én gang for alle! Så kan du behandle nogen tekst Næsten enhver.

      Den første ting XSLT-processoren gør, når den kalder application-templates-sætningen, er at lede efter en skabelon for hvert element. Der er en skabelon for det stærke element, og det er i overensstemmelse med den, at sådanne elementer vil blive behandlet. Der er ingen skabelon til hyperlinket, så det vil blive vist, som det er. Du kan også tilføje en skabelon til XSL for links, som vil vise et billede ud for hvert tekstlink for at åbne det i et nyt vindue:

      * skabelonen bruger parameteren match="a[@href]" - denne skabelon vil kun blive anvendt på de link-tags, der har et href-felt og vil springe ankre over ().

      Ugyldig kode og

      Det tilsyneladende behov for at skrive gyldig XML-kode afskrækker også mange XSLT-neophytter. Okay, fra i morgen skriver vi kun gyldige artikler, heldigvis hjemme kan du tjekke om der er en XML-fejl i teksten - uoverensstemmende tag eller ugyldig token - vi vil håndtere dette på en eller anden måde. Men på en mindelig måde skal hele arkivet oversættes til gyldig kode! Og det tænkte jeg også, da muligheden bød sig for at redesigne siden i XML.

      Løsningen på problemet er ret enkel: Hvis du ikke vil have det, skal du ikke skrive det gyldigt. Skriv som du er vant til - uden anførselstegn i tag-attributter, brug simple
      Og så videre. Nok til at omslutte teksten i en beholder(eksempel nedenfor).

      Hvad angår situationen her, er der ikke noget nbsp-element i XML. Der er lt, gt, quot, men ikke nbsp (ret logisk - dette er en ikke-bremseplads, som vedrører formatering og blev opfundet til HTML). Derfor skal det deklareres i dokumentet eller kun bruges internt.

      Eksempel #4:

      Folk, bemærk venligst, vi er ikke selv lokale!


      Husk også disse mønstre!

      Meget behageligt! Der er ingen grund til at foretage større ændringer i arkivet. Du kan begynde at skrive gyldigt, men fortsæt tilfældigt. Eller du kan kombinere disse to tilgange. For at undgå at skrive CDATA-tagget ind i arkivfiler, lavede jeg en simpel konvertering vha regulære udtryk(Det er også vigtigt at huske, at et CDATA-tag ikke bør indeholde et andet).

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

      Cykler

      Lad os sige, at vi skal lave en formular til redigering af en artikel, inklusive dens dato. For at lette brugen skal du lave tre drop-down lister (herefter benævnt "twists") - dato fra 1 til 31, måned, år. Den første løsning, der kommer til at tænke på, er at lave HTML-koden for spinnere i php, indsætte den i XML i en CDATA-beholder og derefter udskrive den til XSL med parameteren disable-output-escaping="yes".

      Faktisk kan XSLT også gøre det. Bare indsæt i XML data dato, månedsnummer og år. Spinnerne kan trækkes direkte i XSLT.

      Lad os skrive en skabelon, der ikke er beregnet til noget dokumentelement. Den kaldes af xsl:call-template kommandoen og modtager to parametre: tællerværdien og maksimum. Først vil den udlæse de data, vi har brug for med tællerværdien, derefter kalder den sig selv med parametrene maksimum og tælleren øget med 1. Eksempel #5:

      februar marts April Kan juni juli august september oktober november december

      ... 7 10 2002

      ... ...

      Som hjemmearbejde efterlader jeg dig med en skabelon til at vise et twist med året.

      Anmærkning: Diskuterer kodegenerering ved hjælp af XSLT-transformationer. XSLT-syntaksen, funktionerne ved anvendelse af transformationer samt udførelse af operationer såsom filtrering, sortering og betinget valg i skabeloner studeres. Udførelse af transformation programmatisk i C#. Fordele og ulemper ved teknologi.

      XSLT Transformation Language

      I den anden forelæsning så vi allerede på et eksempel ved hjælp af XSLT. I dette foredrag vil vi se nærmere på denne teknologi. XSL (eXtensible Stylesheet Language) står for Extensible Style Language, og er et sprog til at skabe styles til XML-dokumenter. XSLT(XSL-transformationer) er XSL-transformationssproget og er en del af det. XSLT-stilen er designet til at transformere den hierarkiske struktur og formatet af et XML-dokument. Resultaterne af konverteringen kan være en XML-fil, en tekstfil, programkode, en HTML-fil, en PDF-fil og så videre. Dette sprog giver kraftfulde muligheder for at manipulere data, information og tekst i en hierarkisk form.

      Og det er præcis, hvad der skal til for at generere kode. Brug af XSLT kan i høj grad hjælpe kodegenerering. Derudover giver det et praktisk alternativ til T4 skabelonteknologi.

      XSLT er udviklet af et konsortium W3C (World Wide Web Consortium). Den første version af sproget, XSLT 1.0, blev en anbefaling den 16. november 1999, og XSLT 2.0 blev en anbefaling den 23. januar 2007. Begge versioner bruges ret aktivt, og i dette foredrag vil vi se på den grundlæggende funktionalitet, der er fælles for dem. Det betyder, at vi primært vil overveje den første version. Vi vil også nævne nogle kommandoer fra den anden version.

      Sådan fungerer XSLT

      XSLT-modellen inkluderer følgende dele:

      • XML-dokumenter,
      • XSLT stilarter,
      • XSLT processor,
      • output dokumenter.

      XML dokumenter er inputdata, der skal konverteres til andre dokumenter. Dokument XSLT-stil er et veludformet XML-dokument og indeholder et sæt regler for udførelse af transformationen. Med andre ord er et stildokument en skabelon.

      XSLT processor er et program, der accepterer XML-dokumenter og XSLT-stile som input. Det udfører transformation, det vil sige at anvende et sæt regler i XSLT-stile til XML-dokumenter. Resultatet af dette arbejde er output dokumenter.

      XSLT-processorer har mange implementeringer og er indbygget i mange browsere som Internet Explorer, Firefox, Mozilla, Opera og andre. Internet Explorer bruger MSXML-værktøjet udviklet af Microsoft. XSLT-processor er indbygget i Internet Explorer fra version 4.5. Det genererede output af eksemplerne i denne forelæsning kan ses ved at åbne XML-filerne i en af ​​browserne. I slutningen af ​​foredraget vil vi se på mulighederne for at lancere transformationen programmatisk ved at bruge de passende programmeringssprogsklasser.

      XPath

      En anden del af XSL-teknologien er sproget XPath, designet til at få adgang til noder i et XML-dokument ved at angive stier og udtryk. Xpath-sproget bruges i stilfiler til at navigere i XML-dokumenter og identificere dele af XML-kildedokumentet, der matcher et eller flere foruddefinerede mønstre. Når et match er fundet, anvender XSLT-processoren de relevante regler fra stilfilen til den og transformerer den til en del af det resulterende dokument. XSLT-stilfiler gør stor brug af XPath-udtryk.

      Brug af XSLT

      XSLT-sproget består af mange instruktioner skrevet som tags. Navnet på hver instruktion begynder normalt med tegnene xsl. For at udføre transformationen skal XSLT-stildokumentet være et gyldigt XML-dokument.

      For at transformere et XML-dokument skal du tilføje en sætning, der ligner følgende i begyndelsen af ​​dokumentet:

      Et XSL stylesheet indeholder typisk mange elementer, hvoraf det vigtigste er elementet xsl:stylesheet. Det er ham, der angiver, at denne XML-fil er en stilfil. Ud over det kan det f.eks. indeholde andre elementer xsl:skabelon, xsl:værdi-af. XML-dokumentet og stilfilen sendes til XSLT-processoren, som behandler disse filer, udfører transformationen og udsender resultatet af transformationen.

      Nedenfor er et XML-dokument, der indeholder en liste over programmeringssprog.

      C# Visual Basic Delphi Prolog Eksempel 5.1. Languages.xml fil

      Du skal udskrive denne liste i HTML-format. Til dette formål bruger vi instruktionerne xsl :for-hver, som vil anvende en del af skabelonen på dokumentsektioner, hvis navne er angivet i select-attributten. I vores tilfælde vil vi angive select="languages/language" .

      Stilfilen der vil blive brugt er:

      Mine yndlingssprog:

      -

      Eksempel 5.2. Filen languages.xsl

      Skabelon indeni xsl :for-hver udskriver indholdet af hvert sprogelement fra sprog. Til dette formål bruges instruktionen xsl:værdi-af og den angivne attribut select="." . Det betyder, at processoren skal vælge tekstindholdet i det aktuelle element i dokumentet. Ud over at vise indhold kan du angive navnene på specifikke tags samt attributter for at vælge de værdier, der er gemt i dem. Eksempler vil blive diskuteret nedenfor.

      Lad os åbne XML-filen via Internet Explorer eller en anden browser. Følgende tekst vil blive vist:

      Mine yndlingssprog:

      • Visual Basic
      • Delphi
      • Prolog

      Et af de vigtigste elementer i stil er xsl:skabelon. Tjener til at definere en genanvendelig skabelon og indeholder de regler, som XML-dokumentet vil blive transformeret efter. Match-attributten indeholder et udtryk til at vælge noder, som skabelonen vil blive anvendt på. En navneattribut kan også være til stede. I dette tilfælde er det muligt at kalde en skabelon ved navn med en instruktion xsl:apply-templates.

      Brug instruktionen for at gentage outputtet af skabelonen for hvert element i dokumentet xsl :for-hver. Mønsteret udføres for hvert element, der matcher den betingelse, der er angivet i select-attributten.

      Instruktioner xsl:værdi-af tjener til at evaluere udtrykket skrevet i select-attributten og derefter vise resultatet på det sted, hvor selve elementet er placeret.

      Filtrering

      Vi overvejede det tilfælde, hvor værdierne for hver node læses. Der er dog ofte behov for kun at vælge en del af dataene, det vil sige, at de skal filtreres. XSLT-skabeloner understøtter to filtreringsmetoder.

      En af dem bruger udsagnets select-attribut xsl :for-hver, og den anden er at anvende elementets match-attribut xsl:skabelon. Vi vil se på at bruge match senere, men indtil videre ser vi på select .

      Lad os ændre datafilen lidt: Tilføj en attribut høj, der angiver, om sproget på vores liste er et sprog på højt niveau. Vi vil også udvide listen over sprog.

      C# Visual Basic Delphi Prolog Monter Java Perl Eksempel 5.3. Filsprog4.xml

      Bemærk, at værdien falsk for attributten høj kun værd for værdien "Assembler" . Lad os ændre stilarkfilen lidt:

      Sprog på højt niveau:

      -
      Eksempel 5.4. Filsprog4.xsl

      I afsnittet [@ high="true"] vi angiver, at kun de dokumentnoder, der har attributten høj har værdien "true". @-tegnet er et symbol, der angiver, at det er efterfulgt af et attributnavn.

      Lad os se på resultatet:

      Sprog på højt niveau:

      • Visual Basic
      • Delphi
      • Prolog

      Som du kan se, vises værdien "Assembler" ikke på listen over sprog, det vil sige, at XSLT-processoren filtrerede dataene i henhold til de angivne betingelser.

      Sortering

      Ud over filtrering er en anden almindeligt anvendt operation i kodegenerering sortering. Udsagnets rækkefølge-attribut xsl :for-hver tjener til at sortere resultatet for at angive rækkefølgen af ​​passage af dokumentknudepunkter, når der udføres en transformation. De felter, der skal sorteres, er opført adskilt af semikolon og har også "+" eller "-"-tegn foran deres navne, hvilket indikerer sortering i stigende eller faldende rækkefølge.

      Lad os overveje en let ændret version af dokumentet - i stedet for attributten høj vi vil bruge niveauelementet, som tager værdier høj eller lav. Og vi skriver navnet på sproget i navneelementet.

      C# høj Visual Basic høj Delphi høj Prolog høj Monter lav Java høj Perl høj Eksempel 5.5. Filsprog6.xml

      I det følgende stylesheet for instruktioner xsl :for-hver anvende orden-efter attributten med værdien +navn , hvor plustegnet betyder, at du skal sortere i stigende rækkefølge.

      Sprog på højt niveau:

      -
      Eksempel 5.6. Filsprog6.xsl

      I select-attributten filtrerer vi efter værdien af ​​niveauelementet. Også i erklæringens select-attribut

      Der er gået mindre end tre år, siden jeg havde den idé, at det var tid til at lære XSLT -))). Ideen var født, men PHP 4 var stadig installeret overalt, og Salbotron var grusom, hvilket mildt sagt ikke var særlig produktivt. Og det var sjældent, at nogen browser kunne prale af at understøtte netop denne XSLT. Af disse grunde udsatte jeg studiet af en sådan lovende retning til bedre tider. I øjeblikket kan vi roligt sige, at disse tider er kommet, da PHP 5 er blevet frigivet med XSLT-understøttelse og en anstændig objektmodel, og alle topbrowsere selv håndterer selvsikkert transformationer, serverer blot XML. :)

      • http://w3c.org - udvalg for udvikling og fremme af World Wide Web Internet-standarder. I øjeblikket er det den primære kilde til næsten alle web-orienterede standarder og anbefalinger.
      • http://www.w3.org/TR/xml - Extensible Markup Language specifikation XML, som er grundlaget for det moderne web. I skrivende stund er den femte udgave, version 1.0, tilgængelig, samt den anden udgave, version 1.1.
      • http://www.w3.org/TR/xml-names - brugsspecifikation navnerum i XML.
      • http://www.w3.org/TR/xpath - specifikation for brug af et sprog til at søge i dele af et XML-dokument XPath.
      • http://www.w3.org/TR/xsl/ - udvidet stilsprogspecifikation XSL.
      • http://www.w3.org/TR/xslt - tXSLT.
      • http://validator.w3.org/ - validator HTML.
      • http://www.w3.org/TR/xhtml1/ - specifikation XHTML1.0.

      Oversættelser til russisk:

      • http://www.rol.ru/news/it/helpdesk/xml01.htm - Extensible Markup Language XML1.0(anden version). /Radik Usmanov/
      • http://www.rol.ru/news/it/helpdesk/xnamsps.htm - Navneområder i XML. /Radik Usmanov/
      • http://www.rol.ru/news/it/helpdesk/xpath01.htm - XML sprog Sti( XPath). /Radik Usmanov/
      • http://www.rol.ru/news/it/helpdesk/xslt01.htm - Transformationssprog XSL (XSLT). /Radik Usmanov/

      For bedre at forstå, hvad der foregår, anbefaler jeg at læse specifikationerne i følgende rækkefølge:

      1. XML(dette er grundlaget!)
      2. navnerum(mekanisme til heterogen XML-kode i én fil)
      3. XPath(sprog til at vælge elementer fra strukturtræet)
      4. XSLT(konverteringer)
      5. XHTML(hvad du skal stræbe efter)

      De, der er særligt nysgerrige, kan også være opmærksomme på det udvidede stilsprog XSL.

      2. Gyldig XHTML

      Hvad er gyldig XHTML? Først og fremmest er det et XML-dokument, der skal være i overensstemmelse med XML-specifikationen. For det andet er det en næsten almindelig HTML-side, som alle er vant til.

      Hvorfor er XHTML nødvendig? Rent af kompatibilitets- og cross-browser årsager. En side i XHTML vil være mere tilbøjelig til at blive vist korrekt i populære browsere end almindelig HTML.

      For den gennemsnitlige sidenitter bør sætningen XML-dokument betyde følgende:

      1. Dokumentet indeholder en XML-dokumenterklæring helt i starten af ​​siden:
      2. Dokumentet indeholder ét rodelement, som indeholder alle de andre.
      3. Alle elementer (tags) skal have en afsluttende del (
        , ).
      4. Attributter har altid en betydning, som skal angives i anførselstegn (enkelt eller dobbelt). For eksempel, "radio" disabled="deaktiveret" /> .
      5. Kontrolkarakterer & ,< и >bør altid bære en forklædning. For eksempel, "?a=1&b=2" >&. Den eneste undtagelse er, inden for hvilke specialtegn ikke behøver at være maskeret.

      Også XHTML selv forpligter følgende betingelser til at være opfyldt:

      1. Dokumentet skal angive det navneområde, inden for hvilket HTML-elementer vil blive brugt.
      2. Dokumentet skal erklære en DOCTYPE før rodelementet og angive en af ​​XHTML-typerne og den tilsvarende DTD i den.

      Eksempel på et simpelt XHTML1.0-dokument:

      Og så om alt i orden.

        En erklæring om et XML-dokument, der specificerer dets version og kodning.

        Erklæring af navneområde og anvendt sprog.

      Tre versioner af XHTML1.0 er designet til bedre bagudkompatibilitet:

      • Strenge - giver den største overholdelse af W3C-anbefalinger fra browseres side. Men selve HTML-koden skal følge disse retningslinjer.
      • Transitional er et mindre strikt match, der får browseren til at opføre sig, som om det var et almindeligt HTML-dokument.
      • Frameset - giver dig mulighed for at bruge rammer.

      XHTML1.1 er stort set det samme som XHTML1.0 Strict og er beregnet til at erstatte andre versioner af XHTML1.0. Sammenlignet med XHTML1.0 Strict har den dog en række forskelle:

      1. Lang-attributten er blevet fjernet, dens rolle spilles af xml:lang . (Modul [ XHTMLMOD ])
      2. For a og map-elementerne skal du bruge id-attributten i stedet for name-attributten. (Modul [ XHTMLMOD ])
      3. Et sæt rubinelementer er tilgængeligt. (Modul [RUBY])

      Så hvis du vil have den bedste cross-browser-kompatibilitet og W3C-kompatibilitet, så er XHTML1.1 det!

      Af disse grunde vil resultatet af mine transformationer være nøjagtigt XHTML1.1.

      3. XSLT-transformationer

      Hvad er XSLT? Det er et XML-dokumenttransformationssprog, der blev udviklet som en del af Extended Stylesheet Language (XSL).

      Hvorfor er XSLT nødvendig? Det giver dig mulighed for at implementere et skema, hvor dataene gemmes separat, og dets præsentation er separat. Det vil sige, at et XML-dokument transformeres ved hjælp af et andet XML-dokument (den XSL, der indeholder XSLT-skabelonerne) til et endeligt dokument. Outputtet kan være XML, HTML eller Tekstdokument ethvert format.

      For at bruge XSLT-transformationer skal du først generere den korrekte XSL-stil og forbinde den til XML-filen.

      Et gyldigt XSL-dokument er et XML-dokument, der har angivet xsl-navneområdet og har et stilarksrodelement. I det enkleste tilfælde kan stilen se sådan ud:

      Denne stil indeholder ingen eksplicitte definitioner af skabeloner eller andre XSL-elementer. Det kan dog allerede bruges. For at se resultatet skal du bare generere et vilkårligt XML-dokument og vedhæfte denne stil til det:

      Linjen er ansvarlig for at forbinde stilen:

      I dette tilfælde vil kodningen af ​​resultatet være UTF-8, på trods af at kildedokumentet blev genereret i windows-1251. Desværre tillader browsere dig normalt ikke at se koden i det resulterende dokument, men PHP5s XSLT-modul gør det muligt at overføre den resulterende kode til en variabel, der kan gemmes i en fil. Derfor vil jeg ved hjælp af PHP give kildekoden til det resulterende dokument:

      Denne kode er ikke et gyldigt XML-dokument, meget mindre XHTML1.1. For at danne påkrævet kode, vil jeg komplicere den originale XSL-stil og tilføje de nødvendige skabeloner og transformationer der. I dette tilfælde forbliver det originale XML-dokument uændret.

      Som et eksempel vil jeg give en XSL-stil, der hvornår XSLT hjælp vil vise en liste over attributter for XML-kildedokumentet med deres værdier, mens gyldig XHTML1.1 vil blive genereret. Så stilen:

      Fil - test.xsl
      "/" > "http://www.w3.org/1999/xhtml" xml:lang="da" > Min første XSLT
      Min liste:
      1. baggrundsfarve: #eee;

      For at forstå, hvordan det virker, vil jeg beskrive hver handling separat:

        XML-dokumenterklæring:

        En påkrævet attribut er at definere xsl-navneområdet via attributten xmlns:xsl= "http://www.w3.org/1999/XSL/Transform".

        Det næste trin i stilarkets rodelement er at erklære, hvordan det resulterende dokument skal dannes:

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

        Hovedegenskaber:

        • metode= "xml"- dokumentoutputmetode. Det resulterende dokument vil være i XML-format.
        • kodning= "windows-1251"- kodning af det resulterende dokument.
        • udelad-xml-declaration="nej"- om den oprindelige erklæring af XML-dokumentet skal springes over eller ej (). Kan have værdien "ja" eller "nej" (kun relevant for html).
        • indrykning= "Ja"- danner fordybninger i henhold til niveauet af rede. Kan være "ja" eller "nej".
        • medietype= "tekst/xml"- MIME-typen for det resulterende dokument (bruges kun til html-outputmetoden).
        • doctype-public="-//W3C//DTD XHTML 1.1//DA"- type af det resulterende dokument (DOCTYPE)
        • doctype-system= "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"- link til DTD

        Hvis outputmetoden er erklæret som html, vil værdierne for kodnings- og medietypeattributterne blive erstattet i sidetitlen ( ...) via et metatag.

        Hovedskabelonerklæring:

        Attribut xmlns= "http://www.w3.org/1999/xhtml" angiver det xhtml-navneområde, der som standard vil blive anvendt på dette element og alle underordnede elementer, der ikke har det eksplicit angivet.

        xml:lang= attribut "ru" angiver det sprog, som siden (fremtiden) er genereret på.

      Denne del af stilen var nødvendig for at danne attributterne for gyldig XHTML1.1-kode.

      Nu til XSLT-transformationer:

        Indsættelse af almindelig tekst:

        Select-attributten accepterer et XPath-udtryk, baseret på hvilket det foretager et valg. Hvis valget returnerede en liste over noder, begynder løkken at køre for hvert element.

        I dette tilfælde vil valget returnere en liste over attributter for denne (rod) og alle underordnede elementer.

        Kontrol af tilstanden:

        I dette tilfælde, hvis elementets position er lige (bestemt af det højere if), så elementets stil

      1. vil blive registreret grå farve baggrund.

        Viser elementværdier:

        Denne kode indsætter i det overordnede element en streng kompileret ud fra navnet på det aktuelle element og dets værdi. Indholdet af select-attributten matcher XPath.

        Parser udvikler: "system-property("xsl:leverandør-url")" /> "system-property("xsl:leverandør-url")" /> "system-egenskab("xsl:leverandør")" />

      Resultatet af behandlingen af ​​denne stil (test.xsl) vil være følgende kode:

      Resultat - kildekode
      "1.0" encoding="windows-1251"?> "http://www.w3.org/1999/xhtml" xml:lang="da" > Min første XSLT
      Min liste:
      1. attr1 = Hovedattribut
      2. style=" baggrundsfarve : #eee ;" > attr1 = min egenskab1
      3. attr2 = min egenskab2
      4. style=" baggrundsfarve : #eee ;" > attr5 = Gratis attribut
      Parser udvikler: libxslt

      Denne kode overholder XHTML1.1-standarden og blev genereret fra det originale XML-dokument. For at kontrollere, kan du bruge W3C-validatoren, som er placeret på http://validator.w3.org/.

      I browseren ser denne kode nogenlunde sådan ud:

      // Udskriv HTML-kode som tekst header("Content-Type: text/plain;" ); // Kilde XML-dokumentobjekt$xml = nyt DOMDocument(null , "windows-1251" ); $xml ->load("test.xml" ); // Stilobjekt $xsl = nyt DOMDocument(null , "windows-1251" ); $xsl ->load("test.xsl" ); // Oprettelse af en parser$proc = ny XSLTProcessor(); // Forbindelse af stilen til parseren$proc ->importStylesheet($xsl ); // Behandling af det originale XML-dokument af parseren$parsed = $proc ->transformToXml($xml ); // Udskriv den resulterende kode echo $parsed ; // Skriv en fil med den resulterende kode file_put_contents("parsed.html" , $parsed );?>
      IE 6 FireFox 3 Opera 9.02

      Yderligere oplysninger om brug af XSLT i PHP5 kan findes på http://ru2.php.net/manual/ru/book.xslt.php.

      Tænker højt

      “Kammerater, vi står på kanten af ​​en kæmpe afgrund! Og jeg foreslår at tage et stort, afgørende skridt fremad!”

      2019 Anton Pribora. Når du kopierer materialer fra webstedet, bedes du angive et link til kilden.