Posted on 2005-11-22 23:09
canonical 閱讀(1023)
評論(0) 編輯 收藏 所屬分類:
Witrix開發平臺
witrix平臺中的tpl模板技術的重點在于標簽定義的設計, 在于如何最大限度的發揮xml格式的表達能力。
tpl自定義標簽的基本結構如下:
<Namespace:TagName tpl:tag="realTagName"
tpl:noborder="${booleanExprInCompileContext}"
tpl:ignore="${booleanExprInCompileContext}"
attrName="stringOrExpression" cp:attributeInCompileContext="atringOrExpression"
OtherNamespace:OtherAttrName="stringOrExpression"
>
bodyContent
</NameSpace:TagName>
自定義標簽總是處在某一名字空間中, tpl名字空間中的屬性由tpl編譯器負責進行解析并處理,
而cp名字空間中的屬性在編譯期能夠訪問,其他名字空間的屬性被完全忽略,
一般只有decorator會識別這些屬性(例如cache:timeout).所有無名字空間的屬性都相當于是自定義標簽的調用參數,在標簽運行的時候
可以在標簽內部訪問到。
tpl通過對namespace的使用, 避免了系統屬性, decorator屬性與普通標簽屬性之間的相互干擾, 這與JSF和Tapestry都是不同的。
tpl:tag屬性指定此標簽在編譯時對應的真實標簽名,
即編譯期會識別RealTagName而不是Namespace:TagName。tpl:noborder為true的時候相當于是直接編譯
bodyContent, 例如用來在編譯期控制是否在界面上使用某種邊框。
tpl:ignore為true的時候,此標簽將被忽略而不會被編譯。
bodyContent在編譯期成為tagBody變量, 由自定義標簽自己決定如何處理,
這種方式比FreeMarker的<#nested>機制要靈活和強大的多. 例如在標簽內部我們可以使用<cp:compile
src="${tagBody}" /> 這等價于 FreeMarker的<#nested>. 也可以使用
<cp:compile
src="${tagBody.existingChild('header')}" />從bodyContent中取出header子節點.
甚至我們可以對tagBody進行加工之后再進行編譯.