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 &) je nahrazen op∞t zßpisem &. 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:
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: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:
<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 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:
href="book.css" type="text/css"
</xsl:processing-instruction>
A v²sledek:
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
- The Extensible Stylesheet Language Family (XSL) (W3C)
- XSLT v p°φkladech - Ji°φ Kosek