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 | czytane 14748×
RELATED ARTICLES
KOMENTARZE
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.