如何在 PHP 5 中启用 XSLT 函数?
Posted
技术标签:
【中文标题】如何在 PHP 5 中启用 XSLT 函数?【英文标题】:How do I enable XSLT functions in PHP 5? 【发布时间】:2011-05-25 23:05:22 【问题描述】:我想使用 xslt 将 xml 文件作为 html 嵌套列表打印出来,据我所知代码是正确的,但是我收到了这个错误
致命错误:调用未定义函数 xslt_create()
我认为这意味着 xslt 功能尚未启用。如何在 php 中启用这些功能?是否有我需要包含的 php 文件(如 javascript 库的工作方式)还是更复杂?我在 MediaTemple 托管。
这是我正在使用的 php 代码:
<?php
// Allocate a new XSLT processor
$xh = xslt_create();
// Process the document, returning the result into the $result variable
$result = xslt_process($xh, 'armstrong.xml', 'familyToNestedList.xsl');
if ($result)
print "SUCCESS, sample.xml was transformed by sample.xsl into the \$result";
print " variable, the \$result variable has the following contents\n<br>\n";
print "<pre>\n";
print $result;
print "</pre>\n";
else
print "Sorry, sample.xml could not be transformed by sample.xsl into";
print " the \$result variable the reason is that " . xslt_error($xh) .
print " and the error code is " . xslt_errno($xh);
xslt_free($xh);
?>
提前致谢!
【问题讨论】:
php.net/manual/en/xslt.installation.php 【参考方案1】:根据您的 linux 发行版,您可以只安装 php5-xsl 模块,将“extension=php_xsl.so”行添加到您的 php.ini 文件中,然后重新启动您的 apache2 服务器。
这在 Ubuntu 11.10 上对我有用。可以在命令行输入“sudo apt-get install php5-xsl”安装php5-xml。
【讨论】:
在 ubuntu 14 上为我工作。不需要向 php.ini 添加任何内容。 在 Debian 8.0 ( (jessie) 64 位上为我工作,我也不需要向 php.ini 添加任何内容。【参考方案2】:您必须 compile PHP 支持它并确保拥有所有必需的依赖项。请参阅PHP Manual for XSLT中的相应章节。
来自Requirements章节
此扩展需要 libxml PHP 扩展。这意味着也需要传入 --enable-libxml ,尽管这是隐式完成的,因为 libxml 默认是启用的。这个扩展使用 Sablotron 和 expat,它们都可以在 »http://freshmeat.net/projects/sablotron/ 找到。提供二进制文件和源代码。通过在 PHP 4 中使用 --with-xslt 选项来启用。
来自Installation章节
在 Unix 上,使用 --enable-xslt --with-xslt-sablot 选项运行配置。 Sablotron 库应该安装在编译器可以找到的地方。确保您有与 Sablotron 库链接的库与那些与 PHP 链接的库相同。配置选项: --with-expat-dir=DIR --with-iconv-dir=DIR 可以帮助您指定它们。在寻求支持时,请始终提及这些指令,以及您的系统上是否安装了这些库的其他版本。当然,提供所有版本号。
recommended extension for using XSL transformations with PHP5 is XSL。如果您需要做的只是转换两个文档,如您的示例所示,请考虑 PHP 手册中的此示例:
$xml = new DOMDocument;
$xml->load('collection.xml');
$xsl = new DOMDocument;
$xsl->load('collection.xsl');
// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attach the xsl rules
echo $proc->transformToXML($xml);
transformToXML
方法将返回转换后的文档或FALSE
,因此您可以保留代码中的 if/else。无论如何,升级您的代码应该是微不足道的。
【讨论】:
所以... OP 需要重新编译 PHP? @sholsinger 是的,除非 PHP 已经像上面引用的那样配置,并且扩展在 php.ini 中被禁用。但是 XSLT 从 PHP5 开始是 PECL,所以不太可能是这种情况。 所以请记住,我的主机是通过 MediaTemple 进行的,这是我需要让他们做的事情吗? @Chris 我假设这是共享主机,然后没有对机器的 root 访问权限。你可以问他们,但我怀疑他们是否会为共享主机设置这样做。如果您展示的代码不仅仅是多行代码的简化示例,我强烈建议您更改代码以使用新的扩展。 @Chris 这些是 libxml 报告的关于无效标记的错误。您可以使用libxml_use_internal_errors(TRUE)
和libxml_clear_errors
禁用它们。但是,最好更正 XML。对于 armstrong.xml,xml 序言之前有空格。在 XSL 的情况下,我认为错误消息非常明显。它们似乎源于孤立的关闭 li 元素。【参考方案3】:
嗯,很简单,但在 php.net 上可以更明确地解释。
我正在使用一个包含 ubuntu 基础并使用 php-fpm 的 docker 容器。
在我的上下文中安装这个扩展的步骤是:
首先在 linux 存储库上搜索 xsl 扩展 apt-cache search xsl
我最终找到了 php5-xsl,所以它只是安装 apt-get install php5-xsl
那个安装过程setup配置已经加进去了,如果没有,自己弄 vim /etc/php5/mods-available/xsl.ini
插入此内容: extension=xsl.so
(显然路径是根据你的php配置设置的,但我的例子是默认配置)
重启你的php fpm并完成!
【讨论】:
以上是关于如何在 PHP 5 中启用 XSLT 函数?的主要内容,如果未能解决你的问题,请参考以下文章