XSLT

Az XSLT ( e X tensible S tylesheet L Anguage Transformations ) egy XML dokumentumok átalakítására szolgáló nyelv. Az XSLT specifikáció az XSL része, és a W3C ajánlása .

Ha egy sablonkészletből álló XSLT-stíluslapot XML -dokumentumra ( forrásfára ) alkalmaz, akkor egy olyan fa jön létre , amely XML-dokumentumként, XHTML - dokumentumként (csak XSLT 2.0), HTML -dokumentumként vagy egyszerű szövegfájlként szerializálható . Az adatok forrásfából való kiválasztásának (és részben átalakításának) szabályai az XPath lekérdezési nyelven vannak megírva .

Az XSLT-nek sokféle felhasználása van, főként a webes programozás és jelentéskészítés területén. Az XSLT nyelv által megoldott egyik feladat az adatok elkülönítése a megjelenítésüktől, az általános MVC ( Model-view-controller ) paradigma részeként .  Egy másik gyakori feladat az XML dokumentumok konvertálása egyik XML sémából a másikba.

Történelem

Az XSLT-t a World Wide Web Consortium XSL-munkacsoportja fejlesztette ki .

Az 1.0-s verziót ajánlásként hagyták jóvá 1999. november 16- án . Az első verzió megjelenése után megkezdődött a munka az 1.1-es verzión, de 2001- ben leállt, és az XSL munkacsoport csatlakozott az XQuery munkacsoporthoz, hogy együttműködjön az XPath 2.0 -n . Ezt követően az XPath 2.0 szolgált alapul az XSLT 2.0-s verziójának fejlesztéséhez.

A 2.0-s verziót 2007. január 24- én ajánlásként hagyták jóvá .

A 3.0-s verziót 2017. június 8-án hagyták jóvá.

Az XSLT transzformáció végrehajtásának folyamata

Az XSLT-transzformációk végrehajtása során a következők vesznek részt:

A legegyszerűbb esetben egy XSLT processzor két dokumentumot vesz bemenetként, egy bemeneti XML dokumentumot és egy XSLT stíluslapot, és ezek alapján készít egy kimeneti dokumentumot.

XSLT és XPath

Az XSLT az XPath nyelvet használja a bemeneti XML-dokumentum egyes részeinek eléréséhez és a számítások rendszerezéséhez.

Az XSLT 1.0 XPath 1.0-t, az XSLT 2.0 pedig az XPath 2.0-t használja.

Példák

Átalakítás XML-ről XSLT-re

Forrás XML dokumentum:

<?xml version="1.0"?> <persons> <person username= "MP123456" > <name> Ivan </name> <surname> Ivanov </surname> </person> <person username= "PK123456" > < név> Péter </név> <vezetéknév> Petrov </családnév> </person> </persons>

XSLT stíluslap (transzformációk):

<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" version= "1.0" > <xsl:output method= "xml" indent= "yes" /> <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= "@felhasználónév" > <felhasználónév> <xsl:value-of select= "." /> </felhasználónév> </xsl:template> <xsl:template match= "name" > <fullname> <xsl:apply-templates/> <xsl:apply-templates select= "following-sibling::surname" mode= "teljes név" /> </fullname> </ xsl:sablon> <xsl:template match= "vezetéknév" /> <xsl:template match= "surname" mode= "fullname" > <xsl:text> </xsl:text> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>

Az eredményül kapott XML dokumentum:

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

Átalakítás XML-ről XHTML-re

XML dokumentum bevitele:

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="my-style.xsl"?> <domains> < sun.com ownedBy= "Sun Microsystems Inc." > <gazda> www <use> Világméretű webhely </use> </host> <host> Jáva <use> Java információ </use> </host> </sun.com> <w3.org ownedBy= "The World Wide Web Consortium" > <host> www <use> Világméretű webhely </use> </host> <host> érvényesítő <use> webfejlesztők, akik szeretnének rendet tenni </use> </host> </w3.org> </domains>

Az XSLT átalakítás stílusa:

<?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= "en " > <head> <meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" /> <title> teszt1 </title> <style type= "text/css" > h1 { padding: 10px; párnázási szélesség: 100% háttérszín: ezüst } td, th { szélesség: 40%; szegély: 1px tömör ezüst; padding: 10px td:first-child, th:first-child { szélesség: 20% } táblázat {szélesség: 650 képpont} </style> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <!--Table headers and outline--> <xsl:template match= "domains/*" > <h1><xsl:value-of select= "@ownedBy" /></h1> <p> A következő gazdagép a nevek jelenleg használatban vannak a következő helyen: <strong><xsl:value-of select= "local-name(.)" /></strong> </p> <table> <tr><th> Gazdanév </th> <th> URL </th><th> Használja: </th></tr> <xsl:apply-templates/> </table> </xsl:template> <!--Táblázat sora és első két oszlopa--> <xsl:template match= "host" > <!--Változó létrehozása az 'url' számára, mivel kétszer használják --> <xsl:variable name= "url" select= "normalize-space(concat('http://',>normalize-space(node()), '.', local-name(..)))" /> <tr> <td>< xsl: value-of select= "node()" /></td> <td><a href= "{$url}" ><xsl:value-of select= "$url" /></a> </ td> <xsl:apply-templates select= "use" /> </tr> </xsl:template> <!--'Használja' oszlop--> <xsl:template match= "use" > <td><xsl:value-of select= "." /></td> </xsl:template> </xsl:stylesheet>

A kimenetként kapott XHTML (szóközök az egyértelműség kedvéért):

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html NYILVÁNOS "-//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> teszt1 </title> <style type= "text/css" > h1 { padding: 10px; párnázási szélesség: 100% háttérszín: ezüst } td, th { szélesség: 40%; szegély: 1px tömör ezüst; padding: 10px td:first-child, th:first-child { szélesség: 20% } táblázat {szélesség: 650 képpont} </style> </head> <body> <h1> Sun Microsystems Inc. </h1> <p> Jelenleg a következő gazdagépnevek vannak használatban a <strong> sun.com </strong></p> <table> <tr> <th> Gazdanév </th> <th> URL < címen /th> <th> Használja: </th> </tr> <tr> <td> www </td> <td><a href="http://www.sun.com" > http :// www.sun.com </a></td> <td> Világméretű webhely </td> </tr> <tr> <td> java </td> <td><a href= "http:/ /java.sun.com" > http://java.sun.com </a></td> <td> Java információ </td> </tr> </table> <h1> A World Wide Web Consortium </h1> <p> Jelenleg a következő gazdagépnevek vannak használatban a <strong> w3.org </strong></p> <table> <tr> <th> Host name < /th> <th> URL </th> <th> Használja: </th> </tr> <tr> <td> www </td> <td><a href= "http://www.w3 .org" > http://www.w3.org </a></td> <td> Világháló </td> </tr> <tr> <td> érvényesítő </td> <td> <a href="http://validator.w3.org" > http://validator.w3.org </a> </td> <td> webfejlesztők, akik szeretnék rendbe tenni </td> </ t> tr> </table> </body> </html>

A kimenet nem feltétlenül helyes XHTML. Az XSLT 2.0 javította ezt az „XHTML” kimeneti metódus hozzáadásával, az XSLT 1.0-ban már létező „HTML”-mel együtt.

Sablonszabályok alkalmazása

Az XSLT nyelv deklaratív, nem procedurális. A végrehajtható utasítások sorozatának meghatározása helyett ez a nyelv határozza meg az átalakítás során alkalmazandó szabályokat. Maga a transzformáció egy rögzített algoritmus szerint történik.

Először is, az XSLT processzor elemzi a transzformációs fájlt, és elkészíti a bemeneti fájl XML-fáját. Ezután megkeresi a gyökércsomóponthoz legjobban illeszkedő sablont, és kiértékeli a talált sablon tartalmát. Az egyes sablonokban található utasítások vagy közvetlenül azt mondják az XSLT processzornak, hogy "hozza létre ezt a címkét itt", vagy azt mondják, hogy "dolgozzon fel más csomópontokat ugyanazzal a szabállyal, mint a gyökércsomópont".

Ezt az algoritmust, amely kissé nem triviális, az alábbiakban részletesebben ismertetjük, bár sok egzotikus részletét kihagyjuk.

Minden XSLT processzornak végre kell hajtania a következő lépéseket az átalakításra való felkészüléshez.

  1. Olvasson el egy XSLT-stíluslapot egy XML-elemzővel, és fordítsa le annak tartalmát csomópontfává ( stíluslapfa ) az XPath adatmodell szerint. A „fordítási idő” szintaktikai hibákat ebben a szakaszban észleli. A stíluslapok lehetnek modulárisak, ezért ebben a szakaszban minden befoglalás (utasítások xsl:include, xsl:import) is feldolgozásra kerül annak érdekében, hogy az összes sablonszabályt és más stíluslapok egyéb elemeit egyetlen stíluslapfában egyesítsék.
  2. Olvassa be a bemeneti XML-adatokat egy XML-elemző segítségével, és fordítsa le annak tartalmát csomópontfává ( forrásfa ), az XPath adatmodell szerint. Egy XML-dokumentum függvényhívások segítségével hivatkozhat más XML-forrásokra document(). Ezeket a hívásokat általában futás közben kezelik, mivel előfordulhat, hogy helyük kiszámítható, és előfordulhat, hogy a megfelelő függvényhívások egyáltalán nem fordulnak elő. (A fenti példa nem hivatkozik semmilyen más dokumentumra.)
  3. Távolítsa el az üres csomópontokat az XSLT stíluslapról, kivéve azokat, amelyek gyermekei xsl:text. Ez kiküszöböli az "extra" szóközök megjelenését.
  4. Távolítsa el az üres szövegcsomópontokat a forrásfából, ha utasítások xsl:strip-spacevannak a forrásdokumentumban. Ez kiküszöböli az "extra" szóközök megjelenését. (A fenti példa nem használja ezt a funkciót.)
  5. Töltse fel az XSLT-fát három szabállyal, amelyek alapértelmezett viselkedést biztosítanak a feldolgozás során esetlegesen előforduló csomóponttípusokhoz. Az első szabály a gyökércsomópont kezelése ; utasítja a processzort a gyökércsomópont minden egyes gyermekének feldolgozására. A második szabály bármely szövegcsomópontra vagy attribútumcsomópontra vonatkozik ; utasítja a processzort, hogy készítsen másolatot arról a csomópontról az eredményfában. A harmadik szabály az összes megjegyzés csomópontra és feldolgozási utasítás csomópontra vonatkozik ; nem történik művelet. Az XSLT-ben kifejezetten meghatározott sablonok felülírhatják az alapértelmezett szabálysablonok egy részét vagy mindegyikét. Ha a sablon nem tartalmaz explicit szabályokat, a beépített szabályokat alkalmazza a forrásfa rekurzív bejárása, és csak a szöveges csomópontokat másolja be az eredményfába (az attribútum-csomópontokat nem éri el, mivel nem "gyermekei" a szülőnek csomópontok). Az így kapott eredmény általában nem kívánatos, mivel ez egyszerűen az eredeti XML dokumentum összes szövegrészletének összefűzése.

A processzor ezután a következő lépéseken megy keresztül az eredményfa megszerzéséhez és sorozatosításához.

  1. Létrehozza az eredményfa gyökércsomópontját.
  2. Feldolgozza a forrásfa gyökércsomópontját. A csomópont-feldolgozási eljárást az alábbiakban ismertetjük.
  3. Szükség esetén sorba rendezi az eredményfát a . által leírt tippek szerint xsl:output.

Egy csomópont feldolgozása során a következő műveleteket hajtják végre.

  1. Megkeresi a legmegfelelőbb szabálysablont. Ez úgy érhető el, hogy minden egyes szabályhoz ellenőrzi a mintát (amely egy XPath kifejezés), jelezve azokat a csomópontokat, amelyeken a szabály alkalmazható. A konfliktusfeloldás megkönnyítése érdekében a processzor minden mintához relatív prioritást és elsőbbséget rendel. A stíluslap sablonszabályainak sorrendje az azonos csomópontokhoz tartozó sablonok közötti ütközések feloldásában is segíthet, de nem befolyásolja a csomópontok feldolgozási sorrendjét.
  2. A sablonszabály tartalma példányosodik. Az XSLT névtér elemeit (általában előtagként ) a rendszer utasításkéntxsl: kezeli, és speciális szemantikával rendelkezik, amely jelzi, hogyan kell értelmezni őket. Egyesek csomópontok hozzáadására szolgálnak az eredményül kapott fához, mások pedig vezérlőkonstrukciók. A szabályban található nem XSLT elemek és szöveges csomópontok "szó szerint" másolódnak az eredményfába. A megjegyzéseket és az ellenőrzési utasításokat figyelmen kívül hagyja.

Az utasítás xsl:apply-templatesfeldolgozása esetén új csomópontkészletet kér le és dolgoz fel. A csomópontok azonosítása XPath kifejezéssel történik. Az összes csomópont feldolgozása a forrásdokumentumban szereplő sorrendben történik.

Az XSLT kiterjeszti az XPath függvénykönyvtárat, és lehetővé teszi XPath változók meghatározását. Ezek a változók eltérő hatókörrel rendelkeznek a stíluslapon attól függően, hogy hol vannak meghatározva, és értékeik a stíluslapon kívül is beállíthatók. A változó értékek a feldolgozás során nem módosíthatók.

Bár ez az eljárás bonyolultnak tűnhet, funkcióiban az XSLT-t hasonlóvá teszi más websablonnyelvekhez. Ha a stíluslap egyetlen szabályból áll a gyökércsomópont feldolgozására, akkor a sablon teljes tartalma egyszerűen átmásolódik az eredményhez, és az XSLT utasításokat (a " xsl:…" elemeket) lecseréli a számított tartalomra. Az XSLT még egy speciális formátumot is kínál ("literal result element as stylesheet") az ilyen egyszerű, egysablonos átalakításokhoz. Az egyedi sablonok és szabályok meghatározásának lehetősége azonban nagymértékben növeli az XSLT rugalmasságát és hatékonyságát, különösen akkor, ha az eredeti dokumentumra nagyon hasonlító eredményt generál.

Lásd még

Irodalom

  • Tidwell D. XSLT. 2. kiadás = XSLT, 2. kiadás. - Szentpétervár. : Symbol-Plus , 2009. - 960 p. - 1200 példány.  - ISBN 978-5-93286-150-9 .
  • Mangano S. XSLT. Szakácskönyv = XSLT Szakácskönyv: Megoldások és példák XML- és XSLT-fejlesztőknek, 2. kiadás. - Szentpétervár. : BHV , 2008. - 864 p. - ISBN 978-5-9775-0292-4 .
  • Kay M. XSLT. Programozói kézikönyv. 2. kiadás = XSLT, programozói referencia, 2. kiadás. - Szentpétervár. : Symbol-Plus , 2002. - 1016 p. - 2000 példányban.  — ISBN 5-93286-039-1 .
  • Holzner S. XSLT. Programozói könyvtár. 2. kiadás = Az XSLT belsejében. - Szentpétervár. : Péter , 2002. - 544 p. - 3 példány.  - ISBN 5-94723-271-5 .

Linkek