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/> Kč</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>