I když lze pomocí šablon a XPath predikátů vyřešit mnoho věcí, v některých případech je vhodné použít podmínky.
Pomocí <xsl:if>
můžeme
podmíněně vykonat část XSLT kódu. Podmínka se zadává v atributu
test
a je to XPath výraz, který
vrací logickou hodnotu. Pokud je tento výraz pravdivý, provede se
podmíněná část.
<xsl:if test="podmínka
">příkazy
</xsl:if>
Využití podmínky si ukážeme na upraveném stylu pro katalog zboží, který vloží do výstupu obrázek jen u těch výrobků, které ho mají definován.
Příklad 3.4. Ukázka použití podmínky – katalog-obrazky.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" encoding="utf-8"/> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Katalog <xsl:value-of select="katalog/info/firma"/></TITLE> </HEAD> <BODY> <H1>Katalog <xsl:value-of select="katalog/info/firma"/></H1> <TABLE WIDTH="100%" BORDER="1"> <xsl:apply-templates select="//polozka"/> </TABLE> <xsl:apply-templates select="//polozka" mode="detailni"/> </BODY> </HTML> </xsl:template> <xsl:template match="polozka"> <TR> <xsl:apply-templates select="nazev|kategorie|cena"/> </TR> </xsl:template> <xsl:template match="nazev"> <TH><xsl:apply-templates/></TH> </xsl:template> <xsl:template match="kategorie"> <TD align="right"><xsl:apply-templates/></TD> </xsl:template> <xsl:template match="cena"> <TD align="right"><xsl:apply-templates/> Kč</TD> </xsl:template> <xsl:template match="polozka" mode="detailni"> <xsl:apply-templates mode="detailni"/> <HR/> </xsl:template> <xsl:template match="nazev" mode="detailni"> <H2><xsl:apply-templates mode="detailni"/></H2> <xsl:if test="../foto/@href"> <IMG src="{../foto/@href}" alt="{.}" align="right"/> </xsl:if> </xsl:template> <xsl:template match="kategorie" mode="detailni"> <EM><xsl:apply-templates mode="detailni"/></EM> </xsl:template> <xsl:template match="cena" mode="detailni"> <STRONG> - <xsl:apply-templates mode="detailni"/> Kč</STRONG> </xsl:template> <xsl:template match="popis" mode="detailni"> <P><xsl:apply-templates mode="detailni"/></P> </xsl:template> <xsl:template match="br" mode="detailni"> <BR/> </xsl:template> </xsl:stylesheet>
Na rozdíl od běžných jazyků, není zde k dispozici část else. To se většinou obchází využitím následujícího příkazu.
Tento příkaz umožňuje větvit zpracování do několika nezávislých větví. Syntaxe je následující:
<xsl:choose> <xsl:when test="podmínka
">příkazy
</xsl:when> <xsl:when test="podmínka
">příkazy
</xsl:when> <xsl:when test="podmínka
">příkazy
</xsl:when> ... <xsl:otherwise>příkazy
</xsl:otherwise> </xsl:choose>
Při zpracování se postupně prochází jednotlivé podmínky u
<xsl:when>
, dokud není nějaká
splněna. V ní uzavřené příkazy se pak provedou. Pokud nevyhovuje
žádná podmínka, provedou se příkazy uvedené v <xsl:otherwise>
.
Pro vytvoření ekvivalentu konstrukce if-then-else se použije
varianta s jednou částí <xsl:when>
.
Příklad lze řešit mnoha způsoby. Jeden méně tradiční, ale velice univerzální, ukazuje následující příklad.
Příklad 3.5. Ukázka netradičního využití skupiny atributů – katalog-obrazky2.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" encoding="utf-8"/> <!-- Skupinu atributů lze využít i jako univerzální nástroj pro podbarvování řádků tabulky --> <xsl:attribute-set name="podbarveni-radku"> <xsl:attribute name="bgcolor"> <xsl:choose> <xsl:when test="position() mod 2 = 1">#FF8000</xsl:when> <xsl:otherwise>#FFE000</xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:attribute-set> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Katalog <xsl:value-of select="katalog/info/firma"/></TITLE> </HEAD> <BODY> <H1>Katalog <xsl:value-of select="katalog/info/firma"/></H1> <TABLE WIDTH="100%" BORDER="1"> <xsl:apply-templates select="//polozka"/> </TABLE> <xsl:apply-templates select="//polozka" mode="detailni"/> </BODY> </HTML> </xsl:template> <xsl:template match="polozka"> <TR xsl:use-attribute-sets="podbarveni-radku"> <xsl:apply-templates select="nazev|kategorie|cena"/> </TR> </xsl:template> <xsl:template match="nazev"> <TH> <xsl:apply-templates/> </TH> </xsl:template> <xsl:template match="kategorie"> <TD align="right"> <xsl:apply-templates/> </TD> </xsl:template> <xsl:template match="cena"> <TD align="right"><xsl:apply-templates/> Kč</TD> </xsl:template> <xsl:template match="polozka" mode="detailni"> <xsl:apply-templates mode="detailni"/> <HR/> </xsl:template> <xsl:template match="nazev" mode="detailni"> <H2> <xsl:apply-templates mode="detailni"/> </H2> <xsl:if test="../foto/@href"> <IMG src="{../foto/@href}" alt="{.}" align="right"/> </xsl:if> </xsl:template> <xsl:template match="kategorie" mode="detailni"> <EM> <xsl:apply-templates mode="detailni"/> </EM> </xsl:template> <xsl:template match="cena" mode="detailni"> <STRONG> - <xsl:apply-templates mode="detailni"/> Kč</STRONG> </xsl:template> <xsl:template match="popis" mode="detailni"> <P> <xsl:apply-templates mode="detailni"/> </P> </xsl:template> <xsl:template match="br" mode="detailni"> <BR/> </xsl:template> </xsl:stylesheet>