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+SAX

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

caution[2002/01/29] PHP4.1.0より新しいAPIが採用されています。詳しくはPHP 4.1.0のChangeLogをどうぞ。ちなみに、ここで解説しているxslt_set_sax_handler関数は削除され、xslt_set_sax_handlers関数(紛らわしい。。。)が追加されています。

XSLT関数の1つとして用意されているxslt_set_sax_handler関数をちょっと試してみました。

XMLパース関数のものと比べ、関数に渡すパラメータなどが異なります。sablot.cを見たり、実際に試してみて分かったことを以下に示します。

  • handlerは連想配列で渡す必要がある
  • 連想配列のキーには、「document」「element」「namespace」「comment」「pi」「characters」が指定可能
  • キーに対する値としては、開始・終了ハンドラの関数名を配列として指定する。片方しかない場合はそれを書かなければよいが、配列でないとエラーになる
  • elementに対するハンドラの引数は、xml_set_element_handler関数と同様、「XMLパーサへのリファレンス(リソースID)」「タグ名(文字列)」「属性(連想配列)」となる

以下のサンプルでは、SAXハンドラを使って、タグ名と属性名・値を全て表示し、XSLT変換結果を表示します。


<?php
    $xml_file = "test.xml";
    $xsl_file = "test.xsl";

    // SAXハンドラのセット
    // 開始タグのハンドラにstartElement関数、終了タグのハンドラとして、
    // endElement関数を指定している
    $handler = array("element" => array("startElement", "endElement"));

    $xslt = xslt_create();

    /**
     * バージョンによって、処理を振り分け
     */
    if (phpversion() >= "4.1.0") {
        //>=4.1.0の場合
        xslt_set_sax_handlers($xslt, $handler);

        // これが実行された後にhandlerが実行される
        echo xslt_process($xslt, $xml_file, $xsl_file);
    }
    else {
        //<=4.0.6の場合
        xslt_set_sax_handler($xslt, $handler);

        // これが実行された後にhandlerが実行される
        xslt_run($xslt, $xsl_file, $xml_file);
        echo xslt_fetch_result($xslt);
    }

    xslt_free($xslt);

?>
<?php
    // 開始タグに対するハンドラ
    // 開始タグをパースするときに呼ばれる
    function startElement($parser, $name, $attrs) {
        echo "●startElement<br>";
        echo "tag => $name<br/>";
        print_r($attrs);
        echo "<p>";
    }

    // 終了タグに対するハンドラ
    // 終了タグをパースするときに呼ばれる
    function endElement($parser, $name) {
        echo "●endElement<br>";
        echo "tag => $name<br/>";
        echo "<p>";
    }
?>



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