この人頭いいなと思ったエピソード

XML+XSLでHTMLを生成する上で、PHPを経由する場合と、しない場合で、
外部エンティティの挙動が異なっていて悩んでいます。

具体的には、
 ・XML+XSL+外部エンティティ → 意図通りHTML生成
 ・PHP+XML+XSL+外部エンティティ → 意図通りHTML生成されない(外部エンティティが生成されない)

こういうものなのでしょうか?
もし、こういう仕様であれば、なにか対応策はあるのでしょうか?

ソースと生成されたHTMLは下記の通りです。

【Though.php】
<?php
header( 'Content-Type: text/html; charset=UTF-8' );

$xml = new DomDocument();
$xml->load( 'MainData.xml' );

$xsl = new DomDocument();
$xsl->load('Main.xsl');

$processor = new xsltprocessor();
$processor->importStyleSheet($xsl);

echo $processor->transformToXML($xml);
?>


【MainData.xml】
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="Main.xsl" ?>

<!DOCTYPE books [
<!ENTITY sub_data SYSTEM "SubData.xml">
]>

<root>
<node1>TEST1</node1>
<node2>&sub_data;</node2>
</root>


【Main.xsl】
<?xml version = "1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
<html>
<xsl:apply-templates />
</html>
</xsl:template>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>

</xsl:stylesheet>


【SubData.xml】
<?xml version="1.0" encoding="utf-8"?>

<sub_data>Test2</sub_data>



【XML+XSL+外部エンティティで生成されるHTML(ブラウザで直接MainData.xmlを開いた場合)】
<html><?xml-stylesheet type="text/xsl" href="Main.xsl" ><root><node1>TEST1</node1><node2><sub_data>Test2</sub_data></node2></root></html>


【PHP+XML+XSL+外部エンティティで生成されるHTML(ブラウザでThrough.phpを開いた場合)】
<html>
<?xml-stylesheet type="text/xsl" href="Main.xsl" ><root>
<node1>TEST1</node1>
<node2></node2>    //←node2の中がカラッポになっている。。。
</root>
</html>

※生成されたHTMLは、IE8の開発者ツールで確認しています。


XMLやPHPは最近やり始めたのでトンチンカンなことを言ってるかもしれませんが、よろしくお願いします。

A 回答 (1件)

手元で確認してみました。

(PHP 6.0)
loadメソッドを実行する「前」に
$xml->resolveExternals = true;
$xml->substituteEntities = true;
を入れてみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

自分の環境はPHP5.2.2でしたが、
意図通りに外部エンティティが表示されました。

ありがとうございました。とても助かりました。

お礼日時:2009/06/08 21:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!