2011-01-10 1 views
0

PHPでXSLTを使用してXMLファイル変換を正しく処理しています。実際に私はこのコードを使用:PHPで複数のXML/XSLTファイルをXSLTで変換して他を追加しますが、最初にPHPで処理します

$xml = new DOMDocument; 
$xml->LoadXML($xml_contents); 

$xsl = new DOMDocument; 
$xsl->load($xsl_file); 

$proc = new XSLTProcesoor; 
$proc->importStyleSheet($xsl); 

echo $proc->transformToXml($xml); 

$xml_contentsはPHPで処理XMLであり、これは、最初のXMLファイルを含む、次いで$xml_contents = ob_get_contents(); ob_end_clean();を割り当てることによって行われます。これは、XML上でPHPコードを処理することを強制し、完全に動作します。

私の問題は、複数のXMLファイルを使用することです。このXMLファイルには、処理が必要なPHPコードがあり、データを処理するためのXSLTファイルが関連付けられています。私questiionは、私はこれを扱うことができる方法である

<!-- First I add the XML file --> 
<xsl:param name="menu" select="document('menu.xml')" /> 

<!-- Next I add the transformations for menu.xml file --> 
<xsl:include href="menu.xsl" /> 

<!-- Finally, I process it on the actual ("parent") XML --> 
<xsl:apply-templates select="$menu/menu" /> 

:実は私は次のコードをXSLTでこのファイルを含めています。 PHPを含む最初のXMLファイルに複数のXML(+ XSLT)ファイルを追加して処理する必要があります。

ありがとうございます!

+0

あなたは、プロセスチェーンの一部が欠落しています。私がこれを正しく理解していれば、XML + PHP - > PHP前処理 - > XSLTのチェーンがあり、最初のステップ**で利用可能な同じデータを知ることができます。 XMLとembeded PHPをビルドするときは、適用するスタイルシートが分かります。その後、それを適用します。 –

+0

@Alejandro:私はそれを手に入れません。私はXMLと何を使用するのかを知っていますが、私が望むのは、余分なXMLと余分なXSLTを追加することです。ここでは、マスターXSLTから含まれるXMLをPHPで事前処理することができます。チェーンは次のようになります: "example.xml"をレンダリングするPHPコントローラ呼び出し - > PHPがXMLを読み込んで処理し、 "example.xslt"を自動的に関連付ける - >出力を出力します。 example.xsltが関連付けられているステップでは、このexample.xsltにはXMLおよびXSLTのさまざまなインクルードが含まれています。この余分なXMLファイルを前処理する必要があります。 – ipalaus

+0

それから、質問がクリアされていないので、あなたの質問を再考する必要があります。 –

答えて

0

2解決策、おそらくそれらのうちの1つはOKです。

テストされていませんが、PHPでカスタムストリームを実装できます。

<?php 

// define your custom stream, should process xslt 
class CustomStream extends streamWrapper { 
    // http://www.php.net/manual/en/class.streamwrapper.php 
} 

// declare your custom stream 
stream_wrapper_register('extra', 'CustomStream'); 

// then load your preprocessed on the fly in your example.xsl 
$xml_contents = <<<EOF 
... 
<xsl:param name="menu" select="document('extra://menu.xml')" /> 
EOF; 


?> 

ソリューションN°2、あなたのXSLTでPHPの関数を登録し、それで遊ぶ:

<?php 
// declare your function 
// see http://www.php.net/manual/fr/xsltprocessor.registerphpfunctions.php 
function resolve($xml_contents, $xsl_file=null) { 
    $dom = new DomDocument; 
    $dom->loadXML($xml_contents); 
    if ($xsl == null) { 
     return $dom; 
    } 

    $xsl = new DOMDocument; 
    $xsl->load($xsl_file); 

    $proc = new XSLTProcessor; 

    $proc->registerPHPFunctions('resolve'); 
    $proc->importStyleSheet($xsl); 

    return $proc->transformToDoc($xml_contents); 
} 


// then handle your master xsl 
$xsl_contents = <<<EOF 
... 
<xsl:param name="menu" select="php:function('resolve', 'menu.xml', 'menu.xsl')" /> 
EOF; 

$dom = new DomDocument; 
$dom->loadXML($xml_contents); 

$xsl = new DOMDocument; 
$xsl->loadXML($xsl_contents); 

$proc = new XSLTProcessor; 

$proc->registerPHPFunctions('resolve'); 
$proc->importStyleSheet($xsl); 

return $proc->transformToDoc($xml_contents); 

?> 
0

"PHPを含むXMLファイル"という言葉が何であるか分かりませんが、PHPの起動後にXSLT処理を妨害するPHPが必要だと思います。そうでなければ、のXSLT変換が実行される前に、PHPを使用してソースXML を操作しています。

標準のXSLTの拡張機能ですが、処理中に任意のPHPをXSLTスタイルシート内で実行できるPHP機能があります。

more info and examplesがあります。

EDIT:

考え直しで

、あなたは、単にXMLをXSLTにそれをハードコーディングせずにロードするかを指定する必要がある場合は、文書()関数は、ロードするファイルの名前のソースXMLノードを使用することができます。つまり、XMLで名前を生成した後、document()でテンプレート内の参照を参照するだけです。

関連する問題