XSLT

XSLT ( e X tensible S tylesheet L anguage Transformations ) är ett språk för att transformera XML- dokument. XSLT-specifikationen är en del av XSL och är en W3C- rekommendation .

Genom att tillämpa en XSLT -formatmall , som består av en uppsättning mallar , på ett XML-dokument ( källträd ) skapas ett resulterande träd som kan serialiseras som ett XML-dokument, XHTML- dokument (endast XSLT 2.0), HTML - dokument eller vanlig textfil . Reglerna för att välja (och delvis transformera) data från källträdet är skrivna i frågespråket XPath .

XSLT har många olika användningsområden, främst inom områdena webbprogrammering och rapportering. En av uppgifterna som löses av XSLT-språket är att separera data från deras presentation, som en del av det allmänna MVC-paradigmet ( Model-view-controller ) .  En annan vanlig uppgift är att konvertera XML-dokument från ett XML-schema till ett annat.

Historik

XSLT utvecklades av XSL Working Group i World Wide Web Consortium .

Version 1.0 godkändes som en rekommendation den 16 november 1999 . Efter lanseringen av den första versionen började arbetet med version 1.1, men 2001 avbröts den och XSL- arbetsgruppen gick med i XQuery- arbetsgruppen för att samarbeta om XPath 2.0 . Därefter fungerade XPath 2.0 som grunden för utvecklingen av XSLT version 2.0.

Version 2.0 godkändes som rekommendation den 24 januari 2007 .

Version 3.0 godkändes den 8 juni 2017.

Processen att utföra en XSLT-transformation

I processen att utföra XSLT-transformationer är följande involverade:

I det enklaste fallet tar en XSLT-processor två dokument som indata, ett XML -inmatningsdokument och ett XSLT-formatmall, och skapar ett utdatadokument baserat på dem.

XSLT och XPath

XSLT använder XPath- språket för att komma åt enskilda delar av ett XML-indatadokument och för att organisera beräkningar.

XSLT 1.0 använder XPath 1.0 och XSLT 2.0 använder XPath 2.0.

Exempel

Transformation från XML till XSLT

XML- källdokument :

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

XSLT-formatmall (transformationer):

<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" version= "1.0" > <xsl:output method= "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= "@username" > <användarnamn> <xsl:value-of select= "." /> </användarnamn> </xsl:mall> <xsl:template match= "name" > <fullname> <xsl:apply-templates/> <xsl:apply-templates select= "following-sibling::surname" mode= "fullname" /> </fullname> </ xsl:mall> <xsl:template match= "efternamn" /> <xsl:template match= "surname" mode= "fullname" > <xsl:text> </xsl:text> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>

Resulterande XML-dokument:

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

Transformation från XML till XHTML

Mata in 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ärd> www <use> World Wide Web site </use> </host> <host> java <use> Java info </use> </host> </sun.com> <w3.org ownedBy= "The World Wide Web Consortium" > <host> www <use> World Wide Web site </use> </host> <host> validator <use> webbutvecklare som vill få det rätt </use> </host> </w3.org> </domains>

Stil för 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 :output method= "xml" indent= "yes" doctype-public= "-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system= "http://www.w3.org/TR/xhtml1/ DTD/xhtml1-strict.dtd" /> <!--XHTML document outline--> <xsl:template match= "/" > <html xmlns= "http://www.w3.org/1999/xhtml" xml:lang= "en" lang= "sv " > <head> <meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" /> <title> test1 </title> <style type= "text/css" > h1 { utfyllnad: 10px; stoppningsbredd: 100 % bakgrundsfärg: silver } td, th { bredd: 40%; kant: 1px massivt silver; stoppning: 10px td:first-child, th:first-child { width: 20% } tabell {bredd: 650px} </style> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <!--Tabellrubriker och disposition--> <xsl:template match= "domains/*" > <h1><xsl:value-of select= "@ownedBy" /></h1> <p> Följande värd namn används för närvarande på <strong><xsl:value-of select= "local-name(.)" /></strong> </p> <tabell> <tr><th> Värdnamn </th> <th> URL </th><th> Används av </th></tr> <xsl:apply-templates/> </table> </xsl:template> <!--Tabellrad och första två kolumner--> <xsl:template match= "host" > <!--Skapa variabel för 'url', eftersom den används två gånger--> <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= "använd" /> </tr> </xsl:template> <!--'Används av' kolumn--> <xsl:template match= "use" > <td><xsl:value-of select= "." /></td> </xsl:mall> </xsl:stylesheet>

XHTML får vi som utdata (mellanslag har lagts till för tydlighetens skull):

<?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= "en" xml:lang= "en" > <head> <meta content= "text/html;charset=UTF-8" http-equiv= "Content-Type" /> <title> test1 </title> <style type= "text/css" > h1 { utfyllnad: 10px; stoppningsbredd: 100 % bakgrundsfärg: silver } td, th { bredd: 40%; kant: 1px massivt silver; stoppning: 10px td:first-child, th:first-child { width: 20% } tabell {bredd: 650px} </style> </head> <body> <h1> Sun Microsystems Inc. </h1> <p> Följande värdnamn används för närvarande på <strong> sun.com </strong></p> <table> <tr> <th> Värdnamn </th> <th> URL < /th> <th> Används av </th> </tr> <tr> <td> www </td> <td><a href="http://www.sun.com" > http :// www.sun.com </a></td> <td> World Wide Web site </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öljande värdnamn används för närvarande på <strong> w3.org </strong></p> <tabell> <tr> <th> Värdnamn < /th> <th> URL </th> <th> Används av </th> </tr> <tr> <td> www </td> <td><a href= "http://www.w3 .org" > http://www.w3.org </a></td> <td> World Wide Web-webbplats </td> </tr> <tr> <td> validator </td> <td> <a href="http://validator.w3.org" > http://validator.w3.org </a> </td> <td> webbutvecklare som vill få det rätt </td> </ tr> </table> </body> </html>

Utdata är inte nödvändigtvis korrekt XHTML. XSLT 2.0 fixade detta genom att lägga till "XHTML"-utdatametoden, tillsammans med den "HTML" som redan fanns i XSLT 1.0.

Tillämpning av mallregler

XSLT-språket är deklarativt, inte procedurmässigt. Istället för att definiera en sekvens av körbara satser, definierar detta språk reglerna som kommer att tillämpas under konverteringen. Själva transformationen utförs enligt en fast algoritm.

Först och främst analyserar XSLT-processorn transformationsfilen och bygger ett XML-träd för indatafilen. Den letar sedan efter den mall som bäst matchar rotnoden och utvärderar innehållet i den hittade mallen. Instruktionerna i varje mall kan antingen direkt säga till XSLT-processorn "skapa den här taggen här", eller säga "bearbeta andra noder på samma sätt som rotnoden".

Denna algoritm, som är något icke-trivial, beskrivs mer i detalj nedan, även om många av dess exotiska detaljer är utelämnade.

Varje XSLT-processor måste utföra följande steg för att förbereda sig för transformationen.

  1. Läs en XSLT-formatmall med en XML-tolkare och översätt dess innehåll till ett träd av noder ( stilmallsträd ) enligt XPath-datamodellen. Syntaxfel "kompileringstid" upptäcks i detta skede. Stilmallar kan vara modulära, så alla inklusioner (påståenden xsl:include, xsl:import) kommer också att bearbetas i detta skede för att kombinera alla mallregler och andra element från andra stilmallar till ett enda formatmallsträd.
  2. Läs ingående XML-data med hjälp av en XML-parser, översätt dess innehåll till ett träd av noder ( källträd ), enligt XPath-datamodellen. Ett XML-dokument kan referera till andra XML-källor med hjälp av funktionsanrop document(). Dessa samtal hanteras vanligtvis under körning, eftersom deras plats kan beräknas, och motsvarande funktionsanrop kanske inte inträffar alls. (Exemplet ovan länkar inte till några andra dokument.)
  3. Ta bort tomma noder från XSLT-formatmallen, förutom de som är underordnade xsl:text. Detta eliminerar utseendet på "extra" utrymmen.
  4. Ta bort tomma textnoder från källträdet om instruktioner xsl:strip-spacefinns i källdokumentet. Detta eliminerar utseendet på "extra" utrymmen. (Exemplet ovan använder inte den här funktionen.)
  5. Fyll XSLT-trädet med tre regler som ger standardbeteende för alla nodtyper som kan påträffas under bearbetning. Den första regeln är att hantera rotnoden ; den instruerar processorn att bearbeta varje barn till rotnoden. Den andra regeln är för alla textnoder eller attributnoder ; den instruerar processorn att göra en kopia av den noden i resultatträdet. Den tredje regeln är för alla kommentarsnoder och bearbetningsinstruktionsnoder ; ingen operation utförs. Mallar som uttryckligen definieras i XSLT kan åsidosätta några eller alla standardregelmallarna. Om mallen inte innehåller några explicita regler kommer de inbyggda reglerna att tillämpas för att korsa källträdet rekursivt och endast textnoder kommer att kopieras till resultatträdet (attributnoder kommer inte att nås eftersom de inte är "barn" till sin förälder knutpunkter). Resultatet som erhålls på detta sätt är vanligtvis oönskat, eftersom det helt enkelt är en sammanlänkning av alla textfragment från det ursprungliga XML-dokumentet.

Processorn går sedan igenom följande steg för att erhålla och serialisera resultatträdet.

  1. Skapar rotnoden för resultatträdet.
  2. Bearbetar källträdets rotnod. Nodbehandlingsproceduren beskrivs nedan.
  3. Serialiserar resultatträdet, om nödvändigt, enligt tipsen som beskrivs av xsl:output.

Vid bearbetning av en nod utförs följande åtgärder.

  1. Den mest lämpliga regelmallen söks efter. Detta uppnås genom att kontrollera mönstret (som är ett XPath-uttryck) för varje regel, vilket anger de noder som regeln kan tillämpas på. Varje mönster tilldelas en relativ prioritet och företräde av processorn för att underlätta konfliktlösning. Ordningen på mallregler i en stilmall kan också hjälpa till att lösa konflikter mellan mallar som matchar samma noder, men det påverkar inte ordningen i vilken noderna bearbetas.
  2. Mallregelinnehållet instansieras. Element i XSLT-namnutrymmet (vanligtvis med prefix xsl:) behandlas som instruktioner och har speciell semantik som anger hur de ska tolkas. Vissa är till för att lägga till noder till det resulterande trädet, andra är kontrollkonstruktioner. Icke-XSLT-element och textnoder som finns i regeln kopieras "ordagrant" till resultatträdet. Kommentarer och kontrollinstruktioner ignoreras.

Instruktionen xsl:apply-templates, när den bearbetas, gör att en ny uppsättning noder hämtas och bearbetas. Noder identifieras med hjälp av ett XPath-uttryck. Alla noder bearbetas i den ordning de finns i källdokumentet.

XSLT utökar XPath-funktionsbiblioteket och låter dig definiera XPath-variabler. Dessa variabler har olika omfattning i stilmallen beroende på var de är definierade och deras värden kan ställas in utanför stilmallen. Variabelvärden kan inte ändras under bearbetning.

Även om denna procedur kan verka komplicerad, gör den XSLT liknande funktioner som andra webbmallspråk. Om stilmallen består av en enda regel för att bearbeta rotnoden, kopieras hela innehållet i mallen helt enkelt till resultatet, och XSLT-instruktionerna ( xsl:…elementen ' ') ersätts med det beräknade innehållet. XSLT erbjuder till och med ett speciellt format ("literal result element as stylesheet") för sådana enkla transformationer med en mall. Möjligheten att definiera individuella mallar och regler ökar dock flexibiliteten och effektiviteten hos XSLT avsevärt, särskilt när man genererar ett resultat som liknar originaldokumentet.

Se även

Litteratur

  • Tidwell D. XSLT. 2nd Edition = XSLT, 2nd Edition. - St Petersburg. : Symbol-Plus , 2009. - 960 sid. - 1200 exemplar.  - ISBN 978-5-93286-150-9 .
  • Mangano S. XSLT. Cookbook = XSLT Cookbook: Lösningar och exempel för XML- och XSLT-utvecklare, 2nd Edition. - St Petersburg. : BHV , 2008. - 864 sid. - ISBN 978-5-9775-0292-4 .
  • Kay M. XSLT. Programmerarens handbok. 2nd Edition = XSLT, Programmer's Reference, 2nd Edition. - St Petersburg. : Symbol-Plus , 2002. - 1016 sid. - 2000 exemplar.  — ISBN 5-93286-039-1 .
  • Holzner S. XSLT. Programmerarens bibliotek. 2nd Edition = Inuti XSLT. - St Petersburg. : Peter , 2002. - 544 sid. - 3 exemplar.  - ISBN 5-94723-271-5 .

Länkar