實體會從上面的程式碼輸出中省略。
症狀是
-- 這應該能搭配 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); ?>