Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7841536
  • 博文数量: 92
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 5216
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-15 17:17
文章分类

全部博文(92)

文章存档

2011年(1)

2008年(91)

我的朋友

分类: Python/Ruby

2008-03-27 15:05:54

模板属性语言(TAL)标准是一种属性语言,用于创建动态模板。它可以实现文档元素的替换、重复或忽略。

TAL中的语句是XML属性。这些属性可以在XMl或HTML中使用,从而实现页面模板的功能。

TAL语句由属性和数值组成。例如,content语句可以这样:

tal:content="string:Hello"

大多数的语句需要表达式,但表达式句法并不属于TAL,而是属于TALES。

TAL名称空间URI定义为:

xmlns:tal=""

当在Zope中创建模板时,不需要用内容类型text/html声明XML名称空间,对于其它内容类型时才需要声明。

TAL语句包括:

  • tal:attributes - 动态更改元素属性。
  • tal:define - 定义变量。
  • tal:condition - 测试条件。
  • tal:content - 替换元素中的内容。
  • tal:omit-tag - 忽略一个元素,保留元素内容。
  • tal:on-error - 处理错误。
  • tal:repeat - 重复一个元素。
  • tal:replace - 替换元素的内容,删除元素,保留内容。

语句中的表达式可以返回任何类型的数值,大多数语句只使用字符型数据。表达式语言必须定义一个名为nothing的数值,它不是字符串。这个数值适用于删除元素或属性。

如果每个元素中只有一个TAL语句,执行的顺序很简单。从根元素开始,顺序执行每个元素语句。

在同一元素中可以结合多个语句。但content和replace不能一起使用。

由于TAL把语句看作是XML属性,即使在HTML文档中,不能按照编写的顺序来决定执行的顺序。因此需要对执行的顺序进行规定。

当一个元素中含有多个语句时,按照以下顺序执行:

  1. define
  2. condition
  3. repeat
  4. content or replace
  5. attributes
  6. omit-tag

由于on-error语句只有发生错误时才用到,因此没有在此列出来。

按照这样的顺序执行,原因是:由于其它语句会用到变量,因此define先执行。接下来需要判断是否需要使用当前的元素,因此接下来是 condition;另外condition依赖于刚才定义的变量,所以define后边是condition。由于通过循环的方式用不同值替换某些元素 更具有价值,因此接下来是repeat。由于替换属性没有更多的意义,因此放在后边。

TALES 概述

METAL 概述

tal:attributes

tal:define

tal:condition

tal:content

tal:omit-tag

tal:on-error

tal:repeat

tal:replace

tal:attributes 句法:

argument             ::= attribute_statement [';' attribute_statement]*
attribute_statement ::= attribute_name expression
attribute_name ::= [namespace-prefix ':'] Name
namespace-prefix ::= Name
  • 注意:如果你想在表达式中包含分号(;),必须通过使用两个符号(;;)来使用。

tal:attributes语句用一个动态数值替换(或创建一个属性)属性值。如果你通过多个名称空间生成XML文档,需要在属性中加上名称空间前缀,比如 html:table。如果需要 的话,每个表达式的值会转换成字符串。

如果表达式结果为nothing,那么就从语句元素中删除。如果表达式结果为默认值,则属性保持不变。每个属性是独立的,因此可以在同一语句中处理多个属性。

如果在一个元素中使用了tal:attributes语句,还使用了tal:replace,则tal:attributes将忽略。

如果同时使用了tal:attributes和tal:repeat语句,每次循环都进行属性替换。

替换一个链接:

   tal:attributes="href here/sub/absolute_url">

替换两个属性:

';
				tpl +=	 '
'; tpl += '
'; tpl += '
'; tpl += ''; tpl += '
'; tpl += '
'; tpl += '
'; $('.z_move_comment').html(''); $(this).parents('.Blog_right1_8').find('.z_move_comment').html(tpl).show(); }); //引用的评论提交 $('#quota_sbumit').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var bid = $(this).attr('bid'); var tid = $(this).attr('tid');//被引用人的id var qid = $(this).attr('cid');//引用的id var url = $(this).attr('url'); var text = $('#rmsg').val(); var tname = $(this).attr('tname'); if(text == '' || text=='文明上网,理性发言...') { showErrorMsg('评论内容不能为空!' , '消息提示'); return false; } else { if(mb_strlen(text) > 1000){ showErrorMsg('评论内容不能超过500个汉字' , '消息提示'); return false; } } $.ajax({ type: "post", url: url , data: {'bid': bid , 'to' : tid , 'qid' : qid , 'text': text , 'tname' : tname }, dataType: 'json', success: function(data){ if(data.code == 1){ var tpl = '
'; tpl+= ''; tpl+= '
'; tpl+= '

' + data.info.username + '' + data.info.dateline + '

'; tpl+= '

' + data.info.quota.username + ':'+ data.info.quota.content + '

'; tpl+= '

' + data.info.content + '

回复 |  删除 |  举报
'; tpl+= ''; tpl+= '
'; $('#replyList .Blog_right1_8:first').before(tpl); $('.z_move_comment').html('').hide(); } else if(data.code == -1){ //showErrorMsg(data.info , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); } }, error: function(){//请求出错处理 } }); }); //底部发表评论 $('#submitmsg').click(function(){ if(allowComment == 1) { showErrorMsg('该博文不允许评论' , '消息提示'); return false; } var bid = $(this).attr('bid'); var toid = $(this).attr('toid'); var text = $('#reply').val(); var url = $(this).attr('url'); if(text == '' || text=='文明上网,理性发言...') { showErrorMsg('评论内容不能为空!' , '消息提示'); return false; } else { if(mb_strlen(text) > 1000){ showErrorMsg('评论内容不能超过500个汉字' , '消息提示'); return false; } } $.ajax({ type: "post", url: url , data: {'bid': bid , 'to' : toid ,'text': text}, dataType: 'json', success: function(data){ if(data.code == 1) { var tpl = '
'; tpl += ''; tpl += '
'; tpl += '

' + data.info.username + '' + data.info.dateline + '

'; tpl += '

' + data.info.content + '

'; tpl += '
回复 |  删除 |  举报
'; tpl += ''; tpl += '
'; $('.Blog_tit3:first').after(tpl); $('#reply').val('文明上网,理性发言...'); } else if(data.code == -1) { showErrorMsg(data.info , '消息提示'); } }, error: function(){//请求出错处理 } }); }); //底部评论重置 $('#reset_comment').click(function(){ $('#reply').val('文明上网,理性发言...'); }); //取消回复 $('#qx_comment').live('click' , function(){ $('.z_move_comment').html('').hide(); }); $('#rmsg, #reply').live({ focus:function(){ if($(this).val() == '文明上网,理性发言...'){ $(this).val(''); } }, blur:function(){ if($(this).val() == ''){ $(this).val('文明上网,理性发言...'); } } }); //删除留言确认 $('.comment_del_mark').live('click' , function(){ var url = $(this).attr('url'); asyncbox.confirm('删除留言','确认', function(action){ if(action == 'ok') { location.href = url; } }); }); //删除时间确认 $('.del_article_id').click(function(){ var delurl = $(this).attr('delurl'); asyncbox.confirm('删除文章','确认', function(action){ if(action == 'ok') { location.href = delurl; } }); }); /* //字数限制 $('#rmsg, #reply').live('keyup', function(){ var id = $(this).attr('id'); var left = Util.calWbText($(this).val(), 500); var eid = '#errmsg'; if(id == 'reply') eid = '#rerrmsg'; if (left >= 0) $(eid).html('您还可以输入' + left + '字'); else $(eid).html('您已超出' + Math.abs(left) + ''); }); */ //加载表情 $('#face').qqFace({id : 'facebox1', assign : 'reply', path : '/image/qqface/'}); $('#mface').qqFace({id : 'facebox', assign : 'rmsg', path:'/image/qqface/'}); /* $('#class_one_id').change(function(){ alert(123213); var id = parseInt($(this).val() , 10); if(id == 0) return false; $('.hidden_son_class span').each(function( index , dom ){ if( dom.attr('cid') == id ) { } }); }); */ //转载文章 var turn_url = "/blog/viewClassPart.html"; $('#repost_bar').click(function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var id = $(this).attr('bid'); asyncbox.open({ id : 'turn_class_thickbox', url : turn_url, title : '转载文章', width : 330, height : 131, scroll : 'no', data : { 'id' : id }, callback : function(action){ if(action == 'close'){ $.cover(false); } } }); }); /* //转发文章 $('#repost_bar').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var bid = $(this).attr('bid'); var url = $(this).attr('url'); asyncbox.confirm('转载文章','确认', function(action){ if(action == 'ok'){ $.ajax({ type:"POST", url:url, data: { 'bid' : bid }, dataType: 'json', success:function(msg){ if(msg.error == 0){ showSucceedMsg('转发成功!', '消息提示'); }else if(msg.error == 1){ //location.href = '/index.php?r=site/login'; showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); }else{ showErrorMsg(msg.error_content, '消息提示'); } } }); } }); }); */ });