#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, а в других вы можете написать свои собственные.