Как скопировать внешний 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()"/>