XSLT

XSLT ( e X tensible S tylesheet Sprogtransformationer ) er et sprog til transformation af XML - dokumenter. XSLT-specifikationen er en del af XSL og er en W3C- anbefaling .

Anvendelse af et XSLT -typografiark , der består af et sæt skabeloner , på et XML-dokument ( kildetræ ) producerer et resulterende træ , der kan serialiseres som et XML-dokument, XHTML - dokument (kun XSLT 2.0), HTML - dokument eller almindelig tekstfil . Reglerne for at vælge (og delvist transformere) data fra kildetræet er skrevet i XPath -forespørgselssproget .

XSLT har mange forskellige anvendelser, primært inden for webprogrammering og rapportering. En af opgaverne, som XSLT-sproget løser, er adskillelse af data fra deres præsentation, som en del af det generelle MVC ( Model-view-controller ) paradigme .  En anden almindelig opgave er at konvertere XML-dokumenter fra et XML-skema til et andet.

Historie

XSLT er udviklet af XSL Working Group fra World Wide Web Consortium .

Version 1.0 blev godkendt som anbefaling den 16. november 1999 . Efter udgivelsen af ​​den første version begyndte arbejdet med version 1.1, men i 2001 blev det afbrudt, og XSL -arbejdsgruppen sluttede sig til XQuery -arbejdsgruppen for at samarbejde om XPath 2.0 . Efterfølgende fungerede XPath 2.0 som grundlag for udviklingen af ​​XSLT version 2.0.

Version 2.0 blev godkendt som anbefaling den 24. januar 2007 .

Version 3.0 blev godkendt den 8. juni 2017.

Processen med at udføre en XSLT-transformation

I processen med at udføre XSLT-transformationer er følgende involveret:

I det enkleste tilfælde tager en XSLT-processor to dokumenter som input, et input - XML -dokument og et XSLT-typografiark og opretter et outputdokument baseret på dem.

XSLT og XPath

XSLT bruger XPath -sproget til at få adgang til individuelle dele af et input-XML-dokument og til at organisere beregninger.

XSLT 1.0 bruger XPath 1.0 og XSLT 2.0 bruger XPath 2.0.

Eksempler

Transformation fra XML til XSLT

Kilde XML- dokument:

<?xml version="1.0"?> <persons> <person username= "MP123456" > <name> Ivan </name> <surname> Ivanov </surname> </person> <person username= "PK123456" > < navn> Peter </navn> <efternavn> Petrov </efternavn> </person> </persons>

XSLT-stilark (transformationer):

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

Resulterende XML-dokument:

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

Transformation fra XML til XHTML

Indtast XML-dokument:

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="my-style.xsl"?> <domæner> <sun.com ownedBy= "Sun Microsystems Inc." > <vært> www <brug> World Wide Web-sted </use> </host> <host> java <brug> Java info </use> </host> </sun.com> <w3.org ownedBy= "The World Wide Web Consortium" > <host> www <brug> World Wide Web-sted </use> </host> <host> validator <use> webudviklere, der ønsker at gøre det rigtigt </use> </host> </w3.org> </domains>

Stil til XSLT-transformation:

<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" xmlns= "http://www.w3.org/1999/xhtml" > <xsl :outputmetode = "xml" indent= "yes" doctype-public= "-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system= "http://www.w3.org/TR/xhtml1/ DTD/xhtml1-strict.dtd" /> <!--XHTML document outline--> <xsl:template match= "/" > <html xmlns= "http://www.w3.org/1999/xhtml" xml:lang= "da" lang= "da " > <head> <meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" /> <title> test1 </title> <style type= "text/css" > h1 { polstring: 10px; polstringsbredde: 100 % baggrundsfarve: sølv } td, th {bredde: 40%; kant: 1px massivt sølv; polstring: 10px td:first-child, th:first-child { width: 20% } tabel {bredde: 650px} </style> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <!--Tabeloverskrifter og disposition--> <xsl:template match= "domains/*" > <h1><xsl:value-of select= "@ownedBy" /></h1> <p> Følgende vært navne er i øjeblikket i brug på <strong><xsl:value-of select= "local-name(.)" /></strong> </p> <tabel> <tr><th> Værtsnavn </th> <th> URL </th><th> Brugt af </th></tr> <xsl:apply-templates/> </table> </xsl:template> <!--Tabelrække og to første kolonner--> <xsl:skabelon match= "host" > <!--Opret variabel for 'url', da den bruges to gange--> <xsl:variable name= "url" select= "normalize-space(concat('http://', ​​​​normalize-space(node()), '.', local-name(..)))" /> <tr> <td>< xsl: value-of select= "node()" /></td> <td><a href= "{$url}" ><xsl:value-of select= "$url" /></a> </ td> <xsl:apply-templates select= "brug" /> </tr> </xsl:skabelon> <!--'Used by' column--> <xsl:template match= "use" > <td><xsl:value-of select= "." /></td> </xsl:skabelon> </xsl:stylesheet>

XHTML'en, vi får som output (mellemrum er tilføjet for klarhedens skyld):

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns= "http://www.w3.org/1999/xhtml" lang= "da" xml:lang= "da" > <head> <meta content= "text/html;charset=UTF-8" http-equiv= "Content-Type" /> <title> test1 </title> <style type= "text/css" > h1 { polstring: 10px; polstringsbredde: 100 % baggrundsfarve: sølv } td, th {bredde: 40%; kant: 1px massivt sølv; polstring: 10px td:first-child, th:first-child { width: 20% } tabel {bredde: 650px} </style> </head> <body> <h1> Sun Microsystems Inc. </h1> <p> Følgende værtsnavne er i øjeblikket i brug på <strong> sun.com </strong></p> <table> <tr> <th> Værtsnavn </th> <th> URL < /th> <th> Brugt af </th> </tr> <tr> <td> www </td> <td><a href="http://www.sun.com" > http :// www.sun.com </a></td> <td> World Wide Web-sted </td> </tr> <tr> <td> java </td> <td><a href= "http:/ /java.sun.com" > http://java.sun.com </a></td> <td> Java info </td> </tr> </table> <h1> World Wide Web Consortium </h1> <p> Følgende værtsnavne er i øjeblikket i brug på <strong> w3.org </strong></p> <table> <tr> <th> Værtsnavn < /th> <th> URL </th> <th> Brugt af </th> </tr> <tr> <td> www </td> <td><a href= "http://www.w3 .org" > http://www.w3.org </a></td> <td> World Wide Web-sted </td> </tr> <tr> <td> validator </td> <td> <a href="http://validator.w3.org" > http://validator.w3.org </a> </td> <td> webudviklere, der ønsker at få det rigtigt </td> </ tr> </table> </body> </html>

Outputtet er ikke nødvendigvis korrekt XHTML. XSLT 2.0 løste dette ved at tilføje 'XHTML'-outputmetoden sammen med den 'HTML', der allerede eksisterede i XSLT 1.0.

Anvendelse af skabelonregler

XSLT-sproget er deklarativt, ikke proceduremæssigt. I stedet for at definere en sekvens af eksekverbare sætninger, definerer dette sprog de regler, der vil blive anvendt under konverteringen. Selve transformationen udføres efter en fast algoritme.

Først og fremmest analyserer XSLT-processoren transformationsfilen og bygger et XML-træ af inputfilen. Den leder derefter efter den skabelon, der bedst matcher rodnoden, og evaluerer indholdet af den fundne skabelon. Instruktionerne i hver skabelon kan enten direkte fortælle XSLT-processoren "opret dette tag her" eller sige "behandle andre noder med den samme regel som rodnoden".

Denne algoritme, som er noget ikke-triviel, er beskrevet mere detaljeret nedenfor, selvom mange af dens eksotiske detaljer er udeladt.

Hver XSLT-processor skal udføre følgende trin for at forberede transformationen.

  1. Læs et XSLT-typografiark med en XML-parser og oversæt dets indhold til et træ af noder ( typografiarktræ ) i henhold til XPath-datamodellen. Syntaksfejl "kompileringstid" detekteres på dette trin. Stylesheets kan være modulære, så alle inkluderinger (udsagn xsl:include, xsl:import) vil også blive behandlet på dette trin for at kombinere alle skabelonregler og andre elementer fra andre typografiark til et enkelt typografiarktræ.
  2. Læs input-XML-data ved hjælp af en XML-parser, oversæt dets indhold til et træ af noder ( kildetræ ) i henhold til XPath-datamodellen. Et XML-dokument kan referere til andre XML-kilder ved hjælp af funktionskald document(). Disse opkald håndteres normalt under kørsel, da deres placering kan beregnes, og de tilsvarende funktionskald måske slet ikke forekommer. (Eksemplet ovenfor linker ikke til andre dokumenter.)
  3. Fjern tomme noder fra XSLT-typografiarket, undtagen dem, der er børn af xsl:text. Dette eliminerer udseendet af "ekstra" mellemrum.
  4. Fjern tomme tekstknuder fra kildetræet, hvis instruktioner xsl:strip-spaceer til stede i kildedokumentet. Dette eliminerer udseendet af "ekstra" mellemrum. (Eksemplet ovenfor bruger ikke denne funktion.)
  5. Udfyld XSLT-træet med tre regler, der giver standardadfærd for alle nodetyper, der kan opstå under behandling. Den første regel er at håndtere rodnoden ; den instruerer processoren i at behandle hvert underordnede af rodknudepunktet. Den anden regel gælder for alle tekstnoder eller attributnoder ; den instruerer processoren om at lave en kopi af den node i resultattræet. Den tredje regel er for alle kommentarknudepunkter og behandlingsinstruktionsknuder ; ingen operation udføres. Skabeloner, der er eksplicit defineret i XSLT, kan tilsidesætte nogle eller alle standardregelskabelonerne. Hvis skabelonen ikke indeholder nogen eksplicitte regler, vil de indbyggede regler blive anvendt til at krydse kildetræet rekursivt, og kun tekstnoder vil blive kopieret ind i resultattræet (attributnoder vil ikke blive nået, da de ikke er "børn" af deres forælder noder). Resultatet opnået på denne måde er normalt uønsket, da det blot er en sammenkædning af alle tekstfragmenter fra det originale XML-dokument.

Processoren gennemgår derefter følgende trin for at opnå og serialisere resultattræet.

  1. Opretter resultattræets rodknude.
  2. Behandler kildetræets rodknude. Nodebehandlingsproceduren er beskrevet nedenfor.
  3. Serialiserer resultattræet, hvis det er nødvendigt, i henhold til hints beskrevet af xsl:output.

Når du behandler en node, udføres følgende handlinger.

  1. Der søges efter den mest passende regelskabelon. Dette opnås ved at kontrollere mønsteret (som er et XPath-udtryk) for hver regel, hvilket angiver de noder, som reglen kan anvendes på. Hvert mønster tildeles en relativ prioritet og forrang af processoren for at lette konfliktløsning. Rækkefølgen af ​​skabelonregler i et typografiark kan også hjælpe med at løse konflikter mellem skabeloner, der matcher de samme noder, men det påvirker ikke rækkefølgen, hvori noderne behandles.
  2. Skabelonreglens indhold instantieres. Elementer i XSLT-navnerummet (normalt foranstillet med xsl:) behandles som instruktioner og har speciel semantik, der angiver, hvordan de skal fortolkes. Nogle er til at tilføje noder til det resulterende træ, andre er kontrolkonstruktioner. Ikke-XSLT-elementer og tekstnoder, der findes i reglen, kopieres "ordret" ind i resultattræet. Kommentarer og kontrolinstruktioner ignoreres.

Instruktionen xsl:apply-templatesforårsager, når den behandles, et nyt sæt noder, der hentes og behandles. Noder identificeres ved hjælp af et XPath-udtryk. Alle noder behandles i den rækkefølge, de er indeholdt i kildedokumentet.

XSLT udvider XPath-funktionsbiblioteket og giver dig mulighed for at definere XPath-variabler. Disse variabler har forskelligt omfang i typografiarket afhængigt af hvor de er defineret, og deres værdier kan indstilles uden for typografiarket. Variable værdier kan ikke ændres under behandlingen.

Selvom denne procedure kan virke kompliceret, gør den XSLT i funktioner, der ligner andre webskabelonsprog. Hvis typografiarket består af en enkelt regel til at behandle rodnoden, kopieres hele indholdet af skabelonen blot til resultatet, og XSLT-instruktionerne (' xsl:…'-elementerne) erstattes med det beregnede indhold. XSLT tilbyder endda et specielt format ("bogstaveligt resultatelement som stilark") til sådanne enkle transformationer med én skabelon. Men muligheden for at definere individuelle skabeloner og regler øger i høj grad fleksibiliteten og effektiviteten af ​​XSLT, især når der genereres et resultat, der ligner det originale dokument.

Se også

Litteratur

  • Tidwell D. XSLT. 2nd Edition = XSLT, 2nd Edition. - Sankt Petersborg. : Symbol-Plus , 2009. - 960 s. - 1200 eksemplarer.  - ISBN 978-5-93286-150-9 .
  • Mangano S. XSLT. Kogebog = XSLT Kogebog: Løsninger og eksempler til XML- og XSLT-udviklere, 2. udgave. - Sankt Petersborg. : BHV , 2008. - 864 s. - ISBN 978-5-9775-0292-4 .
  • Kay M. XSLT. Programmers håndbog. 2nd Edition = XSLT, Programmer's Reference, 2nd Edition. - Sankt Petersborg. : Symbol-Plus , 2002. - 1016 s. - 2000 eksemplarer.  — ISBN 5-93286-039-1 .
  • Holzner S. XSLT. Programmers bibliotek. 2nd Edition = Inside XSLT. - Sankt Petersborg. : Peter , 2002. - 544 s. - 3 eksemplarer.  - ISBN 5-94723-271-5 .

Links