假设我有三个文件,我想一个接一个地包含/导入它们的内容,并构造一个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.html
、main.html
和footer.html
文件的相应内容代替,而不需要XSLT或其他编程语言。
要使用header
、main
和footer
的展开文本呈现文档(此处命名为doc.xhtml
(,可以使用例如xmllint
(libxml2的一部分(:
xmllint -noent doc.xhtml
不过,请注意,以这种方式生成的文档通常不被接受为HTML,甚至不是XHTML专有的,因为它缺少head
、body
和title
元素(@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>