Navigace

Hlavnφ menu

 

Kompletnφ pr∙vodce XSLT - vklßdßnφ dat

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ßpisAtributyObsahV²sledn² uzel
p°φm² zßpis element∙ a atribut∙-Üablonaelementy, atributy
{v²raz}-XPath v²razfragment hodnoty atribut∙
<xsl:value-of>select (XPath)
disable-output-escaping (yes/no)
-textov² uzel
<xsl:copy>use-attribute-sets (qname)Üablonakopie 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)
Üablonaelement
<xsl:attribute>name (qname)
namespace (uri)
Üablonaatribut
<xsl:text>disable-output-escaping (yes/no)°et∞zectextov² uzel
<xsl:processing-instruction>name (ncname)Üablonaprocesnφ instrukce
<xsl:comment>-Üablonakomentß°

Odkazy, zdroje

B°φza, Petr (27. 5. 2004)