|
ここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。
zip形式
tgz形式
先日のPHP4.1.xでのAPI変更を踏まえて、XSLTクラスを作ってみました。上のリンクからzip、tgz形式でダウンロードできます。
クラス図は以下のようになります。
AbstractXSLTProcessorクラスはJavaのinterfaceの * 位置づけ * で、processメソッドを子クラスであるXSLTProcessor40とXSLTProcessor41の各ファイルでそれぞれ実装しています。XSLTクラスのコンストラクタでいずれかのインスタンスが作成されます。また、XSLTLogHandlerも同様の構成です。
なお、PHP4.0.x、4.1.xで利用できるように、process、processFileメソッドとエラーコード・メッセージ取得メソッド程度しかありませんので、あしからず。。。
●xslt_test.php
<?php
ini_set("include_path", "../../");
require_once "jp/ne/hi_ho/pat/dimension/xml/xslt/XSLT.phl";
?>
<?php
$xml= "./test.xml";
$xsl= "./test.xsl";
$xh = new XSLT();
$xh->setEncoding("euc-jp");
$xh->startLog(getcwd() . "/xslt_test.log");
echo phpversion() . " file<br>";
echo $xh->processFile($xml, $xsl);
echo phpversion() . " direct<br>";
echo $xh->process(join("", file($xml)), join("", file($xsl)));
$xh->close();
?>
●出力結果(HTMLソース)
4.0.6 file<br><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>PHP関連書籍</title>
</head>
<body>
<b>PHP関連書籍</b>
<hr>
<ul>
<li>
<b>PHP4徹底攻略</b> (ISBN4-7973-1392-7)</li>
<li>
<b>Dynamic Webサイト構築入門 PHP編</b> (ISBN-4898142818)</li>
<li>
<b>Oracle8iとPHPで作るWebデータベースfor Miracle Linux</b> (ISBN4871938670)</li>
<li>
<b>PHPパーフェクトリファレンス</b> (ISBN-4894714027)</li>
<li>
<b>ホンキで学ぼう!PHPのキホン―PHP4によるwebアプリケーション構築のはじめの一歩</b> (ISBN4-7980-0119-8)</li>
<li>
<b>PHP、PerlでつかうXML/XSL―Sablotronで実現するWEBサイト管理の効率化</b> (ISBN4886486169)</li>
<li>
:
(以下略)
:
このクラスを使ったもっと具体的な例として、このページ作成に使っているスクリプトを公開します(大したモノではないですが。。。)。見ていただくと分かるとおり、conv.phpの$arrにXMLファイルをセットしアクセスすると、変換結果がブラウザとファイルに出力される、という寸法です。また、ブラウザには変換結果の後に「next」というリンクを追加し、次のXMLを変換できるようにしています。ちなみに、バージョン違いによるAPIの違いはラッパークラスで吸収していますので、PHP4.1.2、PHP4.0.6共に動作します。
●conv.php
<?php
require_once("conv.phl");
?>
<?php
$arr = array(
"inst_unix_dso_4_apc",
"inst_unix_dso_4",
"inst_oracle",
"inst_unix_dso_3",
"inst_unix_dso_4_mbregex1",
"inst_unix_dso_4_mbregex2",
"inst_unix_dso_4_xslt",
"inst_unix_apache",
"inst_unix_dso_4_domxml",
"inst_win_dso_4"
);
$c = new conv($arr, "20010913.xsl", $_GET["mode"]);
$c->exec($_GET["seq"]);
?>
●conv.phl
<?php
ini_set("include_path", "...");
require_once "jp/ne/hi_ho/pat/dimension/xml/xslt/XSLT.phl";
class conv
{
var $xml;
var $xsl;
var $mode;
function conv($xml, $xsl, $mode)
{
$this->xml = $xml;
$this->xsl = $xsl;
$this->mode = $mode;
}
function exec($seq)
{
if ($seq == "") $seq = 0;
$nm = $this->xml[$seq];
if ($nm == "") die("no base file name !");
mb_http_output("pass");
echo phpversion() . "<br>";
$xslt = new XSLT();
$tmp = $xslt->processFile($nm . ".xml", $this->xsl);
echo $tmp;
$xslt->close();
if ($this->mode == "shtml") {
$fp = fopen($nm . ".shtml", "w");
fputs($fp, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"> \n");
}
else {
$fp = fopen($nm . "xxxxxxx", "w");
}
fputs($fp, $tmp);
fclose($fp);
echo "<a href='" . $GLOBALS["SCRIPT_NAME"] . "?seq=" . ($seq + 1) .
"&mode=" . $this->mode . "'>next</a>";
}
}
function handle_xslt_error($xh, $errno, $level, $fields)
{
if ($fields["msgtype"] == "error") {
echo "<b><font color='red'>" . $fields["msg"] .
"</font> in " . $fields["URI"] . ", line " . $fields["line"] .
"</b><br/>";
}
}
?>
|