html - XSLT 作为从 ant 运行的多个文件上的简单 HTML 模板引擎

标签 html templates xslt ant

我正在寻找 dreamweaver templates 的替代品在我搬到 Aptana 后在我的网站上。我查看了各种模板引擎,但发现内容 block 通常必须在要注入(inject)模板的字符串变量中定义,或者在具有专有标签的文件中定义。我不喜欢 quotes/heredoc 中的大块 HTML 代码,因为它们相当丑陋(混合了表示标记和应用模板的代码),并且没有语法突出显示或自动完成。我不喜欢专有标签,因为编辑也不会理解它们。

因为我的需求只是一个简单的静态 HTML 模板,所以我认为 XLST 可以解决问题。我的计划是使用 XSLT 将内容文件与模板合并,从 ant 作为 automatic project builder 运行每当我保存文件时。

我从这个模板开始 - template.html:

<!DOCTYPE HTML>
<html data-template="template">
    <head>
        <style>
            .column{ width: 25%; background: lightgrey }
            #left { float: left; }
            #header { background: lightblue }
            #footer { background: lightblue; clear: both }
        </style>
        <title id="title" data-template="block">Default title</title>
    </head>
    <body>
        <div id="header">
            header content
            <div id="search" data-template="block"> default search.. </div>
        </div>
        <div id="left" class="column">
            <div id="leftcontent" data-template="block"> Default left column content </div>
            <div id="advert"> advert... </div>
        </div>
        <div id="main" data-template="block"> Default main content </div>
        <div id="footer"> footer content </div>
    </body>
</html>

其中“data-template='block'”表示可以在页面中覆盖其内容的 block 。样式、页眉、广告和页脚无法更改。

然后我定义了一个内容页面,其 ID 匹配要替换的 block - index.content.html:

<!DOCTYPE HTML>
<html>
    <head>
        <title id="title">index title</title>
    </head>
    <body>
        <div id="leftcontent">Left column content for index here...</div>
        <div id="main"><b>Main content for index here...</b></div>
    </body>
</html>

我喜欢这样一个事实,即我的模板和内容都是纯 HTML,因此我可以获得语法高亮显示、自动完成功能,而且我可以在浏览器中查看它们。

然后我有这个简单的 XSLT,它遍历模板文件,并替换内容文件中定义的任何 block - apply-template.xslt:

<?xml version="1.0" ?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" doctype-system="about:legacy-compat" indent="yes"/>
    <xsl:param name="contentFile"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:copy-of select="@*[name()!='data-template']"/>
            <xsl:choose>
                <xsl:when test="current()/@data-template='block' and document($contentFile)//*[@id=current()/@id]">
                    <xsl:apply-templates select="document($contentFile)//*[@id=current()/@id]/node()" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates select="node()" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:copy>
    </xsl:template>
</xsl:transform>

然后我从这个 ant 文件运行它:

<project name="commutefrom" default="apply-templates" basedir=".">
  <target name="apply-templates">
      <xslt in="template.html" out="output/index.html" extension=".html" style="apply-template.xslt">
         <param name="contentFile" expression="input/index.content.html"/>
       </xslt>
  </target>
</project>

产生此输出(重新格式化)- index.html:

<!DOCTYPE html SYSTEM "about:legacy-compat">
<html>
    <head>
        <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <style>
            .column{ width: 25%; background: lightgrey }
            #left { float: left; }
            #header { background: lightblue }
            #footer { background: lightblue; clear: both }
        </style>
        <title id="title">index title</title>
    </head>
    <body>
        <div id="header">
            header content
            <div id="search">default search..</div>
        </div>
        <div id="left" class="column">
            <div id="leftcontent"> Left column content for index here... </div>
            <div id="advert"> advert... </div>
        </div>
        <div id="main"> <b>Main content for index here...</b> </div>
        <div id="footer"> footer content </div>
    </body>
</html>

太棒了!

现在我的问题是我的网站当然有多个页面。所以我想把这个过程应用到所有的人身上。对于每个内容文件,输入始终是 template.html,contentFile 参数将是内容文件。虽然 ant XSLT 任务允许运行多个文件(使用 basedir),但这将使每个文件成为输入。

那么,如何为每个内容文件运行 XSLT,但输入始终是 template.html,参数是内容文件?

谢谢

最佳答案

我不是 ant 专家,但我认为它有能力处理文件夹中的所有文件。 我建议您使用 xslt 而不是 html 编写模板 - 您将拥有更多的功能和灵 active 。您将使用任何支持 xml/xslt 的编辑器获得语法突出显示和自动完成功能。

关于html - XSLT 作为从 ant 运行的多个文件上的简单 HTML 模板引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22392747/

相关文章:

html - Bootstrap的下拉菜单点击两次后消失

c++ - 我可以在前向声明中默认模板参数吗

C++ 模板和影子参数

xslt - 如何在 XPath 中创建引用其他节点的嵌套条件

html - XSL-FO 生成的 PDF 中的图像宽度

Javascript、Chrome 无法识别函数外部的变量

php - 使用 PHP DOM 解析 HTML - 类包含文本

css - 是否需要将导航(ul 标签)包装在 div 或 nav 标签中?

c++ - tuple_size 和元组的继承类?

java - XML 差异与合并