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

时间:2014-03-13 22:55:28

标签: html templates xslt ant

我正在寻找我网站上dreamweaver templates的替代品,因为我已经搬到了Aptana。我查看了各种模板引擎,但发现内容块通常必须在字符串变量中定义,以便注入模板或具有专有标记的文件中。我不喜欢引号/ 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>

其中&#34; data-template =&#39; block&#39;&#34;表示可以在页面中覆盖内容的块。样式,标题,广告和页脚无法更改。

然后,我定义了一个内容页面,其id与要替换的块匹配 - 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,它通过模板文件,并替换内容文件中定义的任何块 - 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,参数是内容文件?

由于

1 个答案:

答案 0 :(得分:-1)

我不是蚂蚁专家,但我认为它能够处理文件夹中的所有文件。 我建议你用xslt而不是html来创作你的模板 - 你将拥有更多的力量和灵活性。您将使用任何xml / xslt感知编辑器获得语法突出显示和自动完成。