XSLTProcessor::setParameter の詳細解説: PHP で XML 変換を動的に制御する
XSLTProcessor::setParameter()関数は、XSLTProcessorクラスを使用してXSLT変換を行う際に、パラメータの値を設定するために使用されます。この関数は、スタイルシート内で定義されているパラメータに対して値を設定することで、XSLT変換処理を動的に制御することができます。
構文
bool XSLTProcessor::setParameter(string $namespace, string $name, string $value);
bool XSLTProcessor::setParameter(string $namespace, array $options);
パラメータ
$options
: 名前と値のペアの配列。PHP 5.1.0以降で使用可能。$value
: パラメータの値。$name
: パラメータの名前。$namespace
: パラメータの名前空間URI。省略可能。
戻り値
成功した場合にTRUE、失敗した場合にFALSEを返します。
使い方
以下の例は、XSLTProcessor::setParameter()関数を使用して、スタイルシート内のパラメータ "greeting" に値 "Hello, World!" を設定する方法を示しています。
$xsl = new DOMDocument();
$xsl->load('stylesheet.xsl');
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl);
$proc->setParameter('', 'greeting', 'Hello, World!');
$xml = new DOMDocument();
$xml->load('data.xml');
$result = $proc->transformToXml($xml);
echo $result;
この例では、まずスタイルシート "stylesheet.xsl" を読み込み、XSLTProcessorオブジェクトを作成します。次に、setParameter()関数を使用して、スタイルシート内のパラメータ "greeting" に値 "Hello, World!" を設定します。その後、XMLドキュメント "data.xml" を読み込み、transformToXml()関数を使用してXSLT変換を実行します。最後に、変換結果を $result
変数に格納し、echo
ステートメントを使用して出力します。
- XSLTProcessor::setParameter()関数は、XSLT変換処理を実行する前に呼び出す必要があります。
- パラメータが存在しない場合、setParameter()関数はFALSEを返しますが、エラーは発生しません。
- パラメータの名前空間URIが省略された場合、デフォルトの名前空間URIが使用されます。
サンプル 1: スタイルシート内のパラメータを使用して XML ドキュメントの要素を挨拶する
このサンプルでは、スタイルシート内のパラメータを使用して、XML ドキュメントの各 person
要素を挨拶します。
スタイルシート (greet.xsl)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/people/person">
<p>Hello, <xsl:value-of select="@name"/>!</p>
</xsl:template>
</xsl:stylesheet>
XML ドキュメント (people.xml)
<people>
<person name="John">
<age>32</age>
</person>
<person name="Jane">
<age>28</age>
</person>
</people>
PHP コード
$xsl = new DOMDocument();
$xsl->load('greet.xsl');
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl);
// スタイルシート内のパラメータ "greeting" に値を設定
$proc->setParameter('', 'greeting', 'こんにちは');
$xml = new DOMDocument();
$xml->load('people.xml');
$result = $proc->transformToXml($xml);
echo $result;
このコードを実行すると、以下の出力が得られます。
こんにちは、John!
こんにちは、Jane!
サンプル 2: XSLT 変換結果を HTML テーブルに出力する
このサンプルでは、XSLT 変換結果を HTML テーブルに出力します。
スタイルシート (table.xsl)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/people">
<table>
<thead>
<tr>
<th>名前</th>
<th>年齢</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="person">
<tr>
<td><xsl:value-of select="@name"/></td>
<td><xsl:value-of select="age"/></td>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
XML ドキュメント (people.xml)
(サンプル 1 と同じ)
PHP コード
$xsl = new DOMDocument();
$xsl->load('table.xsl');
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl);
$xml = new DOMDocument();
$xml->load('people.xml');
$result = $proc->transformToXml($xml);
echo $result;
<table>
<thead>
<tr>
<th>名前</th>
<th>年齢</th>
</tr>
</thead>
<tbody>
<tr>
<td>John</td>
<td>32</td>
</tr>
<tr>
<td>Jane</td>
<td>28</td>
</tr>
</tbody>
</table>
このサンプルでは、XPath 式を使用して、スタイルシート内のパラメータ "greeting" に値を動的に設定します。
スタイルシート (greet.xsl)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/people/person">
<p><xsl:value-of select="$greeting"/>, <xsl:value-of select="@name"/>!</p>
</xsl:template>
</xsl:stylesheet>
XML ドキュメント (people.xml)
(サンプル 1 と同じ)
$xsl = new DOMDocument();
$xsl->load('greet.xsl');
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl);
// スタイルシート内のパラメータ "greeting" に XPath 式を設定
$proc->setParameter('', 'greeting', '//person/age/text()');
$xml = new DOMDocument();
XSLTProcessor::setParameter() 関数は、XSLT 変換を行う際にパラメータの値を設定するために一般的に使用されますが、状況によっては代替方法がより適切な場合があります。 以下に、代替方法とその利点と欠点についていくつか紹介します。
スタイルシート内の変数を使用する
XSLT 1.0 では、スタイルシート内で xsl:variable
要素を使用して変数を定義することができます。 変数には、XSLT 変換処理中に使用できる任意の値を格納することができます。
利点
- XSLTProcessor::setParameter() 関数を使用するよりも処理効率が優れている場合がある。
- スタイルシート内にパラメータを直接定義できるため、コードが読みやすくなる。
欠点
- XSLT 2.0 以降でのみ使用可能な機能もあります。
- スタイルシートを変更する必要がある場合、変数の値を変更する必要があります。
例
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="greeting" select="'Hello, World!'"/>
<xsl:template match="/people/person">
<p><xsl:value-of select="$greeting"/>, <xsl:value-of select="@name"/>!</p>
</xsl:template>
</xsl:stylesheet>
XSLT 2.0 の関数を使用する
XSLT 2.0 では、param()
関数と value-of()
関数を使用して、パラメータの値を設定することができます。
利点
- XSLT 1.0 の
xsl:variable
要素よりも強力な機能を提供します。 - スタイルシートとコードをより分離することができます。
欠点
- XSLT 1.0 では使用できません。
例
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="greeting" as="xs:string" default="'Hello, World!'"/>
<xsl:template match="/people/person">
<p><xsl:value-of select="param(:greeting)"/>, <xsl:value-of select="@name"/>!</p>
</xsl:template>
</xsl:stylesheet>
サードライブラリを使用する
いくつかのサードライブラリは、XSLT 変換処理をより簡単に制御するための追加機能を提供しています。 これらのライブラリの中には、パラメータの値を設定するための代替方法を提供するものもあります。
利点
- XSLTProcessor::setParameter() 関数よりも強力な機能を提供する場合がある。
欠点
- すべての環境で使用できるわけではない。
- ライブラリの使用方法を習得する必要がある。
例
XSLTProcessor::setParameter() 関数は、XSLT 変換を行う際にパラメータの値を設定するための一般的な方法ですが、状況によっては代替方法がより適切な場合があります。 代替方法を選択する際には、要件、利点と欠点、およびスキルレベルを考慮する必要があります。