Potřebujete pomoci s XSLT?
Nabízím školení, konzultace, vývoj XSLT kódu na zakázku. Nevájte a kontaktujte mne.

Podpořte provoz stránek
Platba probíhá pomocí služby PayPal a je možné platit kartou nebo převodem z vašeho PayPal účtu.

3.4 Podmíněné zpracování

3.4.1. Podmíněný příkaz – <xsl:if>
3.4.2. Podmíněné větvení – <xsl:choose>

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.

3.4.1 Podmíněný příkaz – <xsl:if>

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/></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"/></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.

3.4.2 Podmíněné větvení – <xsl:choose>

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/></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"/></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>

© Jiří Kosek 2014

Tento dokument je určen výhradně pro osobní potřebu seznámení s jazykem XSLT. Jakékoliv jiné použití, včetně dalšího šíření, pořizování kopií, použití při školeních a výuce apod. je výslovně zakázáno a bude považováno za porušení autorských práv.


Copyright © 2000-2014 Jiří Kosek