模板过程:创建标记语言标签集
立即解锁
发布时间: 2025-08-30 01:12:43 阅读量: 4 订阅数: 9 AIGC 

### 模板过程:创建标记语言标签集
#### 1. 熟悉标签集
在使用模板过程创建标记语言标签集时,有几个关键的语句和操作需要了解。
##### 1.1 NOTES 语句
NOTES 语句用于提供关于标签集定义的信息。它会成为编译后标签集定义的一部分,可以使用 SOURCE 语句查看。其语法为:
```sas
NOTES ’text’;
```
其中,`text` 是提供关于标签集的信息。
##### 1.2 END 语句
END 语句用于结束标签集定义,语法很简单:
```sas
END;
```
##### 1.3 列出标签集名称
SAS 提供了一组标签集定义。要获取 SAS 提供的标签集名称列表,以及你创建并存储在 `SASHELP.TMPLMST` 模板存储中的任何标签集,可以提交以下 SAS 语句:
```sas
proc template;
list tagsets;
run;
```
默认情况下,`PROC TEMPLATE` 会列出 `SASHELP.TMPLMST` 和 `SASUSER.TEMPLAT` 中的标签集。通常,你对 `SASHELP.TMPLMST` 项目存储(SAS 标签集目录所在位置)只有只读访问权限,而 `SASUSER.TEMPLAT` 是默认存储你创建或自定义标签集的项目存储。
##### 1.4 指定标签集名称
要指定存储在 `SASHELP.TMPLMST` 中的 SAS 标签集,或你创建并存储在 `SASUSER.TEMPLAT` 或任何其他项目存储中的标签集,使用两级名称:`TAGSETS.tagset-name`。例如,`tagsets.chtml` 或 `tagsets.mytagset` 是有效的两级标签集名称。默认情况下,SAS 知道指定的标签集存储在 `SASHELP.TMPLMST` 或 `SASUSER.TEMPLAT` 中。
如果要指定存储在 `SASUSER.TEMPLAT` 以外项目存储中的标签集,需要使用 `ODS PATH` 语句将该项目存储分配给 ODS 搜索路径。
##### 1.5 查看标签集定义的内容
可以使用 SAS 窗口环境或 TEMPLATE 过程来查看标签集定义的内容。
- **SAS 窗口环境**:
1. 从菜单中选择“View I Results”。
2. 在结果窗口中,选择“Results”文件夹。右键单击并选择“Templates”以打开“Templates”窗口。
3. 双击“Tagsets”以查看该项目存储或目录的内容。
4. 双击你要查看的标签集定义。例如,`CHTML` 标签集定义是 `CHTML` 输出的模板存储。
- **SAS 窗口命令**:
1. 在命令栏中提交以下命令以查看“Templates”窗口:
```sas
odstemplates
```
2. 当你双击一个项目存储(如 `Sashelp.Tmplmst`)时,该项目存储会展开以列出存储 ODS 模板的目录。SAS 提供的模板位于 `Sashelp.Tmplmst` 项目存储中。
3. 要查看 SAS 提供的标签集定义,双击“Tagset”项目存储。
4. 右键单击标签集定义(如 `Rtf`)并选择“Open”。标签集定义将显示在“Template Browser”窗口中。
- **TEMPLATE 过程**:
要查看标签集定义的源代码,使用 `PROC TEMPLATE` 并指定标签集的两级名称。例如,要查看生成 `CHTML` 输出的 SAS 标签集的源代码,提交以下 SAS 语句:
```sas
proc template;
source tagsets.chtml;
```
查看 `TAGSETS.CHTML` 的源代码,会发现它由以下部分组成:
- 一个 `DEFINE TAGSET` 语句,用于命名标签集定义。
- 事件定义,用于定义写入输出文件的内容。
- 标签集定义属性,如输出类型和换行符。
#### 2. 理解事件
标签集定义通过一系列事件和变量控制输出生成。事件定义了写入输出文件的内容,以下是关于事件的一些关键点:
- 事件具有唯一名称。生成 ODS 输出的 SAS 过程使用一组标准事件,你可以在自己的标签集定义中重新定义这些事件来进行自定义。此外,你还可以定义自己的事件。
- `DEFINE EVENT` 语句为事件定义分配名称。
- 事件定义可以包括开始和/或结束部分,用于指定不同的操作。如果事件定义不包括开始或结束部分,则该事件是无状态的,这意味着无论事件如何调用,事件中的所有操作都会执行。如果事件有结束部分,并且结束部分上方有语句,则假定有开始部分。
- 事件定义可以使用 `TRIGGER` 语句执行另一个事件。如果你在事件的开始部分,则触发的任何事件也将运行其开始部分。如果你在结束部分,则触发的事件将运行其结束部分。如果触发的事件没有开始或结束部分,则将运行其拥有的语句。触发器还可以显式请求事件的特定部分。
- 事件可以根据条件执行操作。
- 大多数情况下,事件由 `PUT` 语句、文本和事件变量组成。
以下是一个简单的 HTML 表格输出的事件定义示例:
```sas
define event table;
start:
put "<table>" nl;
finish:
put "</table>" nl;
end;
```
在这个事件定义中,`DEFINE EVENT` 语句开始事件并将其命名为 `TABLE`。`START` 部分定义了事件的开始部分,`FINISH` 部分定义了事件的结束部分。表格的事件定义需要 `START` 和 `FINISH` 部分,因为 ODS 需要知道如何定义开始和结束。`PUT` 语句指定将标签 `<table>` 和 `</table>` 写入输出文件,并在每个标签后添加换行符。
另一个事件定义示例:
```sas
define event data;
put "<TD>";
put VALUE;
put "</TD>";
end;
```
这个事件定义不包括开始和结束部分,`PUT` 语句指定将标签 `<TD>` 和 `</TD>` 写入输出文件。此外,使用了事件变量 `VALUE`,以便将来自 SAS 过程或数据集的数据值写入输出文件,并使用 `<TD>` 和 `</TD>` 标签括起来。
#### 3. 理解变量
变量是用于保存数据的编程结构。变量保存分配给它的数据,直到分配新值或程序结束。每个变量都有唯一的名称,并保存处理请求输出的内部信息(ODS 或 XML LIBNAME 引擎使用的元数据)或与输出本身直接相关的信息。例如,变量 `COLCOUNT` 保存输出中的列数,变量 `DATE` 保存日期。
标签集使用的变量可以分为两组:内部生成的和用户创建的。
##### 3.1 内部生成的变量
内部生成的变量有 3 个逻辑划分:
| 变量类型 | 描述 |
| ---- | ---- |
| 事件变量 | 包括文本、格式和数据值。这些变量可以源自许多地方,如表定义、过程、标题或副标题处理。 |
| 样式变量 | 由当前使用的 ODS 样式属性指定。样式变量与其他事件变量的区别在于,你确切知道它们的来源。 |
| 动态变量 | 在 SAS 中动态创建。由于它们是动态创建的,其名称或使用方式未知。这些变量是动态的,因为它们不是由 ODS 定义的,而是由诸如 SAS/GRAPH 和 XML LIBNAME 引擎等应用程序定义的。动态变量以前缀 `@` 符号表示,可以使用“DYNAMIC 语句”列出。 |
##### 3.2 用户创建的变量
用户创建的变量有两种类型:
| 变量类型 | 描述 |
| ---- | ---- |
| 内存变量 | 使用 `SET` 语句在 `DEFINE EVENT` 语句中创建。一旦创建,内存变量在所有事件中全局可用。它们一直存在,直到被删除。内存变量以前缀 `$` 符号表示。 |
| 流变量 | 与内存变量不同,流变量可以保存非常大量的数据。它们可以保存大量数据,因为随着数据增长,会根据需要将其写入磁盘。打开流变量会将 `put` 语句的所有输出重定向到流,直到关闭它。流变量还可以打开、关闭、刷新、设置和取消设置。 |
##### 3.3 显示事件变量及其值
由于变量表示数据,其值可能存在也可能不存在,这取决于 SAS 过程和作业。例如,某些变量只有在你使用过程选项或样式选项指定它们时才有值。其他变量有值是因为需要内部信息,如输出中的列数。
例如,`TAGSETS.CHTML` 包含事件定义 `COLSPECS`,它使用事件变量 `COLCOUNT` 让 ODS 知道输出中的列数:
```sas
define event colspecs;
put "<p>" nl "<table";
putq " columns=" COLCOUNT;
put " cellpadding=2 border=1>" nl;
end;
```
要确定哪些变量有值以及值是什么,可以使用 `EVENT_MAP` 语句提交 SAS 程序。
#### 4. 创建自己的标签集
##### 4.1 创建标签集的方法
创建标签集时,使用 `TEMPLATE` 过程定义标签集定义。一般来说,有三种方法可以创建自己的标签集:
- 通过继承定义标签集定义。
- 复制现有标签集定义,然后进行修改。
- 定义自己的标签集定义。
##### 4.2 标签集定义中继承事件
标签集可以相互继承事件。例如,SAS 标签集 `TAGSETS.WMLOLIST` 从 `TAGSETS.WML` 继承了大部分事件,`TAGSETS.IMODE` 从 `TAGSETS.CHTML` 继承了大部分事件。从现有标签集定义继承事件是定义新标签集定义的最简单方法。
要继承事件,标签集定义在 `DEFINE TAGSET` 语句中使用 `PARENT=` 属性指定要继承的标签集名称。当为标签集定义指定父标签集时,父标签集定义中指定的所有标签集选项、属性和语句将用于新定义,除非新定义覆盖它们。也就是说,在新标签集定义中,一个事件可以覆盖父标签集中定义的同名事件的操作。
例如,如果父标签集定义了一个名为 `TABLE` 的事件,你可以在新标签集中重新定义该事件来更改其操作。
##### 4.3 使用 EVENT_MAP 标签集定义标签集
生成 ODS 输出的 SAS 过程使用一组标准事件和变量。要生成自定义输出,你可以创建具有自定义事件的自己的标签集。但是,为了自定义事件,你必须知道 ODS 使用的事件名称。
一个很好的开始定义自定义标签集的方法是使用 SAS 提供的 `EVENT_MAP` 标签集,以确定哪些事件被触发以及事件使用哪些变量将 SAS 过程的输出发送到输出文件。当你使用 `TAGSETS.EVENT_MAP` 运行 SAS 过程时,ODS 会将 XML 标记写入输出文件,该文件将所有事件名称和变量名称显示为标签。在输出中,标签名称是事件名称,标签属性是这些事件有值的变量。
例如,以下语句运行 `ODS MARKUP` 并指定 `TYPE=EVENT_MAP`,以查看 ODS 对 `PROC PRINT` 输出的各个部分使用了哪些事件和变量:
```sas
ods markup type=event_map file=’custom-tagset-filename.xml’;
proc print data=sashelp.class;
where Height gt 60;
run;
ods markup close;
```
在 `EVENT_MAP` 生成的 XML 输出中,你可以看到 `PROC PRINT` 使用了名为 `DOC_HEAD`、`PROC`、`TABLE` 等的事件。`TABLE` 事件使用来自事件变量(如 `STATE`、`CLASS` 和 `TYPE`)的数据。一旦你知道了用于生成输出的事件和变量,就可以定义自己的标签集定义并自定义事件。
例如,你可以重新定义 `TABLE` 事件以产生自己的输出。要定义一个标签集来自定义自己的输出,你可以首先指定 `TAGSETS.EVENT_MAP` 作为父标签集。然后,当你重新定义事件以自定义输出时,它们将替换 `EVENT_MAP` 标签集中定义的默认事件。此外,你可以通过在标签集定义中将默认事件重新定义为空事件来删除其操作。当你对自定义输出满意时,删除 `EVENT_MAP` 继承和空事件,这样输出将仅反映你定义的事件。
需要注意的是,当你首次运行 SAS 过程并指定 `TYPE=EVENT_MAP` 时,还可以生成一个样式表以及主体文件。样式表将告诉你正在使用哪些样式属性。
##### 4.4 EVENT_MAP 的替代方案
如果你需要其他类型的输出,以下是一些可以用作替代的标签集:
- `TEXT_MAP` 生成更多的列表输出。
- `TPL_STYLE_LIST`(生成 HTML)和 `TPL_STYLE_MAP`(生成 XML)。但是,这些标签集仅列出了可能属性的子集。
- `STYLE_POPUP` 生成类似于 `HTMLCSS` 的 HTML,但如果你使用 Internet Explorer,`STYLE_POPUP` 会显示一个窗口,显示你点击的任何项目的解析 ODS 样式定义。
- `STYLE_DISPLAY` 类似于 `STYLE_POPUP`,但生成一个简单的输出页面供你点击。
- `NAMEDHTML` 生成类似于 `STYLE_POPUP` 的 HTML,但所有对象都像使用 `ODS TRACE` 一样被标记。
##### 4.5 使用 SAS DATA 步函数定义标签集
SAS DATA 步函数对参数执行计算或系统操作并返回一个值。在 Base SAS 软件中,你可以在 DATA 步编程语句、`WHERE` 表达式、宏语言语句、`REPORT` 过程、结构化查询语言(SQL)以及创建自己的标签集时使用 SAS 函数
0
0
复制全文
相关推荐










