我准备自动生成大约2.500行的XHTML,并使用XSLT将XML/XSL转换为输出XHTML文件。由于长度(以及得到更好的概述),我希望模块化的XSL。
根据XSL2.0Spec:https://www.w3.org/TR/xslt20/#include,include必须是一个顶级元素,这意味着我不能在另一个模板中添加包含标记。
澄清我的问题:
在这种特殊情况下,是否可以使用"xsl:include“来构建HTML标记结构,其中HTML是父、头和体是childs,等等?
注意!我非常清楚,在执行“包含”场景时,我遗漏了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文件
<?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包括文件头
<?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>希望通过使用包含的结果
<!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>发布于 2021-04-22 07:02:19
您可以使用
<xsl:template match="/data">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>在包含这两个模块的主样式表中。
发布于 2021-04-22 08:53:08
这可能有点不寻常,但您可以使用XInclude将代码插入到样式表中(在将代码提交给XSLT处理程序之前,需要将其通过XInclude处理器)。这是XSLT作为XML的优点之一--您可以在样式表代码中使用整个XML处理设备。
我认为,之所以不经常这样做,是因为它没有鼓励使用xsl:include和xsl:import的代码具有正确的模块化和可重用性。
https://stackoverflow.com/questions/67207192
复制相似问题