Как скопировать внешний CSS и JavaScript в XSLT
У меня есть преобразование XSL, которое выводит HTML. В элементе head
у меня есть ссылка на файл CSS.
<link rel="stylesheet" type="text/css" href="css/styles.css"/>
Я хотел бы создать автономный HTML-результат без внешних ссылок, и поэтому хотел бы включить внешние ссылки CSS. Чтобы предотвратить дублирование кода, я не хочу жестко кодировать стили в шаблон XSLT, поэтому я ищу некоторую команду XSLT для копирования содержимого файла CSS. Я знаю, что xsl:include
или xsl:import
не будет работать, поскольку они ожидают файлы XSLT. Также
<xsl:copy-of select="document('css/styles.css')"/>
поскольку он ожидает чего-то совместимого с XML.
У меня также есть некоторые объявления функций JavaScript, которые я хотел бы также скопировать.
Возможно ли это с чистым XSLT, или мне нужно выполнить некоторую предварительную обработку файла XSLT (или пост-обработку HTML файла)?
Ответы
Ответ 1
XSLT 2.0 предоставляет функцию unparsed-text() для чтения документов по URL, которые не являются XML.
В XSLT 1.0, если вам не нужно слишком script о CSS, вы можете использовать следующее, чтобы сделать файл CSS совместимым с XML. И, к счастью, браузеры допускают комментарии HTML.
CSS
<!--/*--><root><![CDATA[<!--*/-->
body
{
margin: 0;
}
div > p
{
background-color: yellow;
}
<!--/*-->]]></root><!--*/-->
XSLT
<style type="text/css">
<xsl:value-of select="document('test.css')" disable-output-escaping="yes" />
</style>
Ответ 2
Возможно, вы могли бы обмануть его, думая, что таблица стилей - это XML.
styles.css
/*
<?xml version="1.0" encoding="utf-8"?>
<style>
<![CDATA[
*/
... styles ...
/*
]]>
</style>
*/
Это взломать, но если нет другого пути, это может быть достаточно (если он работает вообще).
Ответ 3
Используйте инструкцию для обработки содержимого CSS:
<?xml version="1.0" encoding="utf-8"?>
<root>
<?wrapper html
<html>
<link rel="stylesheet" type="text/css" href="css/styles.css"/>
</html>
?>
</root>
Затем настройте существующий оператор xsl:copy-of
select для его отображения:
<xsl:copy-of select="document('css/styles.css')//processing-instruction()"/>