2015-09-14 1 views
0

Мне нужно переместить PHP-сайт, который я унаследовал, который использует XSLT с сервера, который запускает PHP 5.2 до PHP 5.4. На этом сайте скрипт index.php загружает XSL-шаблон, строит XML и фиксирует его в выходном буфере. Затем XML передается в XSLTProcessor и где параметры устанавливаются и печатается HTML.XSLT transformToXml ошибки времени выполнения

$xsl = new DomDocument(); 
$xsl->load('xsl/homepage.xsl'); 
... 
ob_start(); 
// echo XML here 
$xml = ob_get_contents(); 
ob_end_clean(); 
$dom = new DomDocument(); 
$dom->loadXML($xml); 
$dom->xinclude(); 
$xslt = new XSLTProcessor(); 
$xslt->importStylesheet($xsl); 
$xslt->setParameter(null, $params); 
echo $xslt->transformToXml($dom); 

Проблема заключается в том, что на сервере, на котором работает PHP 5.4 Я получаю много ошибок для неопределенных переменных в шаблоне XSLT:

Warning: XSLTProcessor::transformToXml(): runtime error: file homepage.xsl line 156 element if in index.php on line 44 
Warning: XSLTProcessor::transformToXml(): Variable 'image_source' has not been declared. in index.php on line 44 
... 

и генерация HTML заканчивается там. Теперь в документации PHP (http://php.net/manual/en/xsltprocessor.transformtoxml.php) для transformToXml указано, что эта функция должна возвращать FALSE при ошибке. Однако вместо этого он возвращает частично преобразованный HTML.

При осмотре я обнаружил, что существует целый ряд переменных, определенных в шаблоне XSLT, которые не присутствуют в $params, например:

156: <xsl:if test="$image_source!=''"> 
157:  <a class="slideShow"> 
158:   <xsl:attribute name="href"><xsl:value-of select="/root/homepage/attributes/featured_link" /></xsl:attribute> 
159:   <xsl:for-each select="/root/gallery/files/file"> 
160:    <img class="centralColumnImage noDisplay" src="./image.php?w=460&amp;keepAspect=y&amp;img={./source}"> 
161:     <xsl:if test="position() ='1'"> 
162:      <xsl:attribute name="class">centralColumnImage</xsl:attribute> 
163:     </xsl:if> 
164:    </img> 
165:   </xsl:for-each> 
166:  </a> 
167: </xsl:if> 

Ответ на In XSLT how do you test to see if a variable exists? утверждает, что это не должно работать. Однако на сервере, который запускает PHP 5.2, этот код, по крайней мере, работает на этом сервере без проблем. Кроме того, я проверил переменную $params на сервере PHP 5.2, и их содержимое идентично: то есть оба не имеют image_source или любых других переменных, указанных в файле XSL.

Это может быть характерно для PHP 5.2? Я просмотрел руководства по миграции для PHP 5.2 и PHP 5.3, а для PHP 5.3 - PHP 5.4 - но я не смог найти обратно несовместимые модификации DOMDocument или XSLTProcessor.

+0

Можете ли вы показать деталь на линии 156? Мне кажется, что '$ image_source' просто не был объявлен. Возможно, опечатка? В качестве подкупа: загрузите таблицу стилей в редакторе XSLT и отладчике (google и найдите oXygen или другие ...), чтобы обнаружить ошибку напрямую. – Abel

+0

@Abel извините, это в оригинальном посте выше, я только что обновил номера строк. Существуют и другие переменные, отличные от источника изображения, которые также не определены. Беда в том, что есть, возможно, более 100 переменных, которые не определены на всем сайте. Проблема, которую я пытаюсь решить, почему это работает на сервере PHP 5.2, несмотря на неопределенные переменные? Благодаря! –

+0

Tx Кроме того, вы также можете показать (скопировать/вставить из оригинала) строку, где объявляется '$ image_source', и глобально или нет? – Abel

ответ

0

В ОП-х pastie code, учитывая в комментариях, это было показано, что следующая строка существует где-то в XSLT (полный XSLT не дано, следовательно, не представляется возможным проверить):

./xsl/homepage.xsl: <!--<xsl:param name="image_source"/> 
./xsl/homepage.xsl:  <xsl:if test="$image_source!=''"> 

свалка не показать номера строк или контекст, поэтому трудно понять, действительно ли это виновник. Было 12 хитов за image_source, что говорит о том, что имя используется в изобилии.

В XSLT вы можете использовать только имя в пределах своей области действия, которое обычно находится в его контейнере для установки фокуса, например xsl:template, xsl:for-each.