1--TEST-- 2Bug #70078 (XSL callbacks with nodes as parameter leak memory) 3--SKIPIF-- 4<?php 5if (!extension_loaded('xsl')) die('skip xsl extension not available'); 6?> 7--FILE-- 8<?php 9// create big dummy document: 10$dom = new \DOMDocument(); 11$rootNode = $dom->appendChild($dom->createElement('root')); 12for ($i = 0; $i <= 100; $i++) { 13 $level1Node = $rootNode->appendChild($dom->createElement('level1')); 14 for ($j = 0; $j <= 100; $j++) { 15 $level2Node = $level1Node->appendChild($dom->createElement('level2')); 16 for ($k = 0; $k <= 10; $k++) { 17 $level3Node = $level2Node->appendChild($dom->createElement('level3', 'test')); 18 } 19 } 20} 21 22function testPhpFunction($node) { 23 return 'test2'; 24} 25 26$xslStr = <<<EOF 27<?xml version="1.0" encoding="utf-8"?> 28<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl"> 29 <xsl:template match="root"> 30 <output> 31 <xsl:for-each select="level1"> 32 <node> 33 <xsl:value-of select="php:function('testPhpFunction', .)" /> 34 </node> 35 </xsl:for-each> 36 </output> 37 </xsl:template> 38</xsl:stylesheet> 39EOF; 40 41$xsl = new \DOMDocument(); 42$xsl->loadXML($xslStr); 43$xslt = new \XSLTProcessor(); 44$xslt->registerPHPFunctions('testPhpFunction'); 45$xslt->importStyleSheet($xsl); 46 47echo $xslt->transformToXML($dom); 48?> 49--EXPECT-- 50<?xml version="1.0"?> 51<output xmlns:php="http://php.net/xsl"><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node></output> 52