Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2005/05/25

counter hits
since 1999/11/06


XSLTラッパークラス

alertここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。

zip形式 tgz形式

先日のPHP4.1.xでのAPI変更を踏まえて、XSLTクラスを作ってみました。上のリンクからzip、tgz形式でダウンロードできます。

クラス図は以下のようになります。

xsltクラス図

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");
//    $xh->endLog();

    //ファイル名を指定して結果を得る
    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 !");

        // <xsl:output>に記述したencodingを有効にするためには、
        // outputをpassにする必要がある
        // 指定しない場合は、強制的にmbstring.http_outputで指定した
        // encodingに変換される
        mb_http_output("pass");

echo phpversion() . "<br>";

        $xslt = new XSLT();
//        xslt_set_error_handler($xslt, "handle_xslt_error");
        $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 ($errno == 2 || $errno == 25) {
    if ($fields["msgtype"] == "error") {
        echo "<b><font color='red'>" . $fields["msg"] .
             "</font> in " . $fields["URI"] . ", line " . $fields["line"] .
             "</b><br/>";
    }
//foreach($fields as $k => $v) echo "$k => $v<br>";
}
?>



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2005 by Hideyuki SHIMOOKA all rights reserved.