PHP, XML в HTML через XSLT превращает код HTML в CDATA - PullRequest
2 голосов
/ 11 ноября 2009

Мне действительно нужен ответ на этот вопрос. Я работаю над проектом, который использует 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, не кодируя его в сущности?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2009

Я уверен, что в вашем 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-код на отображаемой странице.

0 голосов
/ 11 ноября 2009

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

...