"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 获得的代码的正确类型的模块化和可重用性=]