V minulých dílech jsme si ukázali mnoho možností jazyka XSLT, ale zatím jsme pouze doplňovali text do dokumentu s víceméně statickou strukturou, dnes se tedy podíváme, jak můžeme vytvařet i tuto strukturu pomocí XSLT.
7.9.2004 15:00 | Aleš Hakl | přečteno 11940×
První problém, na který nejspíše narazíme, je jak doplnit výsledek výrazu do atributu nějakého elementu. XSLT nám v tomto případě nabízí hned dvě řešení, my se nejprve podíváme na jednodušší možnost:
<a href="#{generate-id()}"> . . .
V hodnotách atributů jsou výrazy jazyka XPath ve složených závorkách automaticky vyhodnoceny, pokud do atributu chceme vložit složené závorky, musíme je zdvojit.
V ukázce jsem použil funkci jazyka XSLT generate-id()
,
která si zaslouží bližší vysvětlení. Tato funkce vrátí
unikatní identifikátor uzlu zadaného jako parametr (nebo aktuálního
uzlu). Způsob, jakým je použita v ukázce, je jeden z nejtypičtějších.
Vytvářím odkaz v rámci dokumentu pomocí pojmenovaných elementů
a
.
V jazyce XSLT je ovšem možné vygenerovat do výstupního dokumentu
téměř libovolný XML uzel. Můžeme k tomu použít elementy
xsl:element
, xsl:attribute
,
xsl:text
, xsl:comment
a
xsl:processing-instruction
.
Element xsl:element
nám umožňuje vložit do výstupu
libovolný element, pomocí jeho atributu name
určíme
jeho jméno, prostřednictvím namespace
určíme adresu
URI jmenného prostoru a pomocí atributu
use-attribute-sets
můžeme použít takzvanou sadu
atributů (viz dále). Výsledek je stejný, jako kdybychom takový
element přímo uvedli v šabloně, ovšem v tomto případě můžeme v
atributech name
a namespace
použít výraz
ve složenných závorkách a určovat jejich hodnotu za běhu.
Elementem xsl:attribute
můžeme nastavovat atributy
elementů na hodnotu šablony. Atributy name
a
namespace
jsou stejné jako u elementu
xsl:element
, šablona uvedená uvnitř elementu bude
použita jako hodnota výsledného atributu. Element se vždy vztahuje
k obsahujícímu elementu výstupu, ať již přímo zapsanému v šabloně
nebo vytvořenému prostřednictvím xsl:element
. Není
možné přidávat atributy poté, co byl do elementu již vložen nějaký
obsah (text, jiný element...), ale je možné použít element
xsl:attribute
uvnitř konstrukce typu
xsl:for-each
(ačkoli si příliš nedovedu představit
rozumné využití této vlastnosti).
Související element xsl:attribute-set
nám umožňuje
ušetřit si psaní při nastavování spousty stejných atributů
(nejužitečnější je to pro
XSL:FO). Tento element obsahuje více elementů xsl:attribute
které pojmenovává. Atribut name
je právě toto jméno, v atributu use-attribute-sets
můžeme uvést názvy jiných sad atributů oddělené mezerou, které budou použity jako součást této sady.
Stejným způsobem můžeme použitím atributu
use-attribute-sets
připojit sadu nebo sady k elementům
xsl:element
nebo xsl:copy
. Taktéž můžeme
tyto atributy připojit pomocí speciálnío atributu
xsl:use-attribute-sets
přímo k elementu zapsanému
v šabloně: <nejaky-element
xsl:use-attribute-sets="nejaka-sada-atributu" />
Vlastnost, která nemusí být na první pohled zřejmá je, že se
elementy xsl:attribute
vyhodnocují stejně jako
kdybychom je přímo zapsali a výrazy jazyka XPath jsou vyhodnoceny
pokaždé znovu, proto můžeme bez problémů používat jakýkoli výraz
jazyka XPath který bychom použili normálně v elementu
xsl:attribute
.
Také můžeme generovat komentáře a instrukce pro zpracování
prostřednictvím elementů xsl:comment
a
xsl:processing-instruction
. V obou případech se obsah
elementu použije jako obsah výsledného komentáře nebo instrukce,
pro element xsl:processing-instruction
musíme uvést
také atribut name
, který určí to, čemu XSLT říká název
a XML identifikátor cíle ^_~.
Prostřednictvím elementu xsl:text
můžeme do dokumentu
vkládat textový obsah. Ačkoli to na první pohled vypadá jako
zbytečné, jedná se o jediný spolehlivý způsob, jak do výstupního
dokumentu vložit sérii mezer a jak zabránit tomu, aby odsazování
XSLT šablony ovlivňovalo výstupní dokument. Také můžeme nastavením
atributu disable-output-escaping
na "yes"
zakázat konverzi znaků <>"'&
na
entity.
Mnoho ohledně výstupu také ovlivníme prostřednictvím elementu
xsl:output
, kterého jsme se lehce dotkli v
devátém díle. Teď se tedy podíváme na jeho atributy detailněji:
cdata-section-elements
- Seznam názvů elementů
výstupu oddělených mezerami, jejichž textový obsah bude zapsán
jako sekce CDATA namísto prostého textu
doctype-public
- Veřejný identifikátor definice typu
dokumentu výstupu.
doctype-system
- Systémový identifikátor (typicky
URI) definice typu dokumentu výstupu.
encoding
- Preferované kódování výstupu. V případě
výstupu jako text by mělo dojít k chybě, pokud se ve výstupu
vyskytuje znak, který není možné v tomto kódování vyjádřit.
indent
- Určuje bude-li bude výstup odsazován.
media-type
- Typ výstupního dokumentu dle MIME (
například text/html
nebo
application/xml
...).
method
- Způsob výstupu: "xml"
,
"html"
nebo "text"
omit-xml-declaration
- Pokud je nastaveno na
"yes"
, bude ve výstupu vynechána XML deklarace
(<?xml version=
...)
standalone
- Určuje hodnotu "atributu"
standalone
ve výstupní XML deklaraci.
version
- Verze XML použitá pro výstup, v současné
době má smysl 1.0 a 1.1, přičemž bych předpokládal, že žádný XSLT
procesor zatím neumí vlastnosti XML 1.1 využít (a ještě více bych
předpokládal, že žádný uživatel nemá důvod vlastnosti XML 1.1
využít ^_~). Pokud zadáme verzi,
kterou procesor nepodporuje, bude jednoduše ignorována a použita
podporovaná.
Zde dnešní povídání o výstupu z XSLT zakončíme a příště se podíváme
na rozdíly mezi různými hodnotami atributu method
u
elementu xsl:output
.