Ačkoli by nám funkcionalita z minulých dílů leckdy stačila, nabízí nám XSLT mnohem víc, dnes se tedy podíváme na podmínky v šablonách.
31.8.2004 15:00 | Aleš Hakl | přečteno 14763×
Jazyk XSLT obsahuje dva druhy konstrukcí umožnujících podmíněně
začleňovat různé části šablon. Jedná se o element
xsl:if
, který nám začlení nebo vypustí část
šablony v závislosti na hodnotě daného výrazu jazyka XPath, a o
elementy xsl:choose
, xsl:when
,
xsl:otherwise
pomocí kterých můžeme na jednom místě
šablony snadno vybrat z několika různých částí.
Jednotlivé elementy můžeme do sebe libovolným způsobem zanořovat, ovšem
smíme je použít pouze uvnitř elementu xsl:template
.
xsl:if
Element xsl:if
je na použití nesmírně jednoduchý,
disponuje pouze jedním atributem test
, jehož obsahem
je výraz jazyka XPath, pokud se tento výraz rovná true
je obsah elementu použit, jinak je přeskočen.
Vraťme se k naší ukázce s telefoním seznamem. Představme si, že
chceme omezit zobrazování některých údajů a proto ke všem elementům
tvořícím sloupce tabulky přidáme atribut private
. A
nyní můžeme použít instrukci xsl:if
k zobrazení jen
některých údajů například takto:
<xsl:template match="phone|email"> <td> <xsl:if test="not(@private)"> <xsl:apply-templates /> </xsl:if> </td> </xsl:template>
xsl:choose
Element nemá žádné atributy a seskupuje několik elementů
xsl:when
a případně jako poslední položku element
xsl:otherwise
. Každý element xsl:when
má
stejně jako element xsl:if
atribut test
.
Celý element xsl:choose
je pak nahrazen obsahem prvního
elementu xsl:when
, u kterého se výraz v atributu
test
vyhodnotí na true
a v případě, že
existuje element xsl:otherwise
a všechny elementy
xsl:when
měly atribut test
rovný
false
, je použit obsah elementu
xsl:otherwise
Tuto konstrukci můžeme použít k vylepšení předchozí ukázky, budeme buďto vypisovat hodnotu daného sloupce a nebo text, který má za úkol vysvětlit uživateli, proč tam žádná hodnota není.
<xsl:template match="phone|email"> <td> <xsl:choose> <xsl:when test="@private"> Nezveřejněno </xsl:when> <xsl:when test="string(.)!=''"> <xsl:apply-templates /> </xsl:when> <xsl:otherwise> Nezadáno </xsl:otherwise> </xsl:choose> </td> </xsl:template>
Spolu s konstrukcemi pro větvení zpracování je vhodné zmínit
element
xsl:message
, pomocí kterého můžeme vypisovat
různá hlášení v průběhu zpracování dokumentu, může se jednat o
hlášení o průběhu, ladicí výpisy nebo třeba chybová hlášení.
Element xsl:message
má atribut terminate
,
který, jak již
název napovídá, určuje, zda-li bude transformace po výpisu této
zprávy ukončena a nebo se v ní bude pokračovat. Implicitně má
hodnotu "no"
která způsobuje pokračování v
transformaci, transformaci ukončíme hodnotou "yes"
Tento element můžeme s výhodou použít spolu s elementem
xsl:if
jako jednoduchý test na nesmyslné nebo nemožné stavy,
hloupého uživatele a podobně,
stejně jako se v C/C++ často používá makro assert()
.
Například takto můžeme zabezpečit, že jméno a příjmení musí být vždy vyplněno:
<xsl:template match="first-name|surname"> <xsl:if test="string(.)==''"> <xsl:message terminate="yes">Jmeno musi byt vyplneno</xsl:message> </xsl:if> <th> <xsl:apply-templates /> </th> </xsl:template>
Pokud nekteré jméno nevyplníme, dočkáme se následujícího výstupu:
$ xsltproc phonebook2.xsl phonebook.xml > pb.html Jmeno musi byt vyplneno
Zde bych pro dnešek skončil, příště se podíváme na různé pokročilé vlastnosti související s výstupem dokumentu.