第四十六章 开发自定义标签 - 标签匹配 操作中的运行时表达式
指定标签的属性值,方法是将属性值放在方括号内,标签名称后是[ ]
。
<csr:rule>
标记的match
属性定义了CSP
编译器应该将什么识别为规则,然后执行指定的操作。match
属性是由/
(斜杠)字符分隔的一个或多个标记名组成的字符串。如果有一个以上的标记名,则假定它们是嵌套的,从左到右指定,从最外面的标记到最里面的标记。*
(星号)字符是匹配任何标签的通配符。
为了更好地说明这一点,让我们看看下表中的一些匹配值示例。
为匹配的最内层标签触发一个规则。如果相同的标记有多个规则定义,CSP
编译器会通过确定哪个匹配值最具体来确定使用哪个规则。例如,AAA/ BBB
的规则比BBB
的规则更具体。类似地,指定属性值的规则,比如BBB[CCC]
,比不指定属性值的规则BBB
更具体。
标签匹配的示例
匹配值 | 规则被触发: |
---|---|
AAA |
每当遇到<AAA> 标记时:<AAA></AAA> |
AAA/BBB |
每当遇到直接嵌套在<AAA> 标签中的<BBB> 标签时:<AAA> <BBB></BBB> </AAA> |
AAA/*/BBB |
当<BBB> 标签嵌套在<AAA> 标签的任何地方时:<AAA><FFF> <BBB></BBB> </FFF></AAA> |
AAA[CCC] |
当遇到带有CCC 属性(有任何值)的<AAA> 标签时:<AAA CCC= " 10 " ></AAA> |
AAA[CCC=22] |
当遇到CCC 属性值为“22” 的<AAA> 标签时:<AAA CCC= " 22 " ><AAA> |
AAA[CCC=22]/*/BBB |
当<BBB> 标签嵌套在具有值为“22” 的CCC 属性的<AAA> 标签中的任何地方时:<AAA CCC= " 22 " ><FFF> <BBB></BBB> </FFF></AAA> |
规则操作中的服务器端表达式和代码
规则中的操作可能包含在执行页面(运行时)或编译页面(编译时)时执行的表达式和代码。
操作中的运行时表达式
要在操作中指定运行时表达式,请使用可以在CSP
页面中使用的相同的#(expr)#
语法。
例如,下面是一个规则的定义,它定义了一个<TODAY>
标签,使用Caché $ZDATE
命令显示当前时间:
<csr:rule name="TODAY" match="TODAY" empty>
<csr:action>
Today is: <b>#($ZDATE($H))#</b>
</csr:action>
</csr:rule>
如果你加载了这个规则,你可以把它放在CSP
页面的主体中:
<TODAY>
当请求页面时,显示当前日期。
动作中的编译时表达式
要在操作中指定编译时表达式,请使用##(expr)##
语法。
例如,下面是一个规则的定义,该规则定义了一个标记<LASTMOD>
,该标记显示CSP
页面最后一次编译的时间。
在编译页面时计算##()##
表达式。
计算表达式的结果成为生成的CSP
页面的静态部分。
<csr:rule name="LASTMOD" match="LASTMOD" empty>
<csr:action>
This page was last compiled on: <b>##($ZDATE($H))##</b>
</csr:action>
</csr:rule>
可以在运行时表达式中包含编译时表达式。
在下面的例子中,第一个$H
在运行时计算,给出当前日期。
第二个函数在编译页面时计算,返回页面编译的日期。
This page is #(+$H - ##(+$H)##)# days old.
<script>
操作中的标签
类似地,可以在一个操作中包含多行代码,使用<script language=cache runat=server>
标记表示运行时代码,使用<script language=cache runat=compiler>
标记表示编译时代码。
例如,下面是一个规则,它创建了一个包含100
项的无序列表:
<csr:rule name="BIGLIST" match="BIGLIST" empty>
<csr:action>
<ul>
<script language="Cache" runat=server>
For i = 1:1:100 {
Write "<li>Item " _ i _ $C(13,10)
}
</script>
</ul>
</csr:action>
</csr:rule>
如果你加载了这个规则,你可以像这样把它放在CSP
页面的主体中:
<BIGLIST>
当请求该页面时,将显示一个包含100
项的无序列表。