Volání PHP funkcí z XSLT

Příklad 21. 11/funkce.php

<?php

// funkce vracející maximální číselnou hodnotu ze seznamu uzlů
function maxValue($nl)
{
  if (count($nl) == 0)
    return false;
    
  if (count($nl) == 1)
    return (double)$nl[0]->textContent;
  else
  {
    $max = (double)$nl[0]->textContent;
    foreach ($nl as $node)
    {
      if ((double)$node->textContent > $max)
        $max = (double)$node->textContent;
    }
    return $max;
  }
}

// funkce vracející uzel s maximální číselnou hodnotu ze seznamu uzlů
function maxNode($nl)
{
  if (count($nl) == 0)
    return false;
    
  if (count($nl) == 1)
    return $nl[0];
  else
  {
    $max = (double)$nl[0]->textContent;
    $maxNode = $nl[0];
    foreach ($nl as $node)
    {
      if ((double)$node->textContent > $max)
      {
        $max = (double)$node->textContent;
        $maxNode = $node;
      }
    }
    return $maxNode;
  }
}

// načtení dokumentu XML
$xml = new DomDocument();
$xml->load("katalog.xml");

// načtení stylu XSLT
$xsl = new DomDocument();
$xsl->load("php-funkce.xsl");

// vytvoření procesoru XSLT
$proc = new xsltprocessor();
$proc->registerPhpFunctions();
$proc->importStylesheet($xsl);

// provedení transformace a vypsání výsledku
echo $proc->transformToXML($xml);

?>

Příklad 22. 11/php-funkce.xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:php="http://php.net/xsl"
                extension-element-prefixes="php"
                version="1.0">

<xsl:template match="/">
  Maximální cena položky: 
    <xsl:value-of select="php:function('maxValue', //cena)"/>
    <br/>

  Jméno položky s maximální cenou: 
    <xsl:value-of select="php:function('maxNode', //cena)/../nazev"/>
    <br/>
  
  Hash názvu firmy:
    <xsl:value-of select="php:functionString('md5', /katalog/info/firma)"/>
</xsl:template>

</xsl:stylesheet>