※ ChatGPTを利用し、要約された質問です(原文:PHPでXMLを表示させたときの外部エンティティの挙動に関して)
PHPでXMLを表示させたときの外部エンティティの挙動に関して
このQ&Aのポイント
XML+XSLでHTMLを生成する上で、PHPを経由する場合と、しない場合で、外部エンティティの挙動が異なっていて悩んでいます。
具体的には、XML+XSL+外部エンティティは意図通りにHTMLが生成される一方、PHP+XML+XSL+外部エンティティでは外部エンティティが生成されない問題があります。
この挙動はどういうものなのか、もし仕様であればどのような対応策があるのか知りたいです。
PHPでXMLを表示させたときの外部エンティティの挙動に関して
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は最近やり始めたのでトンチンカンなことを言ってるかもしれませんが、よろしくお願いします。
お礼
回答ありがとうございます。 自分の環境はPHP5.2.2でしたが、 意図通りに外部エンティティが表示されました。 ありがとうございました。とても助かりました。