/**
  * Runs a transformation
  *
  * @param   string xml
  * @param   string callback
  * @param   string[] arguments
  * @param   string xslEncoding default 'utf-8'
  * @return  string
  */
 protected function runTransformation($xml, $callback, $arguments, $xslEncoding = 'utf-8')
 {
     sscanf($callback, '%[^:]::%s', $name, $method);
     $p = new DomXSLProcessor();
     $p->registerInstance('this', $this);
     $p->setXMLBuf($xml);
     $p->setXSLBuf(sprintf('<?xml version="1.0" encoding="%s"?>
     <xsl:stylesheet 
      version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:php="http://php.net/xsl"
     >
       <xsl:output method="text"/>
       
       <xsl:template match="/">
         <xsl:value-of select="php:function(\'XSLCallback::invoke\', \'%s\', \'%s\'%s)"/>
       </xsl:template>
     </xsl:stylesheet>
     ', $xslEncoding, $name, $method, $arguments ? ', ' . implode(', ', $arguments) : ''));
     $p->run();
     return $p->output();
 }