Мне нужно переместить 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&keepAspect=y&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.
Можете ли вы показать деталь на линии 156? Мне кажется, что '$ image_source' просто не был объявлен. Возможно, опечатка? В качестве подкупа: загрузите таблицу стилей в редакторе XSLT и отладчике (google и найдите oXygen или другие ...), чтобы обнаружить ошибку напрямую. – Abel
@Abel извините, это в оригинальном посте выше, я только что обновил номера строк. Существуют и другие переменные, отличные от источника изображения, которые также не определены. Беда в том, что есть, возможно, более 100 переменных, которые не определены на всем сайте. Проблема, которую я пытаюсь решить, почему это работает на сервере PHP 5.2, несмотря на неопределенные переменные? Благодаря! –
Tx Кроме того, вы также можете показать (скопировать/вставить из оригинала) строку, где объявляется '$ image_source', и глобально или нет? – Abel