我正在寻找我网站上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,参数是内容文件?
由于
答案 0 :(得分:-1)
我不是蚂蚁专家,但我认为它能够处理文件夹中的所有文件。 我建议你用xslt而不是html来创作你的模板 - 你将拥有更多的力量和灵活性。您将使用任何xml / xslt感知编辑器获得语法突出显示和自动完成。