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