PHP, XML в HTML через XSLT делает HTML внутри кодированного CDATA

Мне действительно нужен ответ на этот вопрос. Я работаю над проектом, который использует XML для создания страниц, а затем XSLT для его создания на веб-странице. Вот пример кода:

public function transform ($xml) { $proc = new XSLTProcessor; $proc->importStyleSheet ($this->xsl); $output = $proc->transformToXML ($xml); return $output; } 

$ xml содержит веб-страницу в формате XML, например:

 <?xml version="1.0" encoding="utf-8"?> <page> <meta> <language>en</language> <title>Main page</title> <content> <![CDATA[ lot's of content here along with <p>html</p>. ]]> </content> </page> 

Таким образом, веб-страница находится в XML и передается функции преобразования, которая загружает XSL-файл для преобразования XML в HTML-страницу. Однако приведенные выше сценарии не смогут правильно загрузить тег контента, поскольку XSLT по какой-то причине не понимает CDATA и кодирует HTML для сущностей.

Итак, вопрос в том, как я могу выводить, используя XSLT, HTML как HTML, не получая его в виде сущностей?

Я уверен, что у вас в XSLT нет ничего подобного:

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

XSLT «отлично понимает» CDATA. Точнее – это вообще не касается CDATA, это задача лежащего в основе XML DOM-анализатора, который делает из него текстовое значение.

С точки зрения XSLT нет способа узнать, является ли строка

 "<div>bla &amp; bla</div>" 

вышел из

 <xml>&lt;div&gt;bla &amp;amp; bla&lt;/div&gt;</div> 

или

 <xml><![CDATA[<div>bla &amp; bla</div>]]></div> 

CDATA – это просто удобство сериализации. Полученный информационный набор / DOM тот же . И если вы не отключите выходное экранирование, XSLT правильно выдает следующее значение из приведенной выше строки:

 &lt;div&gt;bla &amp;amp; bla&lt;/div&gt; 

В чем причина того, что вы видите HTML-код на отображаемой странице.

Посмотрите, поможет ли это . Я бы добавил больше в ответ, но я думаю, что ссылка лучше справляется с объяснением того, как добиться такого результата преобразования из XSLT с помощью LexEv XMLReader, который является оболочкой для стандартного XMLReader, используемого XSLT и Saxon.