2011-08-01 49 views
3

我试图在PHP文档中加载XML并将其传递给XSLT。我可以直接将XML文件加载到XSLT中,但我试图避免使用实际文件,而只是使用cURL来获取我的数据。将PHP DOM传递给XSLT

这里是我的PHP脚本:

<?php 

header("Content-type: text/xml"); 

$ch = curl_init("domain1.com/sample1.php"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch);  
curl_close($ch); 
$sample1 = new DOMDocument(); 
$sample1->formatOutput = true; 
$sample1->loadXML($output); 
$sample1->save("sample1.xml"); 

$ch = curl_init("domain1.com/sample2.php"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch);  
curl_close($ch); 
$sample2 = new DOMDocument(); 
$sample2->formatOutput = true; 
$sample2->loadXML($output); 
$sample2->save("sample2.xml"); 

/* load the xml file and stylesheet as domdocuments */ 
$xsl = new DomDocument(); 
$xsl->load("transform.xsl"); 

/* create the processor and import the stylesheet */ 
$proc = new XsltProcessor(); 
$xsl = $proc->importStylesheet($xsl); 

$mergedxml = new DomDocument(); 
$mergedxml->loadXML($proc->transformToXML($sample1)); 
echo $mergedxml->saveXML(); 
$mergedxml->save("results.xml"); 

?> 

下面是我的XSLT文件使用第二个文件(sample2.xml)行:

<xsl:variable name="input2" select="document('sample2.xml')/DATA"/> 

我知道你可以在调用一些PHP函数XLST,但我似乎无法弄清楚如何在不首先保存到文件的情况下将XML DOMDocument直接传递给XSLT。这可能吗?或者我需要以不同的方式做到这一点?我对PHP和XSLT相当陌生,所以对我们的帮助表示赞赏。

谢谢。

+0

根据http://php.net/manual/en/xsltprocessor.setparameter.php,没有办法做到这一点,但我也很好奇。 – Tomalak

+0

@Tomalak - 是的,我也看到了。希望有另一种方式来做到这一点。 – jared

回答

1

这是一个可能的解决方案 - 例如当您需要创建POST来检索XML时,它不适用于所有情况,但它可以防止将任何XML文件保存出去。让XSLT处理器为您执行检索,并且您可以使用处理器上的setParameter方法指定文件。

<?php 

/* load the xsl file into a DOMDocument, and set the documentURI */ 
$xsl = new DomDocument(); 
$xsl->load("transform.xsl"); 
$xsl->documentURI = "/path/to/transform.xsl"; 

/* need a document, can be empty */ 
$doc = new DOMDocument(); 

/* define the sources for your external XML, can be static or dynamic */ 
$params = array(
    'source-books' => 'http://example.com/books.php', 
    'source-films' => 'http://example.com/films.xml', 
); 

/* create the processor and import the stylesheet, set your source parameters */ 
$proc = new XsltProcessor(); 
$proc->importStylesheet($xsl); 
$proc->setParameter('',$params); 

echo $proc->transformToXml($doc); 

内XSL,你可以,如果合适的话,定义默认来源为您的样品,它可以是本地文件系统或URI中的相对路径。

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > 
    <xsl:output method="html" omit-xml-declaration="yes" /> 

    <!-- define default parameters --> 
    <xsl:param name="source-actors" select="'actors.xml'"/> 
    <xsl:param name="source-books" select="'http://example2/com/books.xml'"/> 

    <!-- pickup the source parameters --> 
    <xsl:variable name="films" select="document($source-films)/films"/> 
    <xsl:variable name="books" select="document($source-books)/books"/> 
    <xsl:variable name="actors" select="document($source-actors)/actors"/> 

    <xsl:template match="/"> 
    <html> 
     <body> 
     <h4> 
      Found <xsl:value-of select="count($films/film)" /> films in document at <xsl:value-of select="$source-films" /> 
     </h4> 
     <ul> 
      <xsl:apply-templates select="$films/film" /> 
     </ul> 
     <h4> 
      Found <xsl:value-of select="count($books/book)" /> books in document at <xsl:value-of select="$source-books" /> 
     </h4> 
     <ul> 
      <xsl:apply-templates select="$books/book" /> 
     </ul> 
     <h4> 
      Found <xsl:value-of select="count($actors/actor)" /> actors in document at <xsl:value-of select="$source-actors" /> 
     </h4> 
     <ul> 
      <xsl:apply-templates select="$actors/actor" /> 
     </ul> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="film|book|actor"> 
     <li><xsl:value-of select="@uid" />: <xsl:value-of select="." /></li> 
    </xsl:template> 
</xsl:stylesheet>