"xsl:include" 是否可以用于构建正确的 HTML 文档树,假设 HTML 子节点在 "xsl:include" 文件中
Can "xsl:include" be used to build a correct HTML Document tree, assuming the HTML childs are in "xsl:include" file
我正准备自动生成大约 2500 行 XHTML 并使用 XSLT 将 XML/XSL 转换为输出 XHTML 文件。由于篇幅(也为了获得更好的概述),我希望将 XSL 模块化。
根据 XSL2.0 规范:https://www.w3.org/TR/xslt20/#include,必须包含一个顶级元素,这意味着我不能在另一个模板中添加 include 标签。
澄清我的问题:
在这种特定情况下,是否可以使用“xsl:include”作为共同构建 HTML 标签结构的一部分,其中 HTML 是父项,head 和 body 是子项,等等?
注意!我完全知道在执行“include”场景时我缺少 HTML 标签,
但那是因为我不知道如何添加 HTML 标签来解决 HTML 结构。
我在 XSL 规范、Saxon 文档以及其他渠道中进行了搜索,以查找执行 XSLT 的示例以及“xsl:include”以模块化代码,但没有成功。
XML 文件(用于两个测试场景):
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xml" href="stylesheet.xsl" version="2.0"?>
<data>
<repo-1>
<title>Title-1</title>
<title>Title-2</title>
</repo-1>
<repo-2>
<body>Body content from XML data</body>
</repo-2>
</data>
XSL 文件,当只使用一个没有包含的 XSL
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/data">
<html>
<head>
<title>
<xsl:value-of select = "repo-1/title[2]"/>
</title>
</head>
<body>
<xsl:value-of select = "repo-2/body"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我的 XSL 包含
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Includes -->
<xsl:include href="head.xsl"></xsl:include>
<xsl:include href="body.xsl"></xsl:include>
XSL 包含文件 [head]
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/data/repo-1">
<head>
<title>
<xsl:value-of select = "title"/>
</title>
</head>
</xsl:template>
</xsl:stylesheet>
XSL 包含文件 [正文]
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/data/repo-2">
<body>
<xsl:value-of select = "body"/>
</body>
</xsl:template>
</xsl:stylesheet>
使用一个 XSL 文件的结果:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Title-2</title>
</head>
<body>Body content from XML data</body>
使用结果包括:
<?xml version="1.0" encoding="UTF-8"?>
<head>
<title>Title-1 Title-2</title>
</head>
<body>Body content from XML data</body>
</html>
使用 include
的预期结果
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Title-2</title>
</head>
<body>Body content from XML data</body>
您可以使用
<xsl:template match="/data">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
在包含这两个模块的主样式表中。
这有点不寻常,但您可以使用 XInclude 将代码插入样式表(您需要先通过 XInclude 处理器,然后再将其提交给 XSLT 处理器)。这是 XSLT 的好处之一 XML - 您可以在样式表代码中使用整个 XML 处理设备。
我认为不经常这样做的原因是它不鼓励您使用 xsl:include 和 xsl:import.[=10 获得的代码的正确类型的模块化和可重用性=]
我正准备自动生成大约 2500 行 XHTML 并使用 XSLT 将 XML/XSL 转换为输出 XHTML 文件。由于篇幅(也为了获得更好的概述),我希望将 XSL 模块化。
根据 XSL2.0 规范:https://www.w3.org/TR/xslt20/#include,必须包含一个顶级元素,这意味着我不能在另一个模板中添加 include 标签。
澄清我的问题:
在这种特定情况下,是否可以使用“xsl:include”作为共同构建 HTML 标签结构的一部分,其中 HTML 是父项,head 和 body 是子项,等等?
注意!我完全知道在执行“include”场景时我缺少 HTML 标签, 但那是因为我不知道如何添加 HTML 标签来解决 HTML 结构。
我在 XSL 规范、Saxon 文档以及其他渠道中进行了搜索,以查找执行 XSLT 的示例以及“xsl:include”以模块化代码,但没有成功。
XML 文件(用于两个测试场景):
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xml" href="stylesheet.xsl" version="2.0"?>
<data>
<repo-1>
<title>Title-1</title>
<title>Title-2</title>
</repo-1>
<repo-2>
<body>Body content from XML data</body>
</repo-2>
</data>
XSL 文件,当只使用一个没有包含的 XSL
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/data">
<html>
<head>
<title>
<xsl:value-of select = "repo-1/title[2]"/>
</title>
</head>
<body>
<xsl:value-of select = "repo-2/body"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我的 XSL 包含
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Includes -->
<xsl:include href="head.xsl"></xsl:include>
<xsl:include href="body.xsl"></xsl:include>
XSL 包含文件 [head]
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/data/repo-1">
<head>
<title>
<xsl:value-of select = "title"/>
</title>
</head>
</xsl:template>
</xsl:stylesheet>
XSL 包含文件 [正文]
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/data/repo-2">
<body>
<xsl:value-of select = "body"/>
</body>
</xsl:template>
</xsl:stylesheet>
使用一个 XSL 文件的结果:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Title-2</title>
</head>
<body>Body content from XML data</body>
使用结果包括:
<?xml version="1.0" encoding="UTF-8"?>
<head>
<title>Title-1 Title-2</title>
</head>
<body>Body content from XML data</body>
</html>
使用 include
的预期结果<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Title-2</title>
</head>
<body>Body content from XML data</body>
您可以使用
<xsl:template match="/data">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
在包含这两个模块的主样式表中。
这有点不寻常,但您可以使用 XInclude 将代码插入样式表(您需要先通过 XInclude 处理器,然后再将其提交给 XSLT 处理器)。这是 XSLT 的好处之一 XML - 您可以在样式表代码中使用整个 XML 处理设备。
我认为不经常这样做的原因是它不鼓励您使用 xsl:include 和 xsl:import.[=10 获得的代码的正确类型的模块化和可重用性=]