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, не закодировав его в сущности?


person Tower    schedule 11.11.2009    source источник


Ответы (2)


Я уверен, что в вашем 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>

or

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

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

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

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

person Tomalak    schedule 11.11.2009

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

person Ryan Lynch    schedule 11.11.2009