打造基于 XSL 的模板框架

开发
XSL是指可扩展样式表语言 (EXtensible Stylesheet Language),是一种用于以可读格式呈现 XML 数据的语言。本文介绍的是打造基于 XSL 的模板框架,希望对你有帮助。

xsl是一种标记语言,表示如何将xml文档的内容装换成另一种形式的文档。通过为xml写xsl来使得xml显示成不同的格式。 XSL 之于 XML ,就像 CSS 之于 HTML。它是指可扩展样式表语言 (EXtensible Stylesheet Language)。这是一种用于以可读格式呈现 XML 数据的语言。   

上图是本博客的页面布局图,也是最为普通常见的网页布局,具有代表性,这里就是用 XSL 打造这种布局的模板框架。

上图的特点是 Header、Righter、Footer 三个区域是公共区域,几乎所有页面都包含这三个区域。不同页面只在 Main 区域有差异。那么在制作页面时只要编写 Main 区域,其他区域只要包含三个公共区域就算完成页面了。这是正向思维,因为程序里面经常这么干,需要的时候就加载。正向思维只能解决小区域、临时性的加载或调用,无法形成框架。

框架的作用是使页面继承框架,又能重写扩展。既节省时间重用模块,又能体现灵活性。快乐笛子的博客-专注于XML技术与前端开发刚好与上面的分析相反,这里要用到反向思维。编写的页面是框架的一个区域,当前页面是被主框架调用,而不是主动调用其他区域。按照左图所示,先编写框架,包含 Header、Righter、Footer,Main区域的位置留空,调用一个固定名称的 Template,如 Main(类似于C语言的 main 函数)。

主框架文件名为:mainframe.xsl,主要代码如下:

  1. <html> 
  2. <head> 
  3. <title>主框架</title> 
  4. </head> 
  5. <body> 
  6. <div class="box"> 
  7. <div class="header">Header</div> 
  8. <div class="middle"> 
  9. <div class="main"> 
  10. <xsl:call-template name="main" /> 
  11. </div> 
  12. <div class="righter">Righter</div> 
  13. </div> 
  14. <div class="footer">Footer</div> 
  15. </div> 
  16. </body> 
  17. </html> 

再进一步抽象,把 Header、Righter、Footer 以及 title 元素(下面需要用到)保存到另一个公共文件中去:common.xsl: 

  1. <XSL:TEMPLATE name="header">   
  2. Header   
  3. </XSL:TEMPLATE>   
  4. <XSL:TEMPLATE name="righter">   
  5. Righter   
  6. </XSL:TEMPLATE>   
  7. <XSL:TEMPLATE name="footer">   
  8. Footer   
  9. </XSL:TEMPLATE>   
  10. <XSL:TEMPLATE name="pagetitle">   
  11. 主框架的标题   
  12. </XSL:TEMPLATE>   

mainframe.xsl 修改为: 

  1. <xsl:import href="common.xsl" /> 
  2. ...  
  3. <html> 
  4. <head> 
  5. <title><xsl:call-template name="pagetitle" /></title> 
  6. </head> 
  7. <body> 
  8. <div class="box"> 
  9. <div class="header"> 
  10. <xsl:call-template name="header" /> 
  11. </div> 
  12. <div class="middle"> 
  13. <div class="main"> 
  14. <xsl:call-template name="main" /> 
  15. </div> 
  16. <div class="righter"> 
  17. <xsl:call-template name="righter" /> 
  18. </div> 
  19. </div> 
  20. <div class="footer"><xsl:call-template name="footer" /></div> 
  21. </div> 

mainframe.xsl 只承担了整体排版,定义全局CSS、Javascript 的功能,与任何子区域都无关。其中 Main 区域调用了一个名为 main 的模板。在 mainframe.xsl 与 common.xsl 文档中都没有定义 main 模板,该模板存在于每个页面中,比如列表页的XSL主要代码如下(文件名为list.xsl):

  1. <XSL:STYLESHEET xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">   
  2. <XSL:IMPORT href="mainframe.xsl" />   
  3. <XSL:OUTPUT doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" encoding="utf-8" method="html" />   
  4. <XSL:TEMPLATE name="main">   
  5. 此处是 Main 区域,列表页   
  6. </XSL:TEMPLATE>   
  7. </XSL:STYLESHEET>  

上面有两处地方需要注意,***是必须在 xsl:output 元素之前载入主框架(主框架又载入 common.xsl),其次是此页面默认入口是名为 main 的 template,即不能存在自动匹配的模板( match="/" 从根开始匹配的模板)。list.xsl 中的 main 模板是为主框架准备的。同样,详细页也如此编写,这样就实现了框架继承与区域重用。

页面的标题(title元素)是在mainframe中定义的,但每个详细页的标题都不同,列表页也不同,这就需要重写title模板覆盖mainframe中的默认值。
list.xsl 文件如下:

  1. <XSL:STYLESHEET xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">   
  2. <XSL:IMPORT href="mainframe.xsl" />   
  3. <XSL:OUTPUT doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" encoding="utf-8" method="html" />   
  4. <XSL:TEMPLATE name="main">   
  5. 此处是 Main 区域,列表页   
  6. </XSL:TEMPLATE>   
  7. <XSL:TEMPLATE name="pagetitle">   
  8. 列表页的标题   
  9. </XSL:TEMPLATE>   
  10. </XSL:STYLESHEET>  

上面的 pagetitle 模板将会覆盖 common.xsl 中的同名模板。列表页的标题与其他未定义 pagetitle 的页面的标题将不再一致。
注意,必须是使用 xsl:import 元素导进来的模板才可以被覆盖,如果使用 xsl:include ,将产生错误:"不能使用相同导入优先权多次定义命名模板"。

【编辑推荐】

  1. 详谈XML的应用分类及前景
  2. 给XML初学者
  3. VB.NET实现图象文件和XML文件互换
  4. SQL Server 2000中生成XML的小技巧
责任编辑:于铁 来源: 笛子的博客
相关推荐

2009-02-13 10:04:02

AntXSLXML

2016-12-05 09:50:17

2021-05-12 08:54:56

FastAP web 框架数据库操作

2009-12-09 09:57:05

ibmdwJavaPHP

2021-02-18 09:54:37

数据湖框架数据

2023-11-03 08:04:47

Web微前端框架

2022-09-07 21:31:19

微前端架构iframe

2013-11-22 11:03:45

GoogleWeb开发工具

2013-07-25 15:39:12

积分墙盈利模式移动应用

2015-11-03 16:43:01

容器编排容器环境可扩展

2022-07-07 10:41:53

鲲鹏

2013-01-14 15:08:46

SAPHANABusiness Su

2009-06-19 09:52:46

Acegi安全框架Spring框架

2014-10-30 10:28:55

Node.js

2015-09-06 08:57:07

BootstrapCSS框架

2022-06-09 07:27:14

JavaSpring容器

2022-05-30 11:17:44

Spring容器配置

2009-11-12 16:17:13

.NET

2013-07-27 19:52:50

2017-07-06 15:02:53

OpenGL ES架构GPU
点赞
收藏

51CTO技术栈公众号