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