XSLT

XSLT ( e X tensible S tylesheet L anguage Transformations ) je jazyk pro transformaci dokumentů XML . Specifikace XSLT je součástí XSL a je doporučením W3C .

Použití šablony stylů XSLT sestávající ze sady šablon na dokument XML ( zdrojový strom ) vytvoří výsledný strom , který lze serializovat jako dokument XML, dokument XHTML (pouze XSLT 2.0), dokument HTML nebo soubor s prostým textem . Pravidla pro výběr (a částečně i transformaci) dat ze zdrojového stromu jsou napsána v dotazovacím jazyce XPath .

XSLT má mnoho různých použití, především v oblasti programování webu a vytváření sestav. Jedním z úkolů, které jazyk XSLT řeší, je oddělení dat od jejich prezentace, jako součást obecného paradigmatu MVC ( Model-view-controller ) .  Dalším běžným úkolem je převádět dokumenty XML z jednoho schématu XML do jiného.

Historie

XSLT byl vyvinut pracovní skupinou XSL konsorcia World Wide Web Consortium .

Verze 1.0 byla schválena jako doporučení 16. listopadu 1999 . Po vydání první verze se začalo pracovat na verzi 1.1, ale v roce 2001 byla ukončena a pracovní skupina XSL se připojila k pracovní skupině XQuery , aby spolupracovala na XPath 2.0 . Následně XPath 2.0 posloužil jako základ pro vývoj XSLT verze 2.0.

Verze 2.0 byla schválena jako doporučení dne 24. ledna 2007 .

Verze 3.0 byla schválena 8. června 2017.

Proces provádění transformace XSLT

Proces provádění transformací XSLT zahrnuje následující:

V nejjednodušším případě procesor XSLT vezme dva dokumenty jako vstup, vstupní dokument XML a šablonu stylů XSLT, a na jejich základě vytvoří výstupní dokument.

XSLT a XPath

XSLT používá jazyk XPath pro přístup k jednotlivým částem vstupního XML dokumentu a pro organizaci výpočtů.

XSLT 1.0 používá XPath 1.0 a XSLT 2.0 používá XPath 2.0.

Příklady

Transformace z XML do XSLT

Zdrojový dokument XML :

<?xml version="1.0"?> <persons> <person username= "MP123456" > <name> Ivan </name> <surname> Ivanov </surname> </person> <person username= "PK123456" > < jméno> Peter </name> <příjmení> Petrov </surname> </person> </persons>

XSLT styly (transformace):

<?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= "@username" > <username> <xsl:value-of select= "." /> </username> </xsl:template> <xsl:template match= "name" > <fullname> <xsl:apply-templates/> <xsl:apply-templates select= "following-sibling::surname" mode= "fullname" /> </fullname> </ xsl:template> <xsl:template match= "příjmení" /> <xsl:template match= "surname" mode= "fullname" > <xsl:text> </xsl:text> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>

Výsledný dokument XML:

<?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>

Transformace z XML do XHTML

Vstup XML dokumentu:

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="my-style.xsl"?> <domény> < sun.com ownedBy= "Sun Microsystems Inc." > <hostitel> www <use> World Wide Web </use> </host> <host> Jáva <use> Java informace </use> </host> </sun.com> <w3.org ownedBy= "The World Wide Web Consortium" > <hostitel> www <use> World Wide Web </use> </host> <host> validátor <use> weboví vývojáři, kteří to chtějí udělat správně </use> </host> </w3.org> </domains>

Styl pro transformaci XSLT:

<?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" /> <!--Nástin dokumentu XHTML--> <xsl:template match= "/" > <html xmlns= "http://www.w3.org/1999/xhtml" xml:lang= "en" lang= "cs " > <head> <meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" /> <title> test1 </title> <style type= "text/css" > h1 { padding: 10px; šířka výplně: 100% barva pozadí: stříbrná } td, th { šířka: 40 %; ohraničení: 1px masivní stříbro; výplň: 10px td:first-child, th:first-child { šířka: 20 % } tabulka {width: 650px} </style> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <!--Záhlaví a osnova tabulek--> <xsl:template match= "domains/*" > <h1><xsl:value-of select= "@ownedBy" /></h1> <p> Následující hostitel názvy se aktuálně používají na <strong><xsl:value-of select= "local-name(.)" /></strong> </p> <table> <tr><th> Název hostitele </th> <th> URL </th><th> Používá </th></tr> <xsl:apply-templates/> </table> </xsl:template> <!--Řádek tabulky a první dva sloupce--> <xsl:template match= "host" > <!--Vytvořte proměnnou pro 'url', protože je použita dvakrát--> <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> Sloupec <!--'Used by'--> <xsl:template match= "use" > <td><xsl:value-of select= "." /></td> </xsl:template> </xsl:stylesheet>

XHTML, které dostáváme jako výstup (pro přehlednost byly přidány mezery):

<?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= "cs" xml:lang= "cs" > <head> <meta content= "text/html;charset=UTF-8" http-equiv= "Content-Type" /> <title> test1 </title> <style type= "text/css" > h1 { padding: 10px; šířka výplně: 100% barva pozadí: stříbrná } td, th { šířka: 40 %; ohraničení: 1px masivní stříbro; výplň: 10px td:first-child, th:first-child { šířka: 20 % } tabulka {width: 650px} </style> </head> <body> <h1> Sun Microsystems Inc. </h1> <p> Následující názvy hostitelů se aktuálně používají na <strong> sun.com </strong></p> <table> <tr> <th> Název hostitele </th> <th> URL < /th> <th> Používá </th> </tr> <tr> <td> www </td> <td><a href="http://www.sun.com" > http :// www.sun.com </a></td> <td> World Wide Web </td> </tr> <tr> <td> java </td> <td><a href= "http:/ /java.sun.com" > http://java.sun.com </a></td> <td> Informace o jazyce Java </td> </tr> </table> <h1> The World Wide Web Consortium </h1> <p> Následující názvy hostitelů jsou aktuálně používány na <strong> w3.org </strong></p> <table> <tr> <th> Název hostitele < /th> <th> URL </th> <th> Používá </th> </tr> <tr> <td> www </td> <td><a href= "http://www.w3 .org" > http://www.w3.org </a></td> <td> World Wide Web </td> </tr> <tr> <td> validátor </td> <td> <a href="http://validator.w3.org" > http://validator.w3.org </a> </td> <td> weboví vývojáři, kteří to chtějí mít správně </td> </ tr> </table> </body> </html>

Výstup nemusí být nutně správný XHTML. XSLT 2.0 to opravil přidáním výstupní metody 'XHTML' spolu s 'HTML', která již existovala v XSLT 1.0.

Aplikace pravidel šablony

Jazyk XSLT je deklarativní, nikoli procedurální. Namísto definování posloupnosti spustitelných příkazů tento jazyk definuje pravidla, která budou použita při převodu. Samotná transformace se provádí podle pevně daného algoritmu.

Nejprve XSLT procesor analyzuje transformační soubor a sestaví XML strom vstupního souboru. Poté vyhledá šablonu, která nejlépe odpovídá kořenovému uzlu, a vyhodnotí obsah nalezené šablony. Instrukce v každé šabloně mohou buď přímo říct procesoru XSLT „vytvoř tuto značku zde“ nebo „zpracovat další uzly se stejným pravidlem jako kořenový uzel“.

Tento algoritmus, který je poněkud netriviální, je podrobněji popsán níže, ačkoli mnoho z jeho exotických detailů je vynecháno.

Každý procesor XSLT musí provést následující kroky, aby se připravil na transformaci.

  1. Přečtěte si šablonu stylů XSLT pomocí analyzátoru XML a přeložte její obsah do stromu uzlů ( strom šablony stylů ) podle datového modelu XPath. V této fázi jsou detekovány syntaktické chyby "doba kompilace". Šablony stylů mohou být modulární, takže v této fázi budou zpracovány také všechny zahrnutí (příkazy xsl:include, ), aby se všechna pravidla šablon a další prvky z jiných šablon stylů spojily do jediného stromu šablon stylů.xsl:import
  2. Přečtěte si vstupní XML data pomocí XML parseru, přeložte jejich obsah do stromu uzlů ( source tree ), podle datového modelu XPath. Dokument XML může odkazovat na jiné zdroje XML pomocí volání funkcí document(). Tato volání jsou obvykle zpracovávána za běhu, protože jejich umístění může být vypočteno a odpovídající volání funkcí se nemusí vůbec objevit. (Výše uvedený příklad neodkazuje na žádné jiné dokumenty.)
  3. Odstraňte ze šablony stylů XSLT prázdné uzly, kromě těch, které jsou potomky xsl:text. Tím se eliminuje výskyt "nadbytečných" prostorů.
  4. Odstraňte prázdné textové uzly ze zdrojového stromu, pokud xsl:strip-spacejsou ve zdrojovém dokumentu přítomny pokyny. Tím se eliminuje výskyt "nadbytečných" prostorů. (Výše uvedený příklad tuto funkci nepoužívá.)
  5. Naplňte strom XSLT třemi pravidly, která poskytují výchozí chování pro všechny typy uzlů, se kterými se lze během zpracování setkat. První pravidlo je zpracovat kořenový uzel ; instruuje procesor, aby zpracoval každého potomka kořenového uzlu. Druhé pravidlo platí pro všechny textové uzly nebo uzly atributů ; instruuje procesor, aby vytvořil kopii tohoto uzlu ve výsledném stromu. Třetí pravidlo platí pro všechny uzly komentářů a uzly instrukcí pro zpracování ; není provedena žádná operace. Šablony explicitně definované v XSLT mohou přepsat některé nebo všechny výchozí šablony pravidel. Pokud šablona neobsahuje žádná explicitní pravidla, vestavěná pravidla se použijí k rekurzivnímu procházení zdrojovým stromem a do výsledného stromu se zkopírují pouze textové uzly (uzly atributů nebudou dosaženy, protože nejsou „dětmi“ svého rodiče. uzly). Výsledek získaný tímto způsobem je obvykle nežádoucí, protože se jedná pouze o zřetězení všech textových fragmentů z původního XML dokumentu.

Procesor poté projde následujícími kroky, aby získal a serializoval výsledný strom.

  1. Vytvoří kořenový uzel výsledného stromu.
  2. Zpracuje kořenový uzel zdrojového stromu. Postup zpracování uzlů je popsán níže.
  3. Serializuje výsledný strom, pokud je to nutné, podle rad popsaných v xsl:output.

Při zpracování uzlu se provádějí následující akce.

  1. Hledá se nejvhodnější šablona pravidla. Toho je dosaženo kontrolou vzoru (což je výraz XPath) pro každé pravidlo s uvedením uzlů, na které lze pravidlo použít. Každému vzoru je procesorem přiřazena relativní priorita a priorita , aby se usnadnilo řešení konfliktů. Pořadí pravidel šablony v šabloně stylů může také pomoci vyřešit konflikty mezi šablonami, které se shodují se stejnými uzly, ale neovlivňuje pořadí, ve kterém jsou uzly zpracovávány.
  2. Obsah pravidla šablony je konkretizován. Prvky ve jmenném prostoru XSLT (obvykle s předponou xsl:) jsou považovány za instrukce a mají speciální sémantiku, která naznačuje, jak by měly být interpretovány. Některé jsou pro přidání uzlů do výsledného stromu, jiné jsou řídicí konstrukce. Ne-XSLT prvky a textové uzly nalezené v pravidle se „doslovně“ zkopírují do výsledného stromu. Komentáře a ovládací pokyny jsou ignorovány.

Instrukce xsl:apply-templatespři zpracování způsobí načtení a zpracování nové sady uzlů. Uzly jsou identifikovány pomocí výrazu XPath. Všechny uzly jsou zpracovány v pořadí, v jakém jsou obsaženy ve zdrojovém dokumentu.

XSLT rozšiřuje knihovnu funkcí XPath a umožňuje definovat proměnné XPath. Tyto proměnné mají v šabloně stylů různý rozsah v závislosti na tom, kde jsou definovány, a jejich hodnoty lze nastavit mimo šablonu stylů. Hodnoty proměnných nelze během zpracování měnit.

Ačkoli se tento postup může zdát komplikovaný, XSLT se svými funkcemi podobá jiným jazykům webových šablon. Pokud se šablona stylů skládá z jediného pravidla pro zpracování kořenového uzlu, celý obsah šablony se jednoduše zkopíruje do výsledku a instrukce XSLT ( xsl:…prvky ' ) se nahradí vypočítaným obsahem. XSLT dokonce nabízí speciální formát ("literal result element as stylesheet") pro takové jednoduché transformace s jednou šablonou. Možnost definovat jednotlivé šablony a pravidla však značně zvyšuje flexibilitu a efektivitu XSLT, zejména při generování výsledku, který se velmi podobá původnímu dokumentu.

Viz také

Literatura

  • Tidwell D. XSLT. 2. vydání = XSLT, 2. vydání. - Petrohrad. : Symbol-Plus , 2009. - 960 s. - 1200 výtisků.  - ISBN 978-5-93286-150-9 .
  • Mangano S. XSLT. Kuchařka = XSLT Kuchařka: Řešení a příklady pro vývojáře XML a XSLT, 2. vydání. - Petrohrad. : BHV , 2008. - 864 s. - ISBN 978-5-9775-0292-4 .
  • Kay M. XSLT. Programátorská příručka. 2nd Edition = XSLT, Programmer's Reference, 2nd Edition. - Petrohrad. : Symbol-Plus , 2002. - 1016 s. - 2000 výtisků.  — ISBN 5-93286-039-1 .
  • Holzner S. XSLT. Programátorská knihovna. 2. vydání = Uvnitř XSLT. - Petrohrad. : Peter , 2002. - 544 s. - 3 kopie.  - ISBN 5-94723-271-5 .

Odkazy