加载的就是对应名称为 format 的模块数据:
[%TITLE%]
&%format%&
这里我把这个模板节点定义成 加载控制全局的html源了,再看这个标签topdata:
{%TOP_MESS%}<%=show_top_meun()%>
如果这个节点被加载,生成的文件里面会将topdata节点替换成如上的html文档模板,这就是模块
这里的模块也可以是xml文档,重复加载模块,也可以是终数据.
当这些还有模块节点的xml模板被加载以后,就被程序识别,对应的加载成html二级模块,然后提出我们的"仿xml 数据"标记中的数据,正则替换对应的节点,生成文件,这里的"仿xml数据"是这种方式的数据:
{%TITLE%}<%=cjjer_hometitle%>{%/TITLE%}
{%STYLE%}default{%/STYLE%}
{%site_top%}<%=get_cache(0)%>{%/site_top%}
{%format_two%}
{%/format_two%}
{%site_footer%}<%Call cc_footer()%>{%/site_footer%}
这里,您可能马上理解了我说的"仿xml数据"了,这种加载数据的方式也是xml分析节点,然后直接正则替换,当然可以include文件的(asp,php).
好了,现在您想必概念已经很清楚了,(不清楚的话重新看上面的话,或看如下的例子)
我就举个举个简单的例子说明一下(format_index.xml):
{%site_top%}
{%home_bigflash%}
{%format_two%}
{%site_footer%}
模块:
//format,就是最上面的那个,不列举了
//home_bigflash
//format_two
(&format_two&)
//site_footer
差不多应该加载的模板和模块就这点吧(都是可以重用的.)
现在是程序处理:
<%
'根据输入判断输出是名称还是数据
Function geturlxml(outfile,mode)
geturlxml=False
If outfile="" Then Exit Function
Dim tab
Select Case killint(mode,0,0,2)
Case 0:tab="szd_tpl"
Case 1:tab="szd_content"
End Select
Set rs=conn.execute("select ["&tab&"] FROM szd_asp where [szd_link]='"&outfile&"'")
If rs.eof And rs.bof Then
Exit Function
else
geturlxml=rs(tab)
End If
End Function
'提取include文件到原始的数据项中
Function getincludefile(x)
Dim regxml,html
html=""
Set regxml=new regexp
regxml.ignorecase=True
regxml.global=True
regxml.pattern="()"
Dim Matches,Match
Set Matches = regxml.Execute(x)
For Each Match in Matches
html=html&match.value
Next
getincludefile=html
End Function
'获取模板项,先判断输出,返回值是 html 形式的模板,参数是模板的名称
Function gettpl(url)
Dim mudule_file,xml_file,asp_file
xml_file=url
asp_file=gettpldata(xml_file,0)'由模板名称获取模板的内容
Dim loadxml,parsexml,nodes,node
Set loadxml = Server.CreateObject("MSxml2.DOMDocument")
loadxml.async=false
parsexml=server.mappath("../"&gettpldata(xml_file,10)&xml_file)'装载本地的xml文档,先到数据库取到路径
loadxml.load parsexml
Set nodes = loadxml.selectNodes("//*")
for each node in nodes
asp_file=insertaspinhtml(asp_file,gettpldata(node.nodename,1),node.nodename)'加载模块到模板,输出html模板
Next
gettpl=asp_file
End function
'匹配模板中的数据项
'把data中的数据传入html文件当中去
Function tpltodata(html,data)
Dim regxml
Set regxml=new regexp
regxml.ignorecase=True
regxml.global=True
regxml.pattern="({%)([a-zA-Z][A-Za-z0-9_]{2,60})(%})(.[^\[]*)({%/)\2(%})"
Dim Matches,Match
Set Matches = regxml.Execute(data)
For Each Match in Matches
html=Replace(html,"{%"®xml.Replace(match.value,"2")&"%}",regxml.Replace(match.value,"4"))
Next
tpltodata=html
End Function
'geturlxml 传入参数模板名称,返回模板的内容,失败的时候返回 null
Function geturlxml(outfile)
geturlxml=Null
If outfile="" Then Exit Function
Set rs=conn.execute("select [szd_tpl] FROM szd_asp where [szd_link]='"&outfile&"'")
If rs.eof And rs.bof Then
Exit Function
else
geturlxml=rs("szd_tpl")
End If
End Function
public Function gettpldata(url,mode)
'Set rs=server.CreateObject("server.adodbrecordset")
If Len(url)<1 Then Exit Function
Dim szd_keytpl
Select Case mode
Case 0:Set rs=conn.execute("select [szd_content] from szd_tpl where [szd_link]='"&url&"'")
Case 10:Set rs=conn.execute("select [szd_url] from szd_tpl where [szd_link]='"&url&"'")
Case 1:Set rs=conn.execute("select [szd_content] from szd_keytpl where [szd_key]='"&url&"'")
End Select
If Not(rs.eof And rs.bof) Then
szd_keytpl=rs(0)
Else
szd_keytpl="
{%nodefined%}
"
End If
gettpldata=szd_keytpl
End Function
'加载标记的模块到 xml 格式的模板中,输出html格式的模板,asp:xml格式模板,html:导入的模块,xmls:当前标记
Function insertaspinhtml(asp,html,xmls)
Dim regxml,temp,temps,tempasp,tempasp_e
Set regxml=new regexp
regxml.ignorecase=True
regxml.global=True
regxml.pattern="(\<"&xmls&"\>)(.[^\[]*)(\<\/"&xmls&"\>)"
temp=regxml.Replace(asp,"2")
Dim Matches,Match
Set Matches = regxml.Execute(asp)
For Each Match in Matches
html=Replace(html,"(&"&xmls&"&)",regxml.Replace(match.value,"2"))
asp=Replace(asp,Match.Value,html)
next
temps=Replace(html,"(&"&xmls&"&)",temp)
insertaspinhtml=asp
End Function
Function update_aspfile(id)
Dim update_aspfile_return
update_aspfile_return=False
id=killint(id,0,0,14)
If id=0 Then Exit Function
Set rs=conn.execute("select [szd_level],[szd_content],[szd_tpl],[szd_link] from szd_asp where id="&id&"")
If rs.eof And rs.bof Then Exit Function
Dim tpl_level,tpl_content,tpl_tpl,html_content,asp_file_now
tpl_level=rs(0)
tpl_content=rs(1)
tpl_tpl=rs(2)
asp_file_now=rs(3)
If Len(tpl_tpl)<4 Or tpl_level=1 Or IsNull(tpl_tpl) Then
html_content=tpl_content
Else
html_content=gettpl(tpl_tpl)
If Not isnull(html_content) Then
html_content=getincludefile(tpl_content)&tpltodata(html_content,tpl_content)
'response.write("
"&server.htmlencode(getincludefile(tpl_content))&"
")
Else
html_content=tpl_content
'response.write("
"&server.htmlencode(html_content)&"
")
End If
End If
If writeto("../",asp_file_now,html_content,2) Then update_aspfile_return=True
update_aspfile=update_aspfile_return
End Function
%>
生成文件:
运行代码框
<%=cjjer_hometitle%>
这里,我的模块用了div,是利于样式表的使用.
主要思路如图:
其他的就不再说了,不知道说明白了.
作者:5do8 来源:蓝色理想