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.

11.2 Odvození struktury dokumentu

XML dokumenty, které zpracováváme, bývají obvykle velice dobře strukturovány a styl tuto strukturu spíše ochuzuje. V některých případech však potřebujeme strukturovanost dokumentů ještě zlepšit. Jako příklad nám může opět poslužit katalog výrobků. Jednotlivé části popisu jsou odděleny tagem <br/>. Pokud bychom z takového popisu chtěli udělat seznam s odrážkami, musíme na položku seznamu převést všechny informace mezi značkami <br/>. Pro takovýto typ operací však není v XSLT žádný přímočarý nástroj.

Následující příklad ukazuje přístup, který ilustruje zcela odlišný přístup ke zpracování dokumentu, než jsme doposud používali. Nejprve nalezneme všechny uzly, které jsou těsně za <br/> a pro ně pak voláme funkci, která zpracovává všechny jejich následující sourozence, dokud se nenarazí na další <br/>.

Příklad 11.3. Odvození struktury dokumentu – katalog-odrazky.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>
        
        <xsl:apply-templates select="//polozka"/>       
      </BODY>
    </HTML>
  </xsl:template>
  
  <xsl:template match="polozka">
    <xsl:apply-templates/>
    <HR/>
  </xsl:template>
  
  <xsl:template match="nazev">
    <H2><xsl:apply-templates/></H2>
    <xsl:if test="../foto/@href">
      <IMG src="{../foto/@href}" alt="{.}" align="right"/>
    </xsl:if>
  </xsl:template>

  <xsl:template match="kategorie">
    <EM><xsl:apply-templates/></EM>
  </xsl:template>

  <xsl:template match="cena">
    <STRONG> - <xsl:apply-templates/></STRONG>
  </xsl:template>

  <xsl:template match="popis">
    <UL>
      <xsl:for-each 
        select="node()[(preceding-sibling::node()[position()=1 
                                                  and self::br]) 
                       or (position()=1)]">
        <li>
          <xsl:call-template name="process-self-and-go-next">
            <xsl:with-param name="node" select="."/>
          </xsl:call-template>
        </li>
      </xsl:for-each>
    </UL>
  </xsl:template>

  <xsl:template name="process-self-and-go-next">
    <xsl:param name="node" select="."/>

    <xsl:apply-templates select="$node"/>

    <xsl:if test="$node/following-sibling::node()[1][not(self::br)]">
      <xsl:call-template name="process-self-and-go-next">
        <xsl:with-param name="node" 
                        select="$node/following-sibling::node()[1]"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

  <xsl:template match="b">
    <FONT COLOR="RED"><xsl:apply-templates/></FONT>
  </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