Передайте PHP DOM в XSLT - PullRequest
       16

Передайте PHP DOM в XSLT

3 голосов
/ 01 августа 2011

Я пытаюсь загрузить XML в документ PHP и передать его в XSLT.Я могу загрузить файл XML прямо в XSLT, но я стараюсь не использовать реальные файлы, а просто использую cURL для получения моих данных.

Вот мой 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, поэтому любая помощь приветствуется.

Спасибо.

1 Ответ

1 голос
/ 07 августа 2011

Это возможное решение - оно не будет работать во всех ситуациях, например, когда вам нужно сделать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...