(PHP 4 >= 4.0.3)
xslt_process — XSLT による変換を行う
xslt_process()関数は、XSLT 拡張モジュールの中心となる関数です。 ほとんど全ての型の入力ソース (コンテナ) を用いて XSLT 変換を実行可能です。 これを実現しているのが、引数バッファです。 引数バッファとは、Sablotron XSLTプロセッサ (現在、この拡張モジュールがサポートする惟一の XSLT プロセッサ) から得た概念です。 入力コンテナは処理する文章を '含んでいる' ファイル名がデフォルトです。
xslt_create() で作成した XSLT プロセッサリンク ID。
XML ファイルへのパス、あるいは XML 引数用のプレースホルダ。
XSL ファイルへのパス、あるいは XML 引数用のプレースホルダ。
結果コンテナは、変換された文章のためのファイル名が デフォルトです。もし結果コンテナが指定されていない場合 - 例えば NULL - 、結果が返されます。
XML や XSLT のファイル名を xslt_process() 関数に指定するかわりに、"引数プレースホルダ" を使用することもできます。これは、配列 arguments に指定した内容で置き換えられます。
任意のトップレベルパラメータの配列。これが XSLT ドキュメントに渡されます。XSL ファイル内でこれらのパラメータにアクセスするには <xsl:param name="parameter_name"> を使用します。 パラメータは UTF-8 でエンコードする必要があります。 その値は文字列として Sablotron プロセッサが処理します。つまり、XSLT ドキュメントのパラメータには ノードセットを渡すことはできないということです。
また、arguments 配列を通じてコンテナを設定することができます (以下参照)。
成功した場合に TRUE を、失敗した場合に FALSE を返します。 結果コンテナを指定していない場合は結果を返します。
バージョン | 説明 |
---|---|
4.0.6 | この関数は xmlcontainer もしくは xslcontainer で XML 文字列を受け付けなくなりました。 XML を含む文字列を渡すと、0.95とそれ以降の Sablotron バージョンでセグメンテーションフォルトを引き起こします。 |
xslt_process()関数で変換する最も簡単な方法は、 XMLファイルをXSLTファイルで変換し、結果を新しいXMLドキュメント(ま たはHTMLドキュメント)を含む3番目のファイルに出力することです。 これをsablotronを行うのは、かなり簡単です。
例1 XMLファイルとXSLファイルを新規XMLファイルに変換するために xslt_process()を使用する
<?php
// 新規 XSLT プロセッサを割り当てる
$xh = xslt_create();
// 文章を処理する
if (xslt_process($xh, 'sample.xml', 'sample.xsl', 'result.xml')) {
echo "SUCCESS, sample.xml was transformed by sample.xsl into result.xml";
echo ", result.xml has the following contents\n<br />\n";
echo "<pre>\n";
readfile('result.xml');
echo "</pre>\n";
} else {
echo "Sorry, sample.xml could not be transformed by sample.xsl into";
echo " result.xml the reason is that " . xslt_error($xh) . " and the ";
echo "error code is " . xslt_errno($xh);
}
xslt_free($xh);
?>
この機能は優れていますが、特にWeb環境では、結果を直接出力したい場 合があります。そこで、xslt_process()の3番目の 引数を省略した場合(またはその引数にNULL値を指定した場合)、ファイ ルに書き込む替わりに自動的にXSLT変換後の出力を返します。
例2 XMLファイルとXSLファイルを結果XMLデータを含む変数に変換するため にxslt_process()を使用する
<?php
// 新規 XSLT プロセッサを割り当てる
$xh = xslt_create();
// 文章を処理し、変数 $result に結果を返す
$result = xslt_process($xh, 'sample.xml', 'sample.xsl');
if ($result) {
echo "SUCCESS, sample.xml was transformed by sample.xsl into the \$result";
echo " variable, the \$result variable has the following contents\n<br />\n";
echo "<pre>\n";
echo $result;
echo "</pre>\n";
} else {
echo "Sorry, sample.xml could not be transformed by sample.xsl into";
echo " the \$result variable the reason is that " . xslt_error($xh);
echo " and the error code is " . xslt_errno($xh);
}
xslt_free($xh);
?>
上の二つのケースは、XSLT変換の最も簡単な場合です。これは、多くの 場合には通用しますが、時々、データベースまたはソケットのような外 部ソースからXMLとXSLTコードを取得する場合があります。このような場 合、XMLまたはXSLTデータを変数に有することになります。 実用アプリケーションでは、これらをファイルにダンプする際のオーバー ヘッドは大きいと言えます。このような場合こそ、XSLT "argument" 構文が役に立ちます。 xslt_process()関数のXMLおよびXSLT引数としてファ イルの替わりに引数配列(xslt_process()関数の5番 目のパラメータ)で指定した値に置換される"argument place holders"を指定することが可能です。 以下にファイルを全く使用せずにXMLおよびXSLTを結果変数に処理する例 を示します。
例3 XMLデータを含む変数とXSLTデータを含む変数をXMLデータ出力結果を 含む変数に変換するためにxslt_process()を使用 する
<?php
// $xml と $xsl は XML データと XSL データを含む
$arguments = array(
'/_xml' => $xml,
'/_xsl' => $xsl
);
// 新規 XSLT プロセッサを割り当てる
$xh = xslt_create();
// 文章を処理する
$result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
if ($result) {
echo "SUCCESS, sample.xml was transformed by sample.xsl into the \$result";
echo " variable, the \$result variable has the following contents\n<br />\n";
echo "<pre>\n";
echo $result;
echo "</pre>\n";
} else {
echo "Sorry, sample.xml could not be transformed by sample.xsl into";
echo " the \$result variable the reason is that " . xslt_error($xh);
echo " and the error code is " . xslt_errno($xh);
}
xslt_free($xh);
?>
例4 PHP 変数を XSL ファイルに渡す
<?php
// XML 文字列
$xml = '<?xml version="1.0"?>
<para>
change me
</para>';
// XSL 文字列
$xsl = '
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="ISO-8859-1" indent="no"
omit-xml-declaration="yes" media-type="text/html"/>
<xsl:param name="myvar"/>
<xsl:param name="mynode"/>
<xsl:template match="/">
My PHP variable : <xsl:value-of select="$myvar"/><br />
My node set : <xsl:value-of select="$mynode"/>
</xsl:template>
</xsl:stylesheet>';
$xh = xslt_create();
// 2番目のパラメータは文字列として解釈される
$parameters = array (
'myvar' => 'test',
'mynode' => '<foo>bar</foo>'
);
$arguments = array (
'/_xml' => $xml,
'/_xsl' => $xsl
);
echo xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments, $parameters);
?>
上の例の出力は以下となります。
My PHP variable : test<br> My node set : <foo>bar</foo>
注意: Windows を使用している場合、 file:// がパスの前に必要であることに注意してください。