Python-Ref > Mimo python > XSLT > Vytváření odkazů
 
 

<-^^
Klíčová slova
Moduly
Knihovní funkce

Vytváření odkazů

Vytváření odkazů je typickou ukázkou situace, kdy se vyplatí použít módy. Pro krátké kódy sice není tato výhoda natolik zřejmá, ale v případě rozsáhlejšího XSLT ušetří spoustu starostí.
Následující ukázka obsahuje typický případ generování odkazů na jednotlivé stránky, které jsou generovány pomocí XSLT z jednotlivých částí vstupního XML.
Expand/Shrink
<examples>
  <example num="1">
    <title>Introductory example</title>
    <text>This is example nr. 1. It shows how an example looks.</text>
  </example>

  <example num="2">
    <title>Real example</title>
    <text>Another example. Imagine some ingenious text here...</text>
  </example>
</examples>
Zdroj: (xslt4-1.xslt)
  1   <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  2   
  3     <xsl:output indent="yes"/>
  4   
  5     <xsl:template match="/">
  6       <xsl:result-document href="output4-1.html">
  7         <xsl:apply-templates select="examples"/>
  8       </xsl:result-document>
  9     </xsl:template>
 10   
 11     <xsl:template match="examples">
 12       <html>
 13         <head><title>Examples</title></head>
 14         <body>
 15           <ul>
 16             <xsl:for-each select="example">
 17               <li><a href="example-{@num}.html">Example <xsl:value-of select="@num"/> - <xsl:apply-templates select="title"/></a></li>
 18             </xsl:for-each>
 19           </ul>
 20           <xsl:apply-templates select="example"/>
 21         </body>
 22       </html>
 23     </xsl:template>
 24   
 25     <xsl:template match="example">
 26       <xsl:result-document href="example-{@num}.html">
 27         <html>
 28           <head><title><xsl:value-of select="title"/></title></head>
 29           <body>
 30             <h1><xsl:apply-templates select="title"/></h1>
 31             <xsl:apply-templates select="text"/>
 32           </body>
 33         </html>
 34       </xsl:result-document>
 35     </xsl:template>
 36   
 37     <xsl:template match="title">
 38       <xsl:apply-templates/>
 39     </xsl:template>
 40   
 41     <xsl:template match="text">
 42       <div><xsl:apply-templates/></div>
 43     </xsl:template>
 44   </xsl:stylesheet>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Examples</title>
   </head>
   <body>
      <ul>
         <li><a href="example-1.html">Example 1 - Introductory example</a></li>
         <li><a href="example-2.html">Example 2 - Real example</a></li>
      </ul>
   </body>
</html>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Introductory example</title>
   </head>
   <body>
      <h1>Introductory example</h1>
      <div>This is example nr. 1. It shows how an example looks.</div>
   </body>
</html>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Real example</title>
   </head>
   <body>
      <h1>Real example</h1>
      <div>Another example. Imagine some ingenious text here...</div>
   </body>
</html>
Doba běhu: 352.3 ms
Program sice perfektně funguje, ale v případě generování více indexů a složitější metodě pojmenování souborů nás nutí neustále opisovat kód pro vytváření odkazů a pojmenovávání souborů. Snadno v něm pak uděláme chybu a v případě změny způsobu vytváření jmen dojde snadno k naprostému zmatení odkazů.
Následující kód mírně modifikuje předchozí ukázku a je již daleko rozšiřitelnější.
Expand/Shrink
<examples>
  <example num="1">
    <title>Introductory example</title>
    <text>This is example nr. 1. It shows how an example looks.</text>
  </example>

  <example num="2">
    <title>Real example</title>
    <text>Another example. Imagine some ingenious text here...</text>
  </example>
</examples>
Zdroj: (xslt4-2.xslt)
  1   <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  2   
  3     <xsl:output indent="yes"/>
  4   
  5     <xsl:template match="/">
  6       <xsl:result-document href="output4-2.html">
  7         <xsl:apply-templates select="examples"/>
  8       </xsl:result-document>
  9     </xsl:template>
 10   
 11     <xsl:template match="examples">
 12       <html>
 13         <head><title>Examples</title></head>
 14         <body>
 15           <ul>
 16             <xsl:for-each select="example">
 17               <li><xsl:apply-templates mode="link" select="."/></li>
 18             </xsl:for-each>
 19           </ul>
 20           <xsl:apply-templates select="example"/>
 21         </body>
 22       </html>
 23     </xsl:template>
 24   
 25     <xsl:template match="example">
 26       <xsl:variable name="filename"><xsl:apply-templates mode="filename" select="."/></xsl:variable>
 27       <xsl:result-document href="{$filename}">
 28         <html>
 29           <head><title><xsl:value-of select="title"/></title></head>
 30           <body>
 31             <h1><xsl:apply-templates select="title"/></h1>
 32             <xsl:apply-templates select="text"/>
 33           </body>
 34         </html>
 35       </xsl:result-document>
 36     </xsl:template>
 37   
 38     <xsl:template mode="link" match="example">
 39       <xsl:variable name="filename"><xsl:apply-templates mode="filename" select="."/></xsl:variable>
 40       <a href="{$filename}">Example <xsl:value-of select="@num"/> - <xsl:apply-templates select="title"/></a>
 41     </xsl:template>
 42   
 43     <xsl:template mode="filename" match="example">
 44       <xsl:value-of select="concat('example-',@num,'.html')"/>
 45     </xsl:template>
 46   
 47     <xsl:template match="title">
 48       <xsl:apply-templates/>
 49     </xsl:template>
 50   
 51     <xsl:template match="text">
 52       <div><xsl:apply-templates/></div>
 53     </xsl:template>
 54   </xsl:stylesheet>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Examples</title>
   </head>
   <body>
      <ul>
         <li><a href="example-1.html">Example 1 - Introductory example</a></li>
         <li><a href="example-2.html">Example 2 - Real example</a></li>
      </ul>
   </body>
</html>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Introductory example</title>
   </head>
   <body>
      <h1>Introductory example</h1>
      <div>This is example nr. 1. It shows how an example looks.</div>
   </body>
</html>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Real example</title>
   </head>
   <body>
      <h1>Real example</h1>
      <div>Another example. Imagine some ingenious text here...</div>
   </body>
</html>
Doba běhu: 407.4 ms