我想在PHP函数中创建XML并将其返回给XSLT。 在XSLT中,我想创建一个节点集并使用它。
在PHP中,我有一个函数,它将XML作为字符串返回。
function xmlString() {
$string = ''.
'<test>'.
'<a>1</a>'.
'<b>2</b>'.
'</test>'.
'<test>'.
'<a>3</a>'.
'</test>'.
'';
return $string;
}
我已经在PHP中注册了这个函数并在XSLT中使用它
<xsl:variable name="xmlString">
<xsl:value-of select="php:function('xmlString')" />
</xsl:variable>
禁用输出转义我在
的值上使用了disable-output-escaping="yes"
我也和exsl:node-set
一起玩,但我无法正常工作
我想像<xsl:value-of select="exsl:node-set($xmlString)/test/b" />
答案 0 :(得分:1)
以下是使用PHP 5.5测试的示例:
PropertyChanged
输出
<html>
<head>
<title>PHP extension function returns DOM document fragment to XSLT to be treated as node-set in XSLT</title>
</head>
<body>
<?php
function makeXml() {
$doc = new DOMDocument();
$frag = $doc->createDocumentFragment();
$frag->appendXML('<test><a>foo</a></test><test><a>bar</a></test>');
return $frag;
}
$xml = <<<EOB
<root></root>
EOB;
$doc = new DOMDocument();
$doc->loadXML($xml);
$xsl = <<<'EOB'
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
xmlns:php="http://php.net/xsl"
exclude-result-prefixes="exsl php">
<xsl:output method="html" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="frag" select="php:function('makeXml')"/>
<ul>
<xsl:apply-templates select="$frag/test/a"/>
</ul>
</xsl:template>
<xsl:template match="a">
<li>
<xsl:apply-templates/>
</li>
</xsl:template>
</xsl:stylesheet>
EOB;
$xsldoc = new DOMDocument();
$xsldoc->loadXML($xsl);
$proc = new XSLTProcessor();
$proc->registerPHPFunctions();
$proc->importStyleSheet($xsldoc);
echo $proc->transformToXML($doc);
?>
</body>
</html>