Подскажите лучший способ конвертации XML 2 RTF

vasiliy

Новичок
Подскажите лучший способ конвертации XML 2 RTF

Здравствуйте, уважаемые.
Хочу посоветоваться со знающими людьми в надежде что это поможет мне сэкономить время, не слишком жертвуя масштабируемостью.

Введение:
Цель была изначально такая: вывести результат некого запроса (к БД, неважно к какой в настоящее время уже реализовано несколько разных "драйверов" для разных БД) в виде RTF.
Естественно как человек жаждущий знаний я решил пойти путём умным: есть скрипт, которая выдаёт результат (всё необходимое) в XML и есть XSLT-шаблон, который описывает преобразование этого всего в RTF.
Почему так хитро: предполагается, что в дальнейшем, при расширении системы возможно будет менять формат файла просто заменяя xslt-шаблоны. Да и возможно (скорее всего) необходим будет экспорт не только в RTF. Хотелось бы, что бы скрипт, который формирует данные в XML был в одном месте, а конвертирование их в RTF выполналось другой функцией.

По отдельности каждая из частей работает: формируется правильный XML документ, и он верно (проверялось sabcmd) конвертируется в RTF, который потом успешно открывается.

Задача:
Как мне произвести XSL-трансформацию из PHP (версия 5.1xxx). Естественно есть много способов, один лучше другого, и у всех свои плюсы и минусы. Собственно задача состоит в том, чтобы выбрать что-нибудь. Собственно я хочу, что бы уважаемая публика прокомментировала варианты.

  • Использовать стандартный XSLTProcessor. Этот способ меня вполне устраивает, но предназначен он семантически для преобразования XML в XML (или в HTML в крайнем случае)! RTF же на XML ну никак не смахивает. Вообщем-то возможно метод transformToXML делает как раз то, то нужно и его результат подойдёт (буду пробовать), но семантически это не совсем верное решение и меня не устраивает то, что его применение (в некоторых реализациях) в дальнейшем может привести к ошибкам, которые будет непросто обнаружить.
  • Использовать XSLT transformations (те что на базе sablotron'а). Этот вариант кажется мне наиболее красивым (по крайней мере, sabcmd меня вполне устраивает), но естественно меня расстраивает, что он не входит в стандартные расширения PHP5. Переходить на PHP4 мне не хочется. В принципе, я не против установить его из PECL и вынести (и sablotron заодно) в требование к системе, но я его не нашёл в PECL. Если бы кто-нибудь мне разъяснил ситуацию с этой либой, я был бы очень благодарен.
  • Использовать sabcmd через proc_open. Т.е. запустить sabcmd и работать с его stdin/out (что не очень красиво). Главная проблема в том, что я стараюсь вообще не допускать fork-exec из скриптов по соображениям безопасности (параметры естественно передавать надо будет). Осталось только убедить себя, что это моя личная паранойя. Кроме того, я в своё время сталкивался с определёнными проблемами при такой реализации на платформе Windows, а именно sabcmd (который компилится gcc) почему-то не использует stdin, а создаёт терминал. Хотя возможно я просто загоняюсь.
  • Забить на xslt, и написать просто php скрипт, который программно конвертит XML в нужный RTF. Этот способ тоже вполне рабочий, но мне кажется он выглядит непрозрачен и неочевидным. Это очень размытые слова, я в них в данном случае вкладываю следующий смысл: при необходимости сделать новый шаблон он 1) потребует знания PHP 2) будет гораздо более загруженным, чем XSLT.

Что бы уважаемая публика мне посоветовала?
 

slach

Новичок
1) sablotron от XSLTProcessor не отличается по сути, просто это разные API для разных версий PHP и для разных XSLT процессоров,
XSLTProcessor - php5 only для libxslt, xslt_** functions для sablotron

использовать sabcmd еще хуже
2) трансформировать в RTF в данном случае на мой взгляд будет сильно накладно по процессорным ресурсам

3) наиболее оптимальный с точки зрения ресурсоемкости на мой взгляд путь
сделать ШАБЛОН RTF файла, в котором нужные места разметить, и подставлять на основе шаблона данные из базы, НЕ ПРЕОБРАЗОВЫВАЯ их в XML, ибо нет смысла

4) если же ресурсоемкость побороть КЕШИРОВАНИЕМ, то тогда идите гуглите на предмет готовых XSLT преобразований
например вот тут
http://www.microsoft.com/Rus/Msdn/Publish/Articles/XMLtoRTF.mspx
 

vasiliy

Новичок
Ресурсоёмкость не пугает, в данном случае ей можно пожертвовать (а уж тем более процессорными ресурсами).
Гораздо более необходима возможность написания шаблонов.

Повторюсь: само преобразование я написал, и гуглить тут ничего не надо, ничего сложного в этом нет, если хоть немного представлять себе что такое rtf и xslt.
 

slach

Новичок
=) тогда в чем вопрос?
для php 5.1

XSLTProcessor
плюс кеширование результата
 

vasiliy

Новичок
=) ыы.

Ок, если XSLTProcessor, то какой метод сипользовать? transformToXML?
 

slach

Новичок
вы мануал таки читали???
а про XSLT вообще в целом?
вам надо чтоли чтобы ктото вам написал transformToRTF чтоли?? =)


короче на пальцах разница между transformToHTML и transformToXML
только что если в шаблоне есть <tag></tag>
то для transformToHTML будет <tag> а в toXML <tag/>
 

pk

Новичок
disable-output-escaping="yes" игнорируется в XSLTProcessor

Господа, помогите найти толковый ответ, почему XSLTProcessor игнорирует атрибут disable-output-escaping="yes" (активно применяющийся при формированиии "не совсем"-XML документов). Я нашел php-баг #29837 (http://bugs.php.net/bug.php?id=29837&edit=1). В нем для исправления ситуации рекомендуется загружать таблицу стилей с указанием LIBXML_NOCDATA. Но это не работает! Я использую <xsl:eek:utput method="xml"/>, PHP Version 5.1.1, libxslt Version 1.1.15, libxml2 Version 2.6.22.
 
Сверху