XSLT transformToXml运行时错误

时间:2015-09-14 09:50:31

标签: php xml xslt domdocument

我需要移动一个我继承的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&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的服务器上,此代码似乎至少可以在该服务器上运行而不会出现问题。另外,我检查了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进行向后不兼容的修改。

1 个答案:

答案 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:templatexsl:for-each