Опять же возвращаясь к старой теме. Поцоны написали, что можно сделать так: Код (PHP): <xsl:text><![CDATA[<?php echo 123 ?>]]></xsl:text> но так можно сделать, если код xslt-шаблона находится в том-же файле, где и XSLT-процессор. У меня же все xslt-преобразования находятся в .xsl-файлах, поэтому тупо вываливает на страичку <?php echo 123 ?> Попробовал сделать такое: Код (PHP): AddHandler application/x-httpd-php .php .xsl но как и следовало ожидать, ничего не получилось. Какие еще могут быть варианты встроить php в xslt? Добавлено спустя 57 секунд: Хм, наверное можно сделать левый xml-файл, в котором и будет php-код на входе и xml на выходе, а его уже обрабатывать xslt-шаблонами
Код (Text): AddType application/x-httpd-php .xsl В начале файла не забыть Код (PHP): header('Content-type: text/xml'); Тип добавить перед строкой Код (Text): Action application/x-httpd-php "путь к php"
Не понятно. Обычно есть xml файлы, они в своём коде требуют файл преобразований xsl в теге Код (Text): <?xml-stylesheet href="style.xsl" type="text/xsl"?> Вот для xsl файла и настроить Апач, чтобы он воспринимал его, как php скрипт. В .htaccess или в httpd.conf вписать строчку Код (Text): AddType application/x-httpd-php .xsl Если xsl будет восприниматься, как php скрипт, то можно вписывать "<?php echo 123 ?>" хоть куда, или header('Content-type: text/xml'); или лучше header('Content-type: text/xsl'); Проблема может возникнуть, если оставлять в xml файлах объявление Код (Text): <?xml version="1.0" encoding="utf-8"?> т.к. php будет сбивать с толку начало "<?". Нужно вывести объявление отдельно Код (PHP): <?php header('Content-type: text/xsl'); echo '<?xml version="1.0" encoding="utf-8"?>'; ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Ок, тогда давай так. index.php: Код (PHP): <?php $doc = new DOMDocument(); $doc->load('test.xml'); $xsl= new DOMDocument(); $xsl->load('test.xsl'); $proc= new XSLTProcessor(); $proc->importStyleSheet($xsl); echo $proc->transformToXML($doc); ?> test.xml Код (PHP): <?xml version="1.0" encoding="UTF-8"?> <udata> <num>6</num> </udata> test.xsl Код (PHP): <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="utf-8" indent="yes"/> <xsl:template match="udata"> <xsl:call-template name="factorial"> <xsl:with-param name="n" select="num"/> </xsl:call-template> </xsl:template> <xsl:template name="factorial"> <xsl:param name="n"/> <xsl:choose> <xsl:when test="$n=0">1</xsl:when> <xsl:otherwise> <xsl:variable name="n-1"> <xsl:call-template name="factorial"> <xsl:with-param name="n" select="$n - 1"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$n * number($n-1)"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> запускаем index.php, получаем в браузере 720 Что мне в этом test.xsl дописать, чтобы можно было выполнить php-код? Вот хотя-бы тот-же session_start(); например Добавлено спустя 13 минут 59 секунд: Если же мы добавим в наш test.xsl вот тот хедер, то получим что-то типа этого: Код (PHP): Warning: DOMDocument::load() [domdocument.load]: Start tag expected, '<' not found in Поскольку test.xsl уже не валидный xml-файл ну и в том-же духе дальше: Код (PHP): Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: compilation error in Код (PHP): Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: xsltParseStylesheetProcess : empty stylesheet in Код (PHP): Warning: XSLTProcessor::transformToXml() [xsltprocessor.transformtoxml]: No stylesheet associated to this object in
Мда, я тебя не правильно понял. Никогда не использовал XSLTProcessor, т.к. считал, что загружать им сервер не стоит. Делал вывод отдельно сгенерированных xml и xsl, полагаясь на браузер пользователя. Т.к. нужно всё это преобразовать на сервере, можно так: index.php Код (PHP): <?php //index.php//использование XSLTProcessor ob_start(); include('test.xml');//парсинг/выполнение/присоединение переменных $docF=ob_get_contents(); ob_end_clean(); $doc=new DOMDocument(); $doc->loadXML($docF);//вместо ->load(файл) $xsl= new DOMDocument(); ob_start(); include('test.xsl'); $xslF=ob_get_contents(); ob_end_clean(); $xsl->loadXML($xslF);//вместо ->load(файл) $proc= new XSLTProcessor(); $proc->importStyleSheet($xsl); echo $proc->transformToXML($doc); ?> test.xml Код (PHP): <?php echo '<?xml version="1.0" encoding="UTF-8"?>',"\n"; //и любой другой php код... ?> <udata> <num>6</num> </udata> В test.xsl то же самое сделать, вывести '<?xml version="1.0" encoding="UTF-8"?>' через echo. В этом случае, если не придется вызывать xml и xsl из браузера, то не нужно добавлять в .htaccess Код (Text): AddType application/x-httpd-php .xsl AddType application/x-httpd-php .xml
Да тут наверное можно было в index.php загрузить xsl через file_get_content и отдать его XSLT-процессору через loadXML а не через load., и даже не пришлось бы городить htaccess - xsl-шаблон бы находился в php-файле. Но проблема в другом На сервере я ничего сделать не могу, кроме как править XSLT-шаблоны. Это движок UMI.CMS. Понадобилось на сайт добавить нестандартный блок, который невозможно сделать средствами движка. Можно это реализовать через макросы, но документация по написанию макросов очень скудная. Сами же файлы движка выглядят примерно так: Код (PHP): $v8b1dc169bf460ee884fceef66c6607d6 = cmsController::getInstance();$v72ee76c5c29383b7c9f9225c1fa4d10b = $v8b1dc169bf460ee884fceef66c6607d6->getCurrentDomain()->getId();$v100664c6e2c0333b19a729f2f3ddb7dd = CURRENT_WORKING_DIR . "/sys-temp/sitemap/{$v72ee76c5c29383b7c9f9225c1fa4d10b}/";$v736007832d2167baaae763fd3a3f3cf1 = dir($v100664c6e2c0333b19a729f2f3ddb7dd);while (false !== ($v8c7dd922ad47494fc02c388e12c00eac = $v736007832d2167baaae763fd3a3f3cf1->read())) {if(is_file($v100664c6e2c0333b19a729f2f3ddb7dd . $v8c7dd922ad47494fc02c388e12c00eac)) readfile($v100664c6e2c0333b19a729f2f3ddb7dd . $v8c7dd922ad47494fc02c388e12c00eac);}$v736007832d2167baaae763fd3a3f3cf1->close();echo '</urlset>'; и т.д. таких вот файлов еще несколько тысяч и все это в одну строчку