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 変換を行う際にパラメータの値を設定するための一般的な方法ですが、状況によっては代替方法がより適切な場合があります。 代替方法を選択する際には、要件、利点と欠点、およびスキルレベルを考慮する必要があります。