我需要移动一个我继承的PHP站点,它使用XSLT从运行PHP 5.2到PHP 5.4的服务器。在此站点上,index.php
脚本加载XSL模板,构建XML并在输出缓冲区中捕获它。然后将XML传递给XSLTProcessor
,并在其中设置参数并打印HTML。
$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生成终止于此。现在,transformToXml
的PHP文档(http://php.net/manual/en/xsltprocessor.transformtoxml.php)指出此函数在出错时应返回FALSE。但是,它会返回部分转换的HTML。
在检查时,我发现在$params
中,XSLT模板中定义了许多不存在的变量,例如:
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的服务器上,此代码似乎至少可以在该服务器上运行而不会出现问题。另外,我检查了PHP 5.2服务器上的$params
变量,它们的内容是相同的:也就是说,它们都没有image_source
,也没有定义在XSL文件中引用的任何其他变量。< / p>
这可能是PHP 5.2特有的吗?我已经查看了PHP 5.2和PHP 5.3的迁移指南,以及PHP 5.3到PHP 5.4的迁移指南 - 但我找不到向DOMDocument和XSLTProcessor进行向后不兼容的修改。
答案 0 :(得分:0)
在评论中给出的OP pastie code中,发现XSLT中存在以下行(未给出完整的XSLT,因此无法测试):
./xsl/homepage.xsl: <!--<xsl:param name="image_source"/>
./xsl/homepage.xsl: <xsl:if test="$image_source!=''">
转储没有显示行号,也没有显示上下文,因此很难弄清楚这是否真的是罪魁祸首。 image_source
有12次点击,表明该名称被大量使用。
在XSLT中,您只能在其范围内使用名称,该名称通常位于其包含的焦点设置容器中,例如xsl:template
,xsl:for-each
。