LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Programujeme s XML (15.) - Ovlivňujeme výstup

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 | Články autora | přečteno 4484×

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.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků
> Služby
Administrace serverů
Od 350 Kč/hod
Server housing
Od 1000 Kč/1U

30.7.2010 9:06 /MaReK Olšavský
Krátký článek pro pythonýry připomíná zlatá pravidla programování (vztažitelná i na jiné jazyky). Pokračujte odkazem na konci článku :-).
Přidat komentář

29.7.2010 14:39 /Radim Kolář
IBM vydala další z řady publikací pro studenty Getting started with open source development. Probírají se licence, obchodní modely, příklady OSS projektů a jak se zapojit do vývoje. Dodatek je věnován krátkému úvodu k DB2 databázi.
Přidat komentář

29.7.2010 7:44 /MaReK Olšavský
Při procesu akvizice SUN Microsystems Oraclem se mluvilo především o MySQL a Java platformě, ale Oracle získal mnohem více zajímavých produktů se širokou uživatelskou základnou, například VirtualBox, ke kterému má poněkud macešský přístup. Bude tu VirtualBox pro běžné uživatele, nebo se s ním máme pomalu rozloučit?
Komentářů: 1

29.7.2010 7:08 /MaReK Olšavský
Pokud se uživatelé distribucí Fedora a Ubuntu těšili na pozimní vydání, která měla přinést GNOME 3.0, mohou svá očekávání zmírnit, GNOME 3.0 bude opožděno, snad jen do března 2011.
Přidat komentář

28.7.2010 8:49 /MaReK Olšavský
Možná pro někoho může být překvapující, že CentOS má majoritní podíl mezi webservery. „Bezplatný RHEL“ trochu překvapivě předstihl vyzdvihovaný Debian i FreeBSD.
Komentářů: 5

   Více ...   Přidat zprávičku

> Poslední diskuze

29.7.2010 18:24 / Hynek (Pichi) Vychodil
Re: Kým vyzdvihovaný Debian?

29.7.2010 15:29 / Radim Kolář
Re: Ruchlost kompilace

29.7.2010 12:40 / Radim Kolář
Freebsd

29.7.2010 12:35 / Radim Kolář
mne pada

29.7.2010 12:35 / Slavomir
Rychla maska

Více ...

ISSN 1801-3805 | Prague hotels | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2010) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze