Отображение строки в двойном кодировании в виде HTML из источника XML с использованием XSL

#html #xslt #encoding #double

#HTML #xslt #кодирование #двойной

Вопрос:

У меня есть источник XML, который содержит содержимое, которое мне нужно отобразить на веб-странице в формате HTML с использованием XSL. Один из узлов XML содержит двойное значение «HTML encoded». Это тот, для которого мне нужно вывести HTML.

Таким образом, исходный ввод HTML был <p><strong>hello world</strong></p> , но затем он сохраняется как дважды кодированный текст HTML.

  • оригинальная версия: <p><strong>hello world</strong></p>
  • первая кодировка HTML: amp;<pamp;>amp;<strongamp;>hello worldamp;</strongamp;>amp;</pamp;>
  • вторая кодировка HTML: amp;amp;<pamp;amp;>amp;amp;<strongamp;amp;>hello worldamp;amp;</strongamp;amp;>amp;amp;</pamp;amp;>

Я получаю только эту вторую кодировку HTML из моего источника XML

 <CONTENT>
   <RECORD>
      <OVERVIEW>amp;amp;<pamp;amp;>amp;amp;<strongamp;amp;>hello worldamp;amp;</strongamp;amp;>amp;amp;</pamp;amp;></OVERVIEW>
   </RECORD>
</CONTENT>
  

Вывод в html в XSL с использованием xsl:output запускает процесс, а отключение вывода в моем теге xsl:value-of позволяет мне преодолеть один уровень кодирования HTML.

Но следующий XSL:

 <xsl:for-each select = "//CONTENT/RECORD">
   <xsl:value-of disable-output-escaping="yes" select = "OVERVIEW" />
</xsl:for-each>
  

Возвращает только:

 amp;<pamp;>amp;<strongamp;>hello worldamp;</strongamp;>amp;</pamp;>
  

Это не возвращает меня к исходному вводу <p><strong>hello world</strong></p>

Итак, я искал способ «удвоить» или «отключить-вывод-экранирование =»да» дважды.

Есть идеи, как я могу сделать это только в XSL?

Ответ №1:

Насколько я понимаю, вы не можете использовать disable-output-escape дважды в XSLT, это параметр сериализации, который не влияет на процесс преобразования. Вы можете аннотировать выходной узел, который не будет экранироваться при сериализации, и все. Если вам нужно удвоить unescape, вам необходимо предварительно обработать входной документ или использовать функцию расширения.

Ответ №2:

Помните, что операция, которая «убирает» содержимое, правильно называется синтаксическим анализом, а операция, которая «экранирует» его, называется сериализацией. Итак, чтобы выполнить два уровня удаления, вызовите parse(parse(X)) . Функции расширения для выполнения операций parse() и serialize() доступны в некоторых процессорах XSLT, таких как Saxon, а в других вы можете написать свои собственные.