連載
» 2003年06月25日 10時00分 公開

XMLテクニック集(2):XML文書からソーティングされた一覧表を作成する (3/3)

[山田祥寛,@IT]
前のページへ 1|2|3       

XML文書をXSLTスタイルシートに動的にひも付ける(PHP編)

アイコン

XMLに対応していないWebブラウザで、XML文書を整形して表示するためには、サーバ側でXML文書をHTMLに変換する必要があります。今回はPHPで変換を実現する方法について解説しましょう。

カテゴリ XSLT、PHP
必要なソフトウェア Apache、PHP
関連記事 XML文書をXSLTスタイルシートに動的にひも付ける(ASP.NET編)

 サーバサイドでXSLT変換を行う方法は、「XML文書をXSLTスタイルシートに動的にひも付ける(ASP.NET編)」でもご紹介したとおりです。XSLT変換をクライアントサイドからサーバサイドにゆだねることは、アプリケーションをクライアント環境の制約から解き放つと同時に、マルチデバイス環境でのコンテンツの切り替えや国際化(i18n)対応などの可能性を提供するものです。

 サーバサイド技術は、Perlなどを使ったCGIに始まり、JSP/サーブレット、ASP(ASP.NET)、PHP、Cold Fusion、Ruby、Pythonなどなど乱立している状況ですが、本稿では関数主体の言語で、その手軽さからポストCGIとして、その勢力を広げつつあるPHPを採用することにします。

 実行に際しては、サーバ側環境として最低限、Apache(Webサーバ)、PHP4.1.x以上(4.3.x推奨)の環境が必要である点に注意してください。クライアント側はHTMLを表示できるWebブラウザさえあれば、特に制限はありません。

 以下は、XML文書books.xmlをXSLTスタイルシートbasic.xslで変換し、その結果を出力するPHPアプリケーションです。

[books.xml]

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="basic.xsl" ?>
<books author="YAMADA Yoshihiro">
  <title>2000年〜2003年主要書籍一覧</title>
  ……中略……
</books>

[basic.xsl]

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <html>
      <head>
        <title><xsl:value-of select="books/title" /></title>
      </head>
      <body>
        <h1><xsl:value-of select="books/title" /></h1>
        <hr />
        <div align="right">
          <xsl:value-of select="books/@author" />
        </div>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

[transform.php]

<?php
  header("Content-Type:text/html;charset=EUC-JP");
  $strDir=dirname(__FILE__);
  $strXml=$strDir."/books.xml";
  $strXsl=$strDir."/basic.xsl";
  $objPrc=xslt_create();
  $result=xslt_process($objPrc,$strXml,$strXsl);
  print(mb_convert_encoding($result,"EUC-JP","UTF-8"));
?>


 表示結果は以下のとおりです。

XSLT変換の結果のみがクライアントに送信される XSLT変換の結果のみがクライアントに送信される

 以下は、PHPでXSLT変換を行う場合の注意ポイントです。PHPプログラミングを行ううえでの基本的な事項はここでは触れませんので、詳細を学習したい方は、Linux Squareフォーラムの記事「PHP4で作るWeb-DBシステム」などを参照してみてください。

(1)SablotronおよびExpatが必要

 「xslt_〜」で始まるXSLT拡張関数を使用するには、拡張モジュールであるSablotronとExpatをあらかじめ利用可能にしておく必要があります。それには以下の手順を参考にしてください。

 UNIX系OSでは、PHP本体のconfigureを行う際に「--enable-xslt」「--with-xslt-sablot」オプションを付加してください。

 Windows系OSでは、%PHP_HOME%/dllsに含まれているexpat.dllとsablot.dllとをシステムフォルダ(Windows 2000ならば「C:\WINNT\system32」)にコピーしたうえで、php.ini上に以下の記述を追加します。

extension_dir="C:\php\extensions"
extension=php_xslt.dll


 もちろん、すでにこれらのオプションが有効になっている場合には、あらためて追記(変更)の必要はありません。また、php.iniを編集した場合には、必ずApache(Webサーバ)の再起動が必要となる点に注意してください。

(2)XML・XSLTファイルへのパスは絶対パスで指定

 変換の対象となるXML文書および変換ルールを示したXSLTスタイルシートへのパスは絶対パスで示さなければなりません。相対パスではPHPが正しく認識してくれませんので注意が必要です。

 ただし、ファイルへの絶対パスをそのままコード上に記述するのは、サーバ環境が変更になったときにパスの書き換えなどが発生することを考えると、あまり好ましいことではありません。

 そこで、PHPでは「__FILE__」という定数を用意しています。「__FILE__」は現在の「.php」ファイルへの絶対パスを保持する定数で、dirname関数を介することで現在の「.php」ファイルが置かれているフォルダ(ディレクトリ)へのパスを取得することができます。もしも「.php」ファイルと「.xml」「.xsl」ファイルが同一のディレクトリ上に配置されているならば、単純に取得した変数$strDirの値をファイル名に連結させてやればよいでしょう。

 なお、Windows環境では上記サンプルのままでは正常に動作しない点に注意してください。変数$strDirを生成するに当たって、以下のような文字列加工を施す必要があります。

$strDir=str_replace("\\","/",dirname(__FILE__));
$strDir=substr($strDir,2);


 まずはパスの区切り文字である「\」は「/」に変更しなければなりません。そして、ドライブ文字列である「C:」の部分を取り除きます。結果、変数$strDirには「/Program Files/Apache Group/Apache2/htdocs/atmarkit」のような文字列が格納されます。現行のXSLT関数はこのパス形式でのみ絶対パスを認識することができます。

(3)XSLT変換を行うのはxslt_process関数

 XSLT変換を担うコアとなるのが、xslt_process関数の役割です。xslt_process関数を使用するに先立って行わなければならない準備は、xslt_create関数でXSLTプロセッサSablotronを有効にしておくだけです。

 xslt_process関数の構文は極めてシンプルです。

変数=xslt_process(XSLTプロセッサ,XMLへのパス,XSLTへのパス);


 変数にはXSLT変換の結果文字列が格納されますので、あとはmb_convert_encoding関数で文字コードを適切なものに変換するだけです。ここで紹介したサンプルコードでは、UTF-8であるコードをEUC-JPに変換しています。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。