2017-11-19 9 views
0

XSLTProcessor transformToDocメソッドは、パラメータとしてDOMNodeが必要です。だから私はDOMDocumentをロードし、そこからノードを取得して(例えばDOMXPath経由で)、それをXSLTに渡してそのノードのみを変換し、何も無視する(つまり出力しない)ことができると考えました。しかし...どのようにノードをターゲットにしますか?方法がありますか、または私はこの仕組みがどういうふうに誤解していますか?XSLTで渡されたPHPのコンテキストノードをどのように対象にしますか?

A <xsl:template match="/">は、(私は子ノードに渡していても)文書のルート・ノードに一致し<xsl:template match=".">が事のクラッシュを行い、<xsl:template match="name-of-passed-node">が一致しませんが、デフォルトのXSLのような、それがテキストとしてアウト渡され、「上」のすべて(します)...

このPHP与えられた:

// Load input document 
$doc = new DOMDocument; 
$doc->load('some.xml'); 

// Find the context node we want to transform 
$xpath = new DOMXPath($doc); 
$node = $xpath->query('//some-node')->item(0); 

// Load XSLT document 
$xsl = new DOMDocument; 
$xsl->load('some.xsl'); 

// Do transformation 
$x = new XSLTProcessor(); 
$x->importStylesheet($xsl); 
$result = $x->transformToDoc($node); 

は、どのように私は、私のXSLTで与えられたノードをターゲットI出力するようにとだけそのノードとその子孫を変換するのですか?私はそれを実行しているいくつかのテストで

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match=" ? "> 
     <xsl:copy-of select="." /> 
    </xsl:template> 

</xsl:stylesheet> 

答えて

0

パラメータは初期のマッチとして、任意のDOMノードに取るように設計されていません、DOMノードの上のownerDocumentスタイルシートを実行するように見えるようです。たとえば、文書内にまったく挿入されていない新しいノードを作成すると、例えば、次のようになります。 $doc->createElement('foo')を入力し、変換メソッドに渡すと、$docオーナー文書が変換されます。だから私は、PHPの人は、元のクライアント側のMozilla XSLTProcessor APIの後に少しXSLTProcessor APIをモデル化したと思いますが、変換メソッドに渡す引数はそのAPIとは大きく異なります。

PHPで私が見る唯一のオプションは、あなたのスタイルシートがクローン

$doc2 = new DOMDocument(); 
$doc2->appendChild($doc2->importNode($node, TRUE)); 

でダミーのドキュメントを作成するために、あなたに渡したいノードの外側をナビゲートする必要があり、その後、合格していない場合そのダミーのdocを変換メソッドに渡します。

+0

ああ、あまりにも悪いです。ああ、ダミーのドキュメントの回避策はOKソリューションのように見えるので、Xsltヘルパークラスに追加します。ありがとう! – Svish

関連する問題