CDATA, и неработающий disable_output_escaping

MagicGTS

Новичок
CDATA, и неработающий disable_output_escaping

Видел тут на форуме, не тока у меня беда такая. Но вот что-то советы мне не помогли.
История такова, сайт построен на xml->xsl преобразованиях, типа генерится xml, а потом с использование php библиотеки xslt преобразований оно перегоняется в html. Печали особой небыло до необходимости вкрутить счетчики и банеры в тело xsl шаблона. И столкнулся с тем, что оно самостоятельно превращает все спец сиволы в их сущности независимо от тех настроек что я делал.
Вот кусок 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" version="4.0" encoding="windows-1251" indent="yes" />
	<xsl:template match="/">
		<html>
<![CDATA[<p align="center">некий текст</p>]]>
</html>
	</xsl:template>
Вместо того чтобы выдать мне html из секции CDATA он выдает мне html тока не в том види который я от него жду. То есть всякие <> заменяются на html сущьности, что мне совсем не надо.
Предпринимал такие шаги:
1) Поместил CDATA в <xsl:text disable_output_escaping="yes"></xsl:text>
Непомогло
2) Для пробы полностью убрал <xsl:eek:utput method="html" version="4.0" encoding="windows-1251" indent="yes" />
Не помогло.
Преобразования проводятся этим кодом
PHP:
$xsl = new XSLTProcessor();
	$xsl->importStyleSheet(DOMDocument::load("./test.xsl"));
	echo $xsl->transformToXML($xml);
Стоит php 5.04
Свои идеи кончились, других идей на форуме и в документации не ссыскал... Помоги с бедой справится!
 

ViJu

Новичок
Re: CDATA, и неработающий disable_output_escaping

что-то ты чудишь товарисч

<xsl:value-of select="." disable-output-escaping="yes"/>
 

MagicGTS

Новичок
Если не влом, напиши в контексте, я немного недогоняю куда пихануть эту строчку.
 

Kivsiak

Новичок
Возможно я и ошибаюсь ибо в предмет это только недавно въежать начло. Но по моему он делает имено то что ты ему сказал. CDATA на то и нужен что бы подмены делать. Ты не своем понял смысла xslt как такового. disable_output_escaping используется в блоках <xsl:value-of select>
и нужен для отмены преобразования ДАНЫХ и на ШАБЛОН как таковой не распространяется.
Более того твой шаблон тупо генерит один и тот же текст. Тебе скорее нужно что то подобное:
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" version="4.0" 
encoding="windows-1251" 

indent="yes" />
    <xsl:template match="/">
        <html>
<p align="center">
<xsl:value-of select="some_text_node" disable-output-escaping="yes" /> 
</p>
</html>
    </xsl:template>
 

chameleon

Новичок
а вот какого он (DOE) вообще понадобился?
замени
PHP:
<xsl:template match="/">
  <html>
    <![CDATA[<p align="center">некий текст</p>]]>
  </html>
</xsl:template>
на
PHP:
<xsl:template match="/">
  <html>
    <p align="center">некий текст</p>
  </html>
</xsl:template>
???
 

MagicGTS

Новичок
Народ, у меня небыло желания вываливать вам весь шаблон. Для простоты описания задачи я выдал именно тот кусок, который вызвал проблему. Мне именно и нужно что-бы в шаблоне это генерилось всегда! Если выхода нет, запихину в xml, но мне нужно именно в том виде всё запихнуть как написано. Ручками банер переписывать на соответствие xml это бред, а CDATA и была создана для данных в формате"как есть" и вывод с DOE по спецификации должен быть опционален, а не принудительным. Вечно все тут цепляются к частностям, и очень мало (уважаемых форумчан, жаль что на вопрос они успевают ответить позже чем все остальные :( ) которые видят суть вопроса.
 

Kivsiak

Новичок
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:eek:utput method="html" version="4.0" encoding="windows-1251" indent="yes" />
<xsl:template match="/">
<html><xsl:text disable-output-escaping="yes">
<![CDATA[
<p align="center"><b>dsgffdg</b></p>
]]>
</xsl:text>
</html>
</xsl:template>
</xsl:stylesheet>

Прекрасно съелось встроенным в IE6 конвертором. и отпарсилось в php4.3.10. Преобразовние делалось:
PHP:
$xs= xslt_create();
xslt_set_encoding($xs, 'cp1251');
$html=xslt_process($xs,'arg:/_xml',$xlt,NULL,$arguments );
echo $html;
 

MagicGTS

Новичок
Да вот беда, в php 5.x неработает, слаботрон из php 4.x нормально парсит :( Но нужен php 5...
 

chameleon

Новичок
Ручками банер переписывать на соответствие xml это бред
у вас, пардон, что шаблоны каждый час переписываются? или баннерного кода 10 кило? Ну если уж вопрос принципиален и нужно во что бы то ни стало "руками ничего не делать", то пропустите через tidy либо DOMDocument->recover = TRUE; и потом добавляйте куда угодно хоть в динамику хоть в статику.
и вывод с DOE по спецификации должен быть опционален, а не принудительным
раз это для процессора опционально, то почему вы так настойчиво хотите то, что может заработать по-другому без предупреждения хоть завтра?
 

MagicGTS

Новичок
Заказчик проэкта во всех этих делах вообще не шарит. обучать его "ручной" переделке банер безумие, проще застрелить и заказчика и себя. Идея была в скармливание кода банера спец форме, а затем втаскивание на сайт, но так как формы пока нет, а заказчик хочет до безобразия получить сырое решение, но лиж бы сейчас (глубоко плевав на стабильность и дырявость выходного кода). Вот я и решил просто встроить банер в шаблон как неотемлемую его часть, и встретил неожиданое препятствие (в теории в этом месте вообще не должно было быть проблем). И мне счас уже пофиг все предложения на манер "да нафиг ваще CDATA, нарисуй всё ручками и бог с ним". Я хочу услышать толковое решение текущей проблемы именно в том виде в котором она описанна в первом посте. Вариант ViJu во втором посте тоже не прошел, в выходной xml добавил cdata вот этим кодом
PHP:
$cdata= $xml->createCDATASection(iconv("windows-1251","UTF-8","<B>проверка на вшивость</B>")); 
	$node = $xml->createElement("banner");
	$node->appendChild($cdata);
	$root->appendChild($node);
На выходе мне дали >&lt;B&gt;проверка на вшивость&lt;/B&gt;
 

Kivsiak

Новичок
А зачем встраивать его в шаблон целиком? У тебя есть ветка с банерами лежащими там в CDATA, которую ты собственно и создал выше. Так пусть твой шаблон и берет ее оттуда.

<xsl:value-of select="//banner" disable-output-escaping="yes"/>

В value-of то преобразование согласно спецификации просходит?
 

MagicGTS

Новичок
Да происходят, но если честно, то и в том виде как я писал тоже должны. Да вот никак. Наверно баг в либе, или неуспели все реализовать :(
В целом топик можно закрывать.
В результате:
DOE пашет в php5 только если испоьзуется в <xsl:value-of
Другие варианты на даный момент не работают.
Всем спасибо.
 

slach

Новичок
еще есть варианты
PHP:
<xsl:text disable-output-escaping="yes">
<![CDATA[
<p>test</p>
]]>
</xsl:text>
 

MagicGTS

Новичок
Я об этом писал. В PHP4 (на слаботроне) оно пашет, а в PHP5 нехочет.
 

pk

Новичок
http://bugs.php.net/bug.php?id=29837&edit=1

Предлагаемое решение у меня не работает. Я использую <xsl:eek:utput method="xml"/>, PHP Version 5.1.1, libxslt Version 1.1.15, libxml2 Version 2.6.22.
 

Solid

Drosera anglica
Желательно не использовать disable_output_escaping, т.к. этот аттрибут, в последствии, работать не будет... да и уже не всякий процессор поддерживает его работу. К примеру, в новом gecko движке эта возможность уже обрубленна.

Советую писать правильно:
Код:
<xsl:element name="p">test</xsl:element>
 
Сверху