使用上面的代码,实体将从输出中省略。
症状是
-- 应该与 UTF-8 编码一起使用 --
甚至没有到达 XSLTProcessor,更不用说通过它了。
经过大量的黑客攻击后,我发现了简单的解决方法
在 XSL 文件的 DOMDocument 中将 substituteEntities 设置为 true。
也就是说,用以下内容替换 xsl 文档的加载
<?php
$xsl = new DOMDocument;
$xsl->substituteEntities = true; $xsl->load('collection.xsl');
?>
但是,当数据条目包含 HTML 实体引用时,这会失败。(某些数据库条目甚至可能包含用户生成的文本。)libxml 有一个偏执的习惯,即对任何未定义的实体抛出致命错误。解决方案:隐藏实体,以便 libxml 看不到它们。
<?php
function hideEntities($data) {
return str_replace("&", "&", $data);
}
?>
您可以将其添加到示例中,但定义一个函数将数据加载到 DOMDocument 中会更整洁。这样,您也不需要在 catalog.xsl 中声明实体。
<?php
function fileToDOMDoc($filename) {
$dom= new DOMDocument;
$xmldata = file_get_contents($filename);
$xmldata = str_replace("&", "&", $xmldata); $dom->substituteEntities = true; $dom->loadXML($xmldata);
return $dom;
}
$xml = fileToDOMDoc('collection.xml');
$xsl = fileToDOMDoc('collection.xsl');
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
echo $proc->transformToXML($xml); ?>