从PHP函数在XSLT中创建NodeSet

时间:2015-07-08 11:18:31

标签: php xml xslt

我想在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" />

一样使用它

1 个答案:

答案 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>