2011-06-22 2 views
0

私は、異なる構造のXMLを取得し、すべてのデータを含む一意のXMLを作成するスクリプトを作成しようとしています。要点は、XSLTを使用すると、ソース/ XMLの構造が異なるため、ノード/要素の名前を変更/変換するということです。したがって、新しく生成されたXMLは、私が適切に使用するための一般的な構造を持っています。一度に複数のXMLファイルをロードできるように、コードを変更しました。完全なPHP、XML、XSLTコードが与えられました

私の質問は、私が複数のXMLの結果を生み出すためにこれをどのように変更できますか?

XMLは、相対パスまたは絶対パスのいずれかになります。

<?php 

// create an XSLT processor and load the stylesheet as a DOM 
$xproc = new XsltProcessor(); 
$xslt = new DomDocument; 
$xslt->load('stylesheet.xslt'); // this contains the code from above 
$xproc->importStylesheet($xslt); 


// DOM or the source XML 
$xml = ''; 
$dom = new DomDocument; 
$dom->loadXML($xml); 


?> 
+0

XSLTパーツの可能な[重複](http://stackoverflow.com/questions/6338485/xslt-document-function-folder-hierarchy/6342127#6342127) –

答えて

1

Hmm。まあ、この猫をスキンするにはあまりにも多くの方法がありますが、2つの明らかなものがあります。

  1. XMLファイルを XSLTレイヤーでインポートします。これには、XSLT スキルが必要です。
  2. XMLファイルを のPHPレイヤーにインポートします。これにはPHP スキルが必要です。

最初の解決策は、処理したいすべてのファイルのリストを見つけてから、XSLTプロセッサに渡すようなXMLファイルリストを作成することを意味します。

<list> 
    <file src="..." /> 
    <file src="..." /> 
    <file src="..." /> 
</list> 

これらのファイルをループスルー(またはマッチ)し、次のようなものを使用します。

<xsl:template match="file"> 
    <xsl:apply-templates select="document(@src)/*" /> 
</xsl:template> 

もう1つの解決策は、すべてのファイルを見つけてより大きなXMLでバインドすることです。

$xml = "<all_files>" ; 
foreach ($files as $file) 
    $xml .= file_get_contents ($file) ; 
$xml .= "</all_files>" ; 

通常、XSLTにテンプレートを適用させます。これには明らかにいくつかのクリーンアップが必要です(XML宣言とインラインコマンドがあればDTDやエンティティのものもあれば削除しますが、それほど難しくありません)。

どちらの解決策も必要です。あなたのスキルは何ですか?あなたは何をしたいですか?メモリを節約する必要がありますか?速い?簡潔ですか?フレキシブル?

+0

こんにちは、あなたの答えに感謝します!私は今コードをチェックし、あなたに返信します。手動でXMLを組み合わせることはオプションではないので、コードを実行するたびに更新されたドキュメントを持たせるために、他のWebサイトからXMLをロードする必要があります。私は両方とも勤勉に働くことができます。私の場合、スクリプトは1000以上の多くのXMLを処理する必要があります。私はメモリを節約し、速くする必要があると思いますか?これは私のアプローチをどのように変えますか? – EnexoOnoma

+1

document()関数を使用して1000sのドキュメントをロードすると、メモリの問題が発生する可能性があります。各ファイルが他のファイルとは独立して処理されるかどうかは私には分かりません。そうだとすれば、すべてのファイルを処理する1つの変換を実行するのではなく、1000の異なるソースファイルに対して同じ変換を1000回実行します。 –

+0

あなたには難しいですが、マイケル、あなたはSAXを呼び出すことができ、最高のために願っています。 :)はい、あなたが狂った量のファイルを持っている場合、それらを分割し、それらをバッチするか、そうでなければプロセスをマングルする。 – AlexanderJohannesen

関連する問題