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 12578×
			
		
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.