当CSP
编译器处理CSP
文档时,它首先查找与规则匹配相关的所有标记。
当编译器扫描文档时,它会创建一个与CSP
文档中包含的标记结构匹配的对象树。
这个树被称为服务器端文档对象模型,它直接类似于显示HTML页面时浏览器中可用的文档对象模型。
服务器端文档对象模型由类%CSP.AbstractAtom
的子类的实例组成,表示一个HTML
文档的单元。一个HTML
文档由两种类型的ATOM
对象组成:Rule
和TextAtom
,每种对象都由它们各自的类表示:%CSP.Rule
,%CSP.TextAtom
。元素由%CSP.Rule
的子类的实例表示,它表示一个HTML
标记、其属性值的集合、其内部的HTML
以及它可能包含的任何内部标记的集合。TextAtom
表示不是元素的任何内容。为了提高效率,CSP
编译器只为规则匹配中涉及的标记创建Element
对象;其余的(例如,和
标记)包含在
TextAtom
对象中。
例如,假设
标签有一个规则,下面的CSP
文档:
<html>
<body>
Hello!
<MYTAG MSG="Welcome">
body>
html>
构造以下服务器端文档对象:
TagName
的HTML
元素,包含子元素:
body
的TagName
元素包含子元素:
Hello!
文本的TextAtom
。MYTAG
标记名和Welcome
属性(MSG
)的元素。服务器端文档对象模型只在页面编译期间创建;
它在运行时不存在(同样是为了提高效率)。
这就是为什么操作可能包含在编译时执行的表达式和代码的主要原因:以利用服务器端文档对象模型。
在CSP
编译器构建了文档对象模型之后,它通过访问树中的对象(深度优先)并触发与每个 %CSP.Rul
相关联的规则来处理文档。并将结果呈现为可执行代码。根据定义,%CSP.TextAtom
对象没有规则,因此它们直接呈现在可执行代码中。
执行规则时,对%CSP
的引用。与之关联的规则对象可通过当前对象使用。
例如,假设想要定义一个自定义
标记,该标记使用粗体斜体文本显示由VALUE
属性指定的消息:
<MESSAGE VALUE="Yo!">
对此的规则定义可能如下所示:
<csr:rule name="MESSAGE" match="MESSAGE" empty>
<csr:action>
<B><I>##(..GetAttribute("VALUE"))##I>B>
csr:action>
csr:rule>
每当遇到
标记时,就会触发消息规则(即调用RenderStartTag
)。
< B >
和< I >
标签。< B >
和< I >
标记。