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



last updated
2002/11/15

counter hits
since 1999/11/06


裏XSLT関数

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

caution[2002/01/29] PHP4.1.0より新しいAPIが採用されています。詳しくはPHP 4.1.0のChangeLogをどうぞ。

XSLT関数にもまだ(PHP4.0.6で2001/10/13現在)ドキュメント化されていない以下の関数があるようです。

  • xslt_set_encoding関数
  • xslt_set_error_handler関数

まずは、xslt_set_encoding関数ですが、<xsl:output encoding="...">で指定されたエンコーディングを強制的に変更する関数です。test.xslで<xsl:output encoding="utf-8">などshift_jis以外のエンコーディングを指定し、以下のスクリプトを実行してみてください。


<?php
    // XML・XSLの各ファイルを指定
    $xml_file = "test.xml";
    $xsl_file = "test.xsl";

    // xsltプロセッサを作成
    $xslt = xslt_create();

    // <xsl:output>のエンコーディングを強制的に変更する
    xslt_set_encoding($xslt, "shift_jis");

    // XSLTスタイルシートをXMLファイルに適用
    xslt_run($xslt, $xsl_file, $xml_file);

    // 結果を出力
    echo xslt_fetch_result($xslt);

    // xsltプロセッサを解放
    xslt_free($xslt);
?>

次に、xslt_set_error_handler関数ですが、XSLT変換時のエラーハンドラを指定する関数です。この関数の引数は、

  • XSLTプロセッサのリソースID
  • ハンドラの関数名

の順です。また、ハンドラの引数は、

  • XSLTプロセッサのリソースID
  • エラー番号(=xslt_errno関数で取得できるものと同じ)
  • レベル
  • その他情報

の4つのようです。特に4つ目のその他情報からは、エラーが発生したXSLTファイル名や行番号が取得できますので、デバッグに使えます。。。というか、使ってます (^-^)


<?php
    // 確認方法
    // XSLをwell-formedでないようにする

    $xml_file = "test.xml";
    $xsl_file = "test.err.xsl";

    $xslt = xslt_create();

    // エラーハンドラの指定
    xslt_set_error_handler($xslt, "handle_xslt_error");

    xslt_run($xslt, $xsl_file, $xml_file);
    echo xslt_fetch_result($xslt);
    xslt_free($xslt);
?>
<?php
    // エラーハンドラ
    // とりあえず、XSLTリソースIDとその他情報($fields)をバラしてみる
    function handle_xslt_error($xh, $errno, $level, $fields){
        echo "<hr/>";
        echo "<p>ここからハンドラから取得したもの</p>";
        echo "xslt_errno(\$xh)=" . xslt_errno($xh) . "<br/>";
        foreach(xslt_error($xh) as $k => $v) echo "$k => $v<br>";

        echo "<p>ここから引数</p>";
        echo "\$errno=$errno<br/>";
        echo "\$level=$level<br/>";
        foreach($fields as $k => $v) echo "$k => $v<br>";

        echo "<b>" . $fields["msg"] . " in " . $fields["URI"] . ", line " . $fields["line"] . "</b><br/>";
    }
?>



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