使用xslt导入html文件的部分



假设我有三个文件,我想一个接一个地包含/导入它们的内容,并构造一个html文件。

header.html

<header>
Hello, this is a header of the web page.
</header>

main.html

<main>
Hello, this is a main part of the web page.
</main>

footer.html

<footer>
Hello, this is a footer part of the web page.
</footer>

预期输出:

<header>
Hello, this is a header of the web page.
</header>
<main>
Hello, this is a main part of the web page.
</main>
<footer>
Hello, this is a footer part of the web page.
</footer>

是否可以使用xslt以简单易读的方式实现这一点
我见过很多xml合并示例,但它们从来都不满意,而且看起来过于复杂
我只想将html/xml文件合并到一个文件中。

您没有提到您正在运行的XSLT版本,所以我假设只有1.0版本。

它可以像一样简单

<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<head>
<title>importing parts of html file using xslt</title>
</head>
<body>
<xsl:copy-of select="document('header.html')"/>
<xsl:copy-of select="document('main.html')"/>
<xsl:copy-of select="document('footer.html')"/>
</body>
</html>

请注意,样式表对其输入文档不做任何操作;它所做的只是将这三个命名文件显式地包含在一个模板中。但是,您必须将此样式表应用于某些输入文档,并且由于哪一个并不重要,因此您可以将样式表应用到其自身。

NB这使用";简化样式表";语法,其中样式表是一个文本结果元素(在本例中为html(,该元素被视为与/匹配的xsl:template的子元素。

如果我使用最新的XSLT解释器(即XSLT3.0版(来完成这项工作,我可能会使用一个名为xsl:initial-template的模板来编写样式表。这意味着您根本不需要提供输入文档。

例如

<xsl:stylesheet xsl:version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="xsl:initial-template">
<html>
<head>
<title>importing parts of html file using xslt</title>
</head>
<body>
<xsl:copy-of select="document('header.html')"/>
<xsl:copy-of select="document('main.html')"/>
<xsl:copy-of select="document('footer.html')"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

您将无法使用XML工具链解析/处理正确的HTML,因为HTML不是XML,而是使用SGML(即XML所基于的原始标记语言(中未包含在XML子集中的功能,如标记推理和其他缩写。我写了一个教程,使用sgmljs.net上的SGML几乎完全可以实现您想要的目标——不过,生成HTML。

也就是说,XML确实有实体,因此通过实体包含文本片段以生成XHTML(即HTML标记的符合XML的序列化(的基本技术可以与任何进行DTD处理的XML解析器一起使用,所有众所周知的成熟解析器都是这样做的:

<!DOCTYPE html [
<!ENTITY header SYSTEM "header.html">
<!ENTITY main SYSTEM "main.html">
<!ENTITY footer SYSTEM "main.html">
]]>
<html>
&header;
&main;
&footer;
</html>

其中&header;&main;&footer;header.htmlmain.htmlfooter.html文件的相应内容代替,而不需要XSLT或其他编程语言。

要使用headermainfooter的展开文本呈现文档(此处命名为doc.xhtml(,可以使用例如xmllint(libxml2的一部分(:

xmllint -noent doc.xhtml

不过,请注意,以这种方式生成的文档通常不被接受为HTML,甚至不是XHTML专有的,因为它缺少headbodytitle元素(@Conal Tuohy也观察到了这一点(,所以最小的专有XHTML文档看起来是这样的:

<!DOCTYPE html [
<!ENTITY header SYSTEM "header.html">
<!ENTITY main SYSTEM "main.html">
<!ENTITY footer SYSTEM "footer.html">
]]>
<html>
<head>
<title>Importing parts of XHTML using entities</title>
</head>
<body>
&header;
&main;
&footer;
</body>
</html>

最新更新