IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Динамическое XML не проходит трансформацию (https://www.imho.ws/showthread.php?t=133339)

Melkor 23.06.2008 14:46

Динамическое XML не проходит трансформацию
 
То же самое, но в файле проходит, но если генерится скриптом, то нет.
Пример генерации:
PHP код:

<?php
header
("Content-type: application/xml");
//header("Content-type: text/xml");
    
$xw = new xmlWriter();
    
$xw->openMemory();

    
$xw->startDocument('1.0','UTF-8');
    
$xw->startElement ('ul'); // <ul>

    
$xw->writeElement ('li''Test php Document');
    
$xw->writeElement ('li''Test xml Document');

    
$xw->endElement(); // </ul>
    
echo $xw->outputMemory(true);

?>

Заголовок вроде посылаю, в .htaccess прописал
Код:

<Files *xml>
ForceType application/x-httpd-php
</Files>

получаю ошибку:
Warning: XSLTProcessor::transformToXml()
parser error : Start tag expected, '<' not found in...
Что курить дальше?

Hubbitus 24.06.2008 16:56

А выдается-то корректный документ? Никаких варнингов, ошибок и прочей дряни не добавляется случайно?

Melkor 25.06.2008 13:59

Выдается валидный, как домой прийду кину аттач с примером.
Тут по-моему дело в том, что пхп файл читается, а не запускается. То есть первая строчка читается <?php, а не как декларация.

Добавление той строки в htaccess по-идее должно это решить, но видимо этого не хватает. Может надо что-то в настройках изменить...

Hubbitus 25.06.2008 15:34

Так я не могу понять, у Вас проблема с парсингом XML или не можете назначить обработчик, чтобы файлы обрабатывались с помощью PHP?

Что именно выдает сервер-то? Что поступает на вход XSLT-процессору?

Melkor 25.06.2008 15:58

Вложений: 1
Я не могу сделать так, чтобы вот этот код работал:
PHP код:

    <?php
    $xp 
= new XsltProcessor();

    
// create a DOM document and load the XSL stylesheet
    
$xsl = new DomDocument;
    
$xsl->load('style.xsl');

    
// import the XSL styelsheet into the XSLT process
    
$xp->importStylesheet($xsl);
    
// create a DOM document and load the XML datat
    
$xml_doc = new DomDocument;
    
$xml_doc->load('content.php');

  
// transform the XML into HTML using the XSL file
    
if ($html $xp->transformToXML($xml_doc))
    {
        echo 
$html;
    }
    else
    {
        
trigger_error('XSL transformation failed.'E_USER_ERROR);
    } 
// if


?>

// content.php
<?php
//header("Content-type: application/xml");
//header("Content-type: text/xml");
    
$xw = new xmlWriter();
    
$xw->openMemory();

    
$xw->startDocument('1.0','UTF-8');
    
$xw->startElement ('ul'); // <ul>

    
$xw->writeElement ('li''Test php Document');
    
$xw->writeElement ('li''Test xml Document');

    
$xw->endElement(); // </ul>
    
echo $xw->outputMemory(true);

?>

Вылетает с ошибкой:
Warning: DOMDocument::load() [function.DOMDocument-load]: Start tag expected, '<' not found in file:///D%3A/xampp/htdocs/Basics_xml/imho/content.php, line: 16 in D:\xampp\htdocs\Basics_xml\imho\php_handler.php on line 21

При этом если я даю этот документ то все работает.
Код:

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<ul>
        <li>Test php Document</li>
        <li>Test xml Document</li>
</ul>

Это в общем-то результат вывода content.php в броузер.

Как я понимаю проблема в том, что DomDocument открывает файл как он есть, а набо бы открыть его как скрипт и взять уже результат.

Melkor 25.06.2008 16:52

у меня есть менее удобный вариант обхода:
запихать все это в функцию и выдавать так:
PHP код:

function doit()
{
$string = <<<XML
<?xml version='1.0' encoding='utf-8' ?>

<ul>
    <li>Test php Document</li>
    <li>Test xml Document</li>
</ul>
XML;
return $string;

}

$xp->transformToXML(DomDocument::loadXML( my_function() )


Hubbitus 25.06.2008 18:00

Цитата:

Сообщение от Melkor (Сообщение 1566919)
$xml_doc->load('content.php');

Конечно же это загрузит PHP - код, а не XML, как результат выполнения скрипта content.php.
Как Вариант, можете попробовать грузить его через Веб-сервер, типа такого:
$xml_doc->load('http://example.com/content.php');
Как Вариант, можете выполнить его на сервере типа такого:
$xml_doc->load( passthru('/usr/bin/php content.php'));

Но лучше, лучше все же сделать так:
В content.php убираете вывод, то есть удаляете (комментируете) строку echo $xw->outputMemory(true); а там где процессите, вместо процитированной строки делаете так:
PHP код:

include('content.php');
$xml_doc->load$xw->outputMemory(true) ); 


Melkor 25.06.2008 19:31

Да, последний вариант лучше всего и главное работает :) Только надо через loadXML загружать, иначе какие-то странные потери в коде

Остановился на таком варианте:

PHP код:

    <?php
    $xp 
= new XsltProcessor();

    
// create a DOM document and load the XSL stylesheet
    
$xsl = new DomDocument;
    
$xsl->load('style.xsl');

    
// import the XSL styelsheet into the XSLT process
    
$xp->importStylesheet($xsl);
    
// create a DOM document and load the XML datat
    
$xml_doc = new DomDocument;

    include(
'content.php');

  
// transform the XML into HTML using the XSL file
    
if ($html $xp->transformToXML(DomDocument::loadXML$xw->outputMemory(true))))
    {
        echo 
$html;
    }
    else
    {
        
trigger_error('XSL transformation failed.'E_USER_ERROR);
    } 
// if
?>

вывод в броузер через loadXML()
Код:

<h2>Style loaded</h2>start<ul>
<li>Test php Document</li>
<li>Test xml Document</li>

</ul>end

вариант 2:

вывод в броузер через load()
Код:

<h2>Style loaded</h2>startend
Вопрос можно считать решенным :):beer:


Часовой пояс GMT +4, время: 19:21.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.