2

XSLregisterPHPfunctionsで PHP を使用しています。

を使用して PHP 文字列値を返すことはxsl:value-of問題ありませんが、PHP から XML フラグメントを返す方法がわかりません。


XSLT での例:

 <xsl:template match="table">
     <xsl:copy-of select="php:function('myfunc',.)"/>
 </xsl:template>

PHP での例:

 function myfunc($x) {return '<table><tr><td>ok</td></tr></table>';}

結果は XML ではなく、「lt/gt/amp でエンコードされた XML」です。XSLの使用copy-ofまたはvalue-ofXSL での使用。戻り動作を変更しないでください。キャストの問題ですか?

PS: ID 関数を使用しても、テストしたところ、XML ノードは返されません。

 function myfunc($x) {return $x;}
4

2 に答える 2

2

のサブクラスを返すだけですDOMNode:

$xml = '<root/>';
$xsl = <<<'EOL'
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:php="http://php.net/xsl">
    <xsl:template match="/root">
        <xsl:copy-of select="php:function('myXMLFunc', .)"/>
    </xsl:template>
</xsl:stylesheet>
EOL;

function myXMLFunc($m) { // $m is always an array of DOMNodes
    $d = new DOMDocument();
    $e = $d->createElement('newroot');
    $e->appendChild($d->createTextNode('inner text'));
    return $e;
}

$xmldoc = DOMDocument::loadXML($xml);
$xsldoc = DOMDocument::loadXML($xsl);

$proc = new XSLTProcessor();
$proc->registerPHPFunctions('myXMLFunc');
$proc->importStyleSheet($xsldoc);

echo $proc->transformToXML($xmldoc);

上記は xml を生成し<newroot>inner text</newroot>ます。

を使用して xml を作成しSimpleXMLElement、 を使用して DOM ツリーに変換することもdom_import_simplexml()できます。これを返すことができます。通常、SimpleXML を使用して xml を構築する方が、はるかに負担が少なくなります。

于 2013-03-04T21:11:45.860 に答える
0

おっと、それはある種の魔法です!@hek2mgi のヒントが機能するようになりました。

私は使っている

 <xsl:template match="table">
  <xsl:copy-of select="php:function('myfunc',.)" disable-output-escaping="yes" />
 </xsl:template>

...「安定した解決策」と結論については、数日中にここに戻ってきます...

于 2013-03-04T20:16:58.293 に答える