Kompletní průvodce XSLT – vkládání dat

27. května 2004

Do výstupu XSL transformace obvykle potřebujeme vložit na různá místa vybraná data ze vstupního dokumentu. V tomto článku se seznámíme s několika XSLT instrukcemi, které slouží právě ke vkládání dat, a naučíme se je efektivně využívat.

Použití výchozích šablon

Nejjednodušší možností, jak přenést data ze vstupu na výstup, je zavolání <apply-templates/>, přičemž můžeme přidat nepovinný parametr select, kterým vybereme ve vstupním dokumentu uzel, odkud se bude čerpat. Pokud pro XML elementy na vstupu nejsou definovány vhodné šablony, použijí se šablony výchozí, které se postarají o překopírování textového obsahu vybraného uzlu. To může být často výhodné, protože autor vstupního dokumentu může text obohatit o libovolné množství sémantických značek uspořádaných do libovolné struktury – vy si ale při transformaci zpracujete vlastními šablonami pouze vámi vybrané značky a zbytek se zahodí, přičemž se ale vždy využije textový obsah.

Někdy potřebujeme takto zpracovat úplně celý vstupní dokument, v tom případě nemusíme vytvářet šablonu pro kořenový element (<xsl:template match="/"></xsl:template>) a pak se i pro tento element použijí výchozí šablony. Více podrobností o tomto způsobu zpracování vstupního dokumentu jste se mohli dočíst v předchozím článku, který pojednává o vytváření šablon a jejich zpracování XSLT procesorem.

Hodnota výrazu (xsl:value-of)

Nechceme-li zpracovávat určitý fragment žádnými šablonami, lze použít instrukci xsl:value-of, která slouží pro vkládání textových dat. Její parametr select obsahuje XPath výraz, který je procesorem vyhodnocen, převeden na řetězec (je-li třeba) XPath funkcí string() a vložen na výstup. XML uzly se převádí na řetězec tak, že se vytáhne opět pouze jejich textový obsah, efekt může být tedy podobný tomu v předchozím případě.

Při vkládání textů XSLT procesor všechny rezervované znaky zakóduje do příslušných XML/HTML entit, tedy například znak & (který je ve vstupním dokumentu zapsán jako &amp;) je nahrazen opět zápisem &amp;. Toto chování nemusí být vždy žádoucí, a proto jej lze vypnout nastavením parametru disable-output-escaping na hodnootu "yes". Pak jsou všechny znaky zkopírovány přesně tak, jak jsou rozkódovány a vytaženy ze vstupu.

Kopírování uzlů (xsl:copy, xsl:copy-of)

Samozřejmě ne vždy nás zajímá pouze textový obsah, můžeme také chtít kopírovat XML uzly ze vstupu. Jsou dvě možnosti, jak to provést, které se liší v tom, zda chceme kopírovat pouze jeden uzel nebo hned celou strukturu.

Kopírování jednoho uzlu (xsl:copy)

Instrukce xsl:copy zkopíruje na výstup pouze aktuální uzel. Jde-li o XML element, nekopírují se automaticky jeho atributy! Pokud má element ve výsledku obsahovat nějaké další uzly, musí být příslušné elementy (nebo instrukce, které je vytvoří) vloženy dovnitř do této instrukce, tedy mezi značky <xsl:copy> a </xsl:copy>.

Kopírování všech uzlů (xsl:copy-of)

Instrukce xsl:copy-of má povinný parametr select (jak jinak), který je vyhodnocen a jehož výsledek je zkopírován do výstupu jako celý XML fragment.

Šablony hodnot atributů

Atributy k elementům v šablonách můžeme samozřejmě zapisovat naprosto běžným způsobem přímo do těchto elementů. Je tady však možnost zápisu XPath výrazů do hodnot těchto atributů, a to pomocí složených závorek ({ a }). Vše osvětlí naprosto jednoduchý příklad:

<img src=“{/config/path}/obrazek.gif“ />

Text ve složených závorkách (/config/path) se vyhodnotí, tedy nalezne se příslušný uzel ze vstupu, vytáhne se jeho řetězcová hodnota a doplní se zbytkem hodnoty atributu (/obrazek.gif). Lze tak velice snadno používat data ze vstupního dokumentu jako atributy libovolných elementů.

Vytváření elementů (xsl:element)

Do výstupu lze vkládat elementy jejich jednoduchým vložením na správné místo do šablony v transformačním stylu. Co když ale název elementu předem neznáme? I na tuto situaci je pamatováno. Existuje značka xsl:element, jejíž atribut name je řetězec, určující výsledný název elementu. Tento parametr lze zapsat stejně jako šablony atributů, tedy lze zapisovat XPath výrazy ve složených závorkách. Můžeme také definovat jmenný prostor pomocí parametru namespace. Pokud má mít element atributy nebo další podřízené elementy, jsou tyto uzly vloženy do těla instrukce, tedy mezi otevírací a uzavírací tag. Zde je možné volat jiné šablony a používat jakékoli jiné XSLT instrukce.

<xsl:element name=“{$BlockElement}“>
  <xsl:apply-templates />
</xsl:element“>

Vytváření atributů (xsl:attribute)

Tato instrukce vytvoří k nadřízenému elementu atribut. Název a jmenný prostor jsou dány opět v parametrech name a namespace, opět lze využít XPath výrazy ve složených závorkách. Takto lze přidávat atributy nejen ke značkám vloženým pomocí xsl:element, ale také k elementům zapsaným přímo. Tedy například lze zapsat:

<img src=“img/obrazek.gif“>
  <xsl:attribute name=“alt“>popis obrázku</xsl:attribute>
</img>

Jak jste si jistě všimli, hodnota atributu se vkládá do těla instrukce. Pokud chcete tuto hodnotu vyjádřit nějakým XPath výrazem, není problém využít instrukci xsl:value-of. Rovněž je možné uvnitř této instrukce volat jiné šablony s tím, že výsledek jejich zpracování bude převeden na řetězec a vložen do hodnoty vytvářeného atributu. Pokud k jednomu elementu vytvoříte několik stejnojmenných atributů, procesor aplikuje pouze první a zbytek bude ignorován. Všechny atributy musí být definovány dříve než první podřízený element, pokud bude nějaký atribut definován později, měl by jej XSLT procesor ignorovat.

Skupinu atributů (xsl:attribute-set)

V XSLT lze definovat skupinu atributů pomocí značky xsl:attribute-set, která se zapisuje do nejvyšší úrovně XSLT dokumentu, přímo do značky xsl:stylesheet, je pojmenovaná nějakým unikátním názvem a obsahuje množinu několika atributů. Všechny tyto atributy pak budou snadno použitelné pod jedním společným názvem. Malý příklad včetně ukázky využití:

<xsl:attribute-set name=“table-nospacing“>
  <xsl:attribute name=“cellspacing“>0</xsl:attribute>
  <xsl:attribute name=“cellpadding“>0</xsl:attribute>
</xsl:attribute-set>
<table xsl:use-attribute-sets=“table-nospacing“>
  …
</table>
<xsl:element name=“table“
  use-attribute-sets=“table-nospacing“>
  …
</xsl:element>

Takto vytvořený a pojmenovaný soubor atributů lze snadno použít kdekoli je to potřeba pomocí xsl:use-attribute-sets (při použití v XSL instrukci samozřejmě prefix xsl: nemusíme uvádět).

Vytváření textových uzlů (xsl:text)

Textové uzly lze kromě přímého zápisu a ostatními instrukcemi vkládat také speciální instrukcí xsl:text, jejíž atribut disable-output-escaping nastavený na "yes" zakáže kódování znaků entitami podobně, jako u instrukce xsl:value-of. Obsah této instrukce není fragment šablony, ale musí být zapsán přímo – nesmí obsahovat žádné další XSLT instrukce.

Vytváření procesních instrukcí (xsl:processing-instruction)

XSLT instrukce xsl:processing-instruction vloží do dokumentu procesní instrukci, jejíž název se skrývá v parametru name. Do těla instrukce přímo napíšeme parametry procesní instrukce, jak ukazuje následující příklad:

<xsl:processing-instruction name=“xml-stylesheet“>
  href=“book.css“ type=“text/css“
</xsl:processing-instruction>

A výsledek:

<?xml-stylesheet href=“book.css“ type=“text/css“?>

Vytváření komentářů (xsl:comment)

Komentáře lze do výsledků vkládat pomocí instrukce xsl:comment. Tělem instrukce může být opět cokoli, výsledek zpracování je pak vložen jako obsah komentáře.

Shrnutí

Na závěr si uvedeme přehlednou tabulku, která shrnuje všechny prvky jazyka XSLT, kterými lze vytvářet výsledný dokument (result tree). Šablona jako obsah prvku znamená, že obsahem může být libovolný fragment XSLT šablony a také je tak vyhodnocen.

Zápis Atributy Obsah Výsledný uzel
přímý zápis elementů a atributů šablona elementy, atributy
{výraz} XPath výraz fragment hodnoty atributů
<xsl:value-of> select (XPath)
disable-output-escaping (yes/no)
textový uzel
<xsl:copy> use-attribute-sets (qname) šablona kopie aktuálního uzlu
<xsl:copy-of> select (XPath) kopie výsledku výrazu včetně podřízených prvků
<xsl:element> name (qname)
namespace (uri)
use-attribute-sets (qnames)
šablona element
<xsl:attribute> name (qname)
namespace (uri)
šablona atribut
<xsl:text> disable-output-escaping (yes/no) řetězec textový uzel
<xsl:processing-instruction> name (ncname) šablona procesní instrukce
<xsl:comment> šablona komentář

Odkazy, zdroje

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *