如何在XSLT中复制外部CSS和JavaScript

12

我有一个XSL转换,它输出HTML。在head元素中,我有一个CSS文件引用。

<link rel="stylesheet" type="text/css" href="css/styles.css"/>

我想创建一个独立的HTML结果,不包含外部引用链接,因此我想要包含外部CSS引用。为了避免代码重复,我不想硬编码样式到XSLT模板中,因此我正在寻找一些XSLT命令来复制CSS文件的内容。我知道xsl:includexsl:import不能工作,因为它们期望的是XSLT文件。

<xsl:copy-of select="document('css/styles.css')"/>

因为它需要一些XML兼容的东西。

我还有一些JavaScript函数声明,我也想复制它们。

使用纯XSLT是否可能,还是我必须对XSLT文件进行一些预处理(或HTML文件的后处理)?

3个回答

13

XSLT 2.0提供了unparsed-text()函数,可通过URL读取非XML文档。

在XSLT 1.0中,如果您对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>

4
这对我很有用。存在 < > & 字符的问题。最终我得到了<!--/--><root><![CDATA[<!--/--> 和<!--/-->]]></root><!--/--> 对 JavaScript 也适用。 - GrGr

1
使用处理指令来包装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选择语句以进行呈现:

 <xsl:copy-of select="document('css/styles.css')//processing-instruction()"/>

0

也许你可以欺骗它,让它认为样式表是XML。

styles.css

/*
<?xml version="1.0" encoding="utf-8"?>
<style>
<![CDATA[
*/
... styles ...
/*
]]>
</style>
*/

这是一个hack,但如果没有其他方法,它可能足够(假设它能正常工作)。


1
这是行不通的,因为无论如何CCS文本都不是有效的XML文本。例如,“div > p”选择器或所有未转义的字体声明中的双引号。 - Tomalak
不,即使使用CDATA也不行。xsltproc不喜欢注释符号。它会显示以下错误: css/styles.css:1: parser error : Start tag expected, '<' not found /* ^ - GrGr
嗯...我本以为在XML块之前和之后放置文本节点仍然是合法的,毕竟在它们之前和之后的空格是合法的。好吧。 - SpliFF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接