SimpleXML Xpath查询和transformToXML

时间:2011-06-20 18:24:59

标签: php xslt xpath

我有一个XML文档,我试图用xpath查询,然后通过XSLTProcessor运行生成的节点。 xpath查询工作正常,但我无法弄清楚如何将SimpleXMLElement与XSLTProcessor一起使用。任何帮助将不胜感激。

$data = simplexml_load_file('document.xml');
$xml = $data->xpath('/nodes/node[1]');
$processor = new XSLTProcessor;
$xsl = simplexml_load_file('template.xsl');
$processor->importStyleSheet($xsl);
echo '<div>'.$processor->transformToXML($xml).'</div>';

XML:

<nodes>
    <node id="5">
        <title>Title</title>
    </node>
</nodes>

XSL:

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

<xsl:template match="//node">
<xsl:value-of select="@id" />
<xsl:value-of select="title" />
...

1 个答案:

答案 0 :(得分:0)

我认为您无法将$xml传递给XSLTProcessor::transformToXML方法,因为它是数组(由SimpleXMLElement::xpath生成):

  

PHP警告:   XSLTProcessor中:: transformToXml()   期望参数1是对象,   在/var/www/index.php中给出的数组   第11行

简单的补救措施就是将XPath表达式放入XSL样式表中:

<xsl:output method="html"/> <!-- don't embed XML declaration -->

<xsl:template match="/nodes/node[1]">
    <xsl:value-of select="@id"/>
    <xsl:value-of select="title"/>
</xsl:template>

$xml = simplexml_load_file('document.xml');
$xsl = simplexml_load_file('template.xsl');

$xslt = new XSLTProcessor;
$xslt->importStyleSheet($xsl);

echo '<div>'.$xslt->transformToXML($xml).'</div>';

修改

另一种方法是在XSL转换中使用数组的第一个元素(确保它不为null):

$data = simplexml_load_file('document.xml');
$xpath = $data->xpath('/nodes/node[1]');
$xml = $xpath[0];

$xsl = simplexml_load_file('template.xsl');

$xslt = new XSLTProcessor;
$xslt->importStyleSheet($xsl);

echo '<div>'.$xslt->transformToXML($xml).'</div>';

<xsl:template match="node">
    <xsl:value-of select="@id"/>
    <xsl:value-of select="title"/>
</xsl:template>