Uživatelsky definované funkce

  • pohodlnější náhrada pojmenovaných šablon

  • nově definovaná funkce je dostupná přímo v XPathu, nemusí se volat pomocí xsl:call-template

  • na rozdíl od xsl:call-template nedostává funkce kontext, v případě potřeby je nutné jej předat jako explicitní parametr

  • pomocí as lze určit typy parametrů a výsledku

  • uvnitř těla funkce lze používat xsl:sequence pro generování výsledku

  • jméno funkce musí být v našem vlastním jmenném prostoru, aby nekolidovalo se zabudovanými funkcemi

Příklad 20. bmi.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="2.0"
                xmlns:f="http://example.com/functions"
                xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- Funce pro výpočet BMI -->
<xsl:function name="f:bmi" as="xs:double">
  <xsl:param name="hmotnost" as="xs:double"/>
  <xsl:param name="vyska" as="xs:double"/>
  
  <xsl:sequence select="$hmotnost div ($vyska * $vyska)"/>
</xsl:function>

<!-- Vlastní formát čísel podle českých zvyklostí -->
<xsl:decimal-format decimal-separator="," grouping-separator="."/>

<xsl:template match="/">
  <html>
    <head>
      <title>Tabulka BMI</title>
    </head>
    <body>
      <table border="1">
        <tr>
          <th>Jméno</th>
          <th>BMI</th>
        </tr>
        <xsl:for-each select="/adresář/osoba">
          <tr>
            <td><xsl:value-of select="jméno"/></td>
            
            <!-- Volání funkce v XPathu -->
            <td><xsl:value-of select="format-number(
                                        f:bmi(váha, výška div 100),
                                        '#,##')"/></td>
          </tr>          
        </xsl:for-each>
      </table>
    </body>
  </html>  
</xsl:template>  

</xsl:stylesheet>