5

タイトルが示すように:XSL-DocumentでPHP-Functionを記述し、後でそれを呼び出すことは可能ですか?

私はそれをしたい場合はありません。XSLを学んでいるときに頭に浮かんだのはそれだけです。

XSLでは、次のようなものを作成できます。

<xsl:processing-instruction name="php">
   ...some php...
</xsl>

PHPコードは、レンダリングされたページで実行されます。たとえば、処理命令でPHP関数を作成し、後で(同じテンプレートで)呼び出すことは可能ですか?

疑似サンプル:

<xsl:template>

   <xsl:processing-instruction name="php">
      ...some php processing $foo...
   </xsl>

   <xsl:variable name="foo" select="xpath/node">

   <xsl:value-of select="call-php-function-with-$foo"/>

</xsl>

私はあなたの解決策/アプローチを楽しみにしています:)

クリス

4

3 に答える 3

4

選択した答えは間違った方向を向いていると思います。FXSLを使用する必要はありません。他の言語で記述された拡張機能をXSLTに簡単に追加できます。たとえば、JythonまたはXalanを使用するJavascript、ほとんどのJavaプロセッサを使用するJavaなどです。

PHPに関しては、PHPスクリプトでXSLT処理を実行している場合(たとえば、XalanがAntなどから実行されている場合)、XSLTProcessor :: registerPHPFunctionsを使用すると、次のような記述が可能になります。

$xsl = <<<EOF
...
<xsl:value-of select="php:function('myFunc', . )"/> 
...
EOF;

function myFunc( $node ) {
//etc

もちろん、PHPスクリプトのみがXSLを正しく処理できます。

それはすべてhttp://www.php.net/manual/en/xsltprocessor.registerphpfunctions.phpで非常に明確に文書化されてい ます

于 2012-03-25T20:34:03.610 に答える
1

それは可能です(彼がPHPについて質問している場合、彼はほぼ確実にXSLT 1.0に制限されており、FXSLは彼が求めているものではないことを覚えておいてください)。

まず、PHPを自分で作成し、それをドキュメント処理フローの一部として使用することを計画している場合、これにはおそらく言語の選択が不適切です。独自のいくつかのPHP関数またはpreg_replaceなどの便利なライブラリ関数を使用してXSLの機能を少し拡張したい場合は、XSLTからそれらを呼び出すことができます。これらが何であるかを知っていれば、まったく問題ありません。 PHP関数をXSLTにエクスポートし、そこから呼び出すだけです。

ただし、実行するコードがドキュメントごとに異なる場合は、難しくなります(つまり、PHPを含む処理しようとしているドキュメントの命令を処理する場合、ドキュメントを評価するときにXSLTスクリプトで処理命令を実行する必要があります)。 )。関数を既知のセットに分解して、PHPから呼び出すだけですが、それができない場合でも試してみたい場合は、ハッカーに任せてください。

(PHPの関数をXSLTにエクスポートする方法を知っていると思います。通常のPHP関数をいくつか作成し、registerPHPFunctionsを使用してXSLTスクリプトにエクスポートし、XSLT内の関数として呼び出すだけです。ドキュメントを確認してください。)

XSLTスクリプトからドキュメントのPIでPHPコードを実行することに戻ります。

(自分でやるわけではありませんが、実装するのはそれほど難しいことではありません。)1回のパスでそれを行うことは不可能だと私は信じています。XSLTプロセッサを呼び出す必要があり、実行するPHPにアクセスするたびに、マーカータグ(例<phpmarker md5ofcode="php:md5(...)">)を挿入して、呼び出し元のPHPにコードを戻します。ハッキーですが、潜在的に住みやすいです-それをxsl:messageに入れて、PHPのカスタムハンドラーからキャッチすることです。

最初の実行が終了したら、文字列を少し操作して、取得したコードの各ブロックのラッパー関数を作成し、その文字列を評価して関数を作成し、XSLTエンジンにエクスポートしてから、2番目のXSLTスクリプトで再呼び出しします。これはマーカーノードをキャットし、そのコンテンツでPHPを呼び出します。

ぶさいくな?はい。なぜそれが必要なのかを説明したいと思うかもしれませんが、それを機能させることは(2パスで)可能であるはずです。

編集:あなたの質問をもう数回読み直したので、私はますます混乱しています。XSLTでPIを実行してもよろしいですか?PIはドキュメントにアクセスし、それらがどのように処理されるかを説明します。PHPがXSLTファイルに含まれることを意図していて、それがタイプミスではない場合、少し混乱しているかもしれません。これは、PHPのregisterPHPFunctionsの単なるバニラアプリケーションです。PHPを別のファイルに入れて、XSLTから呼び出す必要があります。これは、XSLTスクリプトが2つのファイルに分割するのに十分な大きさになる前に多くの機能を含む必要がないことを考えると、大きな負担ではありません。

于 2011-08-30T12:30:45.943 に答える
-2

XSLT 1.0では、別の言語で記述された関数を呼び出すことはできません。ただし、これらが拡張関数に対する特定のXSLTプロセッサーの要件に従って記述され、変換の開始時に使用可能な拡張関数のセットで指定されている場合を除きます。

テンプレートを呼び出すか適用することで、関数をシミュレートできます。

XSLT 2.0では、命令を使用してXSLTで関数を記述できます。<xsl:function>これらの関数は、select他のXSLT命令の属性で指定されているXPath式で参照できます。

XSLT1.0とXSLT2.0の両方で、高階関数(HOF)を実装することも可能です。これは、FXSLライブラリ(完全にXSLTで記述されている)が行うことです。

于 2010-07-17T16:07:11.263 に答える