2

我将PHP 与 XSLregisterPHPfunctions一起使用。

可以返回 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 enconded XML”。在 XSL 中使用copy-ofor value-of,不修改返回行为。是演员阵容问题吗?

PS:即使使用身份功能,我也测试过,它不返回 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>

您还可以使用 构造您的 xmlSimpleXMLElement并将其转换为 DOM 树dom_import_simplexml(),然后您可以将其返回。使用 SimpleXML 构造 xml 通常不会那么痛苦。

于 2013-03-04T21:11:45.860 回答
0

OPS,这是某种魔法!现在@hek2mgi 提示正在工作!

我在用

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

...我会在几天后回到这里,就“稳定的解决方案”和结论多说一些...

于 2013-03-04T20:16:58.293 回答