вставка HTML в раздел CDATA через xsl: value-of select

У меня есть исходный XML, содержащий тег с HTML. Он был создан из неуклюжего CSV-файла.

Цель состоит в том, чтобы преобразовать исходный XML во второй XML, используя следующее:

<Description type="long" format="html">
  <![CDATA[             
    <xsl:value-of select="HTML_Descr"/>
 ]]>
</Description>

К сожалению, XSL трансформируется следующим образом

<Description type="long" format="html">
  <![CDATA[             
    &lt;xsl:value-of select="HTML_Descr"/&gt;
 ]]>
</Description>

Вывод имеет смысл, если подумать, но цель просто заключить HTML в CDATA.

ПРИМЕЧАНИЯ: - Невозможно поместить CDATA в исходный XML. - Точнее, исходный XML-файл - это сотни XML-файлов. - Процессор - xsltproc, использующий XSL 1.0.

Прости. Обильные найденные подсказки просто сохраняли формат HTML. Заранее спасибо.

Дополнение

Полный процесс: CSV -> XML (временный перевод с использованием заголовков CSV) -> XML (хорошо) -> (X) HTML.

А HTML нельзя преобразовать из временного XML, потому что хороший XML поддерживается в репозитории и постоянно обновляется.


person Gabe Rainbow    schedule 17.03.2013    source источник


Ответы (2)


На самом деле это ближайший вопрос: Convert 'embedded 'XML-документ в вывод CDATA в XSLT (1.0)

И ответ:

Следующие функции выполняются по желанию, хотя это может быть не единственное и лучшее решение.

<xsl:template match="document">
  <document>
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
    <xsl:copy-of select="./html"/>
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
  </document>
</xsl:template>
person Gabe Rainbow    schedule 18.03.2013

Вы, наверное, захотите этого:

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

Обратите внимание, однако, что это может сделать ваш XML-файл недействительным, если HTML-фрагмент в CDATA не является правильным XML (например, XHTML). Используйте с осторожностью - это сильный запах кода!

Лучшим способом было бы иметь HTML как настоящий XHTML в своем собственном пространстве имен в файле XML вместо использования буквальных текстовых блоков CDATA, чтобы вы могли просто заставить XSLT-процессор копировать узлы вместо использования disable-output-escaping «взлома».

person Lucero    schedule 17.03.2013
comment
благодаря. это похоже на рендеринг и / или сохранение HTML. у меня нет контроля над источником. HTML мог содержать недопустимое форматирование. распространенная проблема заключается в том, что не закрываются теги ‹p› или не используются ‹br› (вместо ‹/br›. или, возможно, я вас неправильно понимаю. - person Gabe Rainbow; 18.03.2013
comment
@ user1869322, ваша цель - другой XML или просто HTML? Знаете ли вы, что CDATA - это просто другая кодировка строки, но представляемое значение такое же, как при кодировании отдельных объектов? - person Lucero; 18.03.2013
comment
моя цель (xsltproc) - другой XML. да. в противном случае это был бы типичный вопрос отключения-вывода-экранирования и методов, найденных в других ответах. thnx. - person Gabe Rainbow; 20.03.2013
comment
@ user1869322, в таком случае зачем вообще возиться с CDATA? Вы можете указать процессору XSLT, содержимое какого элемента должно быть отображено (например, с помощью <xsl:output cdata-section-elements="Description">) как CDATA. В своем шаблоне просто сделайте <xslt:value-of ...> и не пытайтесь вручную вставить начало или конец CDATA. - person Lucero; 20.03.2013
comment
Я ищу, что cdata-section-elements. тем не менее, в конечном итоге это будет HTML. весь процесс - CSV - ›XML (временный перевод с использованием заголовков CSV) -› XML (хорошо) - ›HTML. и HTML не может быть преобразован из временного XML, потому что хороший XML поддерживается в репозитории и постоянно обновляется. - person Gabe Rainbow; 20.03.2013
comment
cdata-section-elements, похоже, не отличается от типичного значения или копии. вы можете ссылаться на функциональность xslt-2, которая, кажется, добавляет сам CDATA. Я продолжу рубить. спасибо за время. - person Gabe Rainbow; 20.03.2013