如果 Web 站点或者帮助系统缺乏定义和结构,读者就可能迷失在内容之中。信息体系结构是组织内容建立相互联系的准则,使读者不致于迷失方向,从而找到需要的答案。通过为信息体系结构定义正式的设计模式,内容提供者可以运用经过验证的体系结构提高用户经验。通过 DITA 映射领域,可以用 XML 表达这些设计模式,以便作者在多种内容集合中前后一致地重复使用这些模式。
本文将介绍创建 DITA 映射领域的设计技术。不过在讨论这项技术之前,您应该对设计模式及其在信息体系结构中的应用有充分的了解。
设计模式提供了一种解决方案,以及其适用问题的正式定义。设计模式的目的是避免将每种情况都看作是从未遇到过的新问题予以解决,而是重复使用曾经有效地解决方案。具体而言,设计模式萃取了专家的经验或者一个社区的最佳实践,使每个人都能应用这种专门技术。虽然设计模式源自建筑业,但是在软件工程中取得了很大成功,这种技术也同样适用于信息体系结构。
设计模式通常表示成结构化地描述,包含正式的标题。比如,设计模式的基本模板可能包含模式名、出现问题的上下文和问题的解决方案。
简而言之,信息体系结构就是组织信息及其导航结构,使用户能够方便有效地获取知识的设计原则。比方说,Web 站点的体系结构常常提供网页的层次组织,从概要到细节,不同类型的网页用于不同的目的,如新闻和文档等。
好的信息体系结构让人感觉不到它的存在,而糟糕的信息体系结构则非常突出。用户找不到需要的信息,甚至在偶尔遇到的时候也不能识别和吸收需要的信息。您可能曾经遇到过缺乏组织或者组织方式不一致的网站,不同的部分采用不同的做法。从这样的信息源提取知识让人疲惫不堪,用户很快就会放弃努力到别的地方查找信息去了。
同样的问题也存在于其他在线信息系统,比如帮助系统。信息的组织和导航对于用户能否获得需要的知识具有很大的影响。
信息体系结构设计模式的一个例子是针对特定主题的“how-to”问题集,基本的设计模式如下。
- 模式名
- How to
- 上下文
- 用户需要完成特定的目标,但是不知道某些背景知识或者步骤。一些用户需要了解整个活动,其他用户只需要更新知识。可以将目标描述成不同的活动。
- 解决方案
- 提供相关主题集合,解释用户必须理解的概念,列举用户必须执行的任务,提供例子说明如何实现目标。任务是“how-to”问题集的核心。集合的顺序为:
- 介绍性主题。
- 需要的概念性主题。
- 人物。
- 为详细说明提供的例子。
- 总结性主题。
用户可能为了多个目标使用“how-to”,比如设置 Web 身份验证、从 Web 应用程序中读数据库等。通过应用“how-to”设计模式,作者可以提供结构良好的、前后一致的信息。
图 1 到 3 说明了使用“how-to”集合设计模式在信息体结构上获得的清晰性和一致性:
图 1. 随意的体系结构
图 2. 设计模式
图 3. 正式的体系结构
简单地讲,设计模式就是一种供作者填写的蓝图。信息体系结构可以提供这种设计模式的清单,每种模式解决一个问题。
即使“how-to”集合这么简单的设计模式,作者也可能忘记或者误用它。随着设计模式的数量和复杂程度的增加,模式变得越来越难以应用。这种编辑上的挑战可能对设计模式的大量采用造成阻碍。
如果仅仅通过描述来定义,设计模式的推广和执行只能依靠编者的持续警觉。更好的办法是将设计模式表示成 XML 设计,能够通过 XML 编辑器或者解析器对其进行验证。用 XML 定义设计模式带来了以下好处:
- 标记可以知道作者的工作。
- 保证设计模式使用的一致性。
- 保证彻底应用设计模式。
- 处理程序能够识别设计模式并对其声明性语义进行操作,比如,可以提供“how-to”集合的特殊索引。
注意,定义集合的 XML 设计并没有禁止主题的重用,而是指导在集合中适当的位置使用适当类型的主题。比如,在“how-to”设计中,概念主题仅作为背景知识出现在任务之前,而不是出现在“how-to”的中间。
DITA 通过主题和映射类型支持正规的信息体系结构的定义。主题类型定义主题内部的信息体系结构(在微观层次上),而映射类型定义跨越主题的信息体系结构(宏观层次上)。
基本的主题和映射类型是通用的,非常灵活,能够容纳各种不同的可读信息。这些一般化的类型可以专门化,定义您的信息体系结构所需要的严格类型。
- 主题:主题类型限制了主题内容的结构。比如,DITA 分发包括一个任务类型,作为主题内容的一部分提供一个操作步骤列表。这种专门化的主题类型为作者提供了指导信息,可以保证所有任务主题的一致。处理程序可以依赖这种一致性和语义的精确性。比方说,任务类型的处理程序可以将任务步骤格式化成检查框。
- 映射:映射类型约束了主题集合的结构。映射可以定义帮助系统的导航层次结构,或者图书中主题的先后顺序和嵌套。比如,DITA 分发包含一个 bookmap 示范,规定了顶层主题中前言、章节和附录的先后顺序。这种专门化的映射类型保证主题集合符合入门书籍的结构。
如果没有表示信息体系结构的正式类型,那么只能通过编辑原则来定义信息体系结构。不同的作者可以以不同的方式解释这些原则,或者在不同的程度上遵循这些原则,从而造成不一致性和不可预测性。相反,形式化的类型可以保证多种交付品中重复使用设计。
DITA 映射可以增加很多功能,其中包括通过映射领域实现专门化。但是这不是为主题内容打包元素的专门化,而是专门化映射内容的元素,通常是
topicref 元素。专门化的
topicref 元素允许作者规定主题集合的语义或者约束。通过将
topicref 专门化打包成映射领域而不是一种映射类型,您可以在多种不同映射类型中重用设计模式。
专门化的
topicref 可用于:
- 限制对特定类型主题的引用。比如,
conceptref只能引用概念主题(包含专门化的主题)。 - 在集合中指定主题的角色。比如,
summaryref元素标识的主题可以提供集合的总结说明。 - 限制集合的内容,要求在集合中的特定位置出现特定的主题类型或者角色。
通过这些功能就可以创建“how-to”集合设计模式的 XML 定义。
映射领域使用与主题领域相同的 DTD 实现技术。关于领域实现技术的细节,请参阅“ DITA 中对域进行专门化”,这里不再重复。本文对领域 DTD 实现技术在映射中的应用进行了总结:
- 创建
领域实体文件声明扩展
topicref的元素。 - 创建 领域定义模块定义包含其元素实体、内容、属性定义和结构型类属性。
- 创建 外壳 DTD组装基本的映射模块、领域实体文件和定义模块。
- 作者通过外壳 DTD 映射集合并组织主题。
“how-to”领域的实体文件定义了
howto 、
conceptref 、
taskref 和
exampleref 这些
topicref 元素的扩展,并定义了领域属性实体的“how-to”领域声明:
<!ENTITY % howto-d-topicref "howto"> <!ENTITY howto-d-att "(map howto-d)"> |
“how-to”领域的定义模块从元素实体开始,因此新定义的元素可以在后续的专门化中被进一步扩展。这些新元素中,只有
howto 需要在实体文件中声明,因此其他新建元素不能出现在
howto 元素的子列表中。(事实上,引用类型化元素,如
conceptref 和
taskref ,也可以在实体文件中定义,以便在其他专门化的子列表中重用它们。)
清单 1. 默认的元素实体
<!ENTITY % howto "howto"> <!ENTITY % conceptref "conceptref"> <!ENTITY % taskref "taskref"> <!ENTITY % exampleref "exampleref"> <!ENTITY % summaryref "summaryref"> |
定义模块继续定义元素。
howto 元素的定义限制该集合的内容列表只能包含:
- 概述主题的元数据。
- 对概念主题的引用,个数不限。
- 对任务主题和可选示例主题的引用,个数不限。
- 作为归纳总结的主题。
此外,
howto 元素还引用了提供内容概述的主体。
清单 2. 集合结构定义
<!ELEMENT howto ((%topicmeta;)?, (%conceptref;)*, ((%taskref;),
(%exampleref;)?)+, (%summaryref;))>
<!ATTLIST howto
navtitle CDATA #IMPLIED
id ID #IMPLIED
href CDATA #IMPLIED
keyref CDATA #IMPLIED
query CDATA #IMPLIED
conref CDATA #IMPLIED
copy-to CDATA #IMPLIED
%topicref-atts;
%select-atts;>
|
conceptref 和
taskref 元素的类型是受限制的。如果编辑器或者验证过程发现引用的主体不是已声明的类型(或者已声明类型的专门化),处理程序就会报告错误。
清单 3. 引用类型定义
<!ELEMENT conceptref ((%topicmeta;)?, (%conceptref;)*)> <!ATTLIST conceptref href CDATA #IMPLIED type CDATA "concept" ...> <!ELEMENT taskref ((%topicmeta;)?, (%taskref;)*)> <!ATTLIST taskref href CDATA #IMPLIED type CDATA "task" ...> |
exampleref 和
summaryref 元素的类型不受限制,但是规定了引用主题的角色。因为
howto 集合的内容列表允许出现示例主题,并要求出现总结主题,作者将得到提示创建这些角色的主题,可以在处理程序中使用这些角色,比如,为主题的标题添加引导语。
清单 4. 引用角色定义
<!ELEMENT exampleref ((%topicmeta;)?, (%exampleref;)*)> <!ATTLIST exampleref ...> <!ELEMENT summaryref ((%topicmeta;)?)> <!ATTLIST summaryref ...> |
进一步考察这些特殊的角色,可能会发现这些角色代表一种永久性的主题结构或者语义,这种情况下,定义主题类型并相应限制引用这类主题的专门化
topicref 是合适的。不过,为主题分配角色的一般技术在集合上下文中仍然是有效的。
最后,定义模块设置了类属性,以声明新元素是从
topicref 派生的,并由
howto 包提供:
清单 5. 元素祖先定义
<!ATTLIST howto %global-atts;
class CDATA "- map/topicref howto/howto ">
<!ATTLIST conceptref %global-atts;
class CDATA "- map/topicref howto/conceptref ">
... |
与主题领域相同,“how-to”领域也使用外壳 DTD 把基本的映射模块和实体文件、定义模块组装在一起:
清单 6. Shell 文档类型
<!--vocabulary declarations-->
<!ENTITY % howto-d-dec PUBLIC "-//IBM//ENTITIES DITA How To Map Domain//EN"
"howto.ent">
%howto-d-dec;
...
<!--vocabulary substitution (one for each extended base element,
with the names of the domains in which the extension was declared)-->
<!ENTITY % topicref "topicref | %mapgroup-d-topicref; | %howto-d-topicref;">
<!--vocabulary attributes (must be declared ahead of the default definition) -->
<!ENTITY included-domains "&mapgroup-d-att; &howto-d-att;">
<!--Embed map to get generic elements -->
<!ENTITY % map-type PUBLIC "-//IBM//Elements DITA Map//EN" "../../dtd/map.mod">
%map-type;
<!--vocabulary definitions-->
...
<!ENTITY % howto-d-def PUBLIC "-//IBM//ELEMENTS DITA How To Map Domain//EN"
"howto.mod">
%howto-d-def; |
使用该外壳 DTD,映射可以包含一个或多个“how-to”集合,如下例所示:
清单 7. 映射实例文档
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE map PUBLIC "-//IBM//DTD DITA How To Map//EN"
"howtomap.dtd">
<map>
<!-- how-to clusters can appear anywhere in a map hierarchy but always
follow a consistent information pattern within the how to -->
<howto href="dita-mapdomains.xml">
<conceptref href="designPatterns.xml"/>
<conceptref href="informationArchitecture.xml"/>
<conceptref href="formalCollection.xml"/>
<conceptref href="xmlDesign.xml"/>
<conceptref href="mapBackground.xml"/>
<conceptref href="mapSpecialization.xml"/>
<taskref href="implementDomain.xml"/>
<exampleref href="declareEntities.xml"/>
<exampleref href="domainModule.xml"/>
<exampleref href="assembleDTD.xml"/>
<exampleref href="domainInstance.xml"/>
<summaryref href="summary.xml"/>
</howto>
</map> |
事实上,该例就是您正在阅读的这篇文章的映射,也就是说(您可能已经注意到了)这篇文章符合“how-to”集合的设计模式。下面是这篇“how-to”文章的主题列表,其中包括相应的主题类型或者角色:
howto:用 DITA 映射领域设计信息体系结构的模式
- 概念:设计模式。
- 概念:信息体系结构。
- 概念:how-to集合的设计模式。
- 概念:用 XML 定义设计模式。
- 概念:专门化主题和映射。
- 概念:映射专门化。
- 任务:实现映射领域。
- 例子:声明映射领域实体。
- 例子:定义映射领域模块。
- 例子:组装外壳 DTD。
- 例子:创建领域集合(即本主题)。
- 结束语:结束语。
对本文而言,how-to 集合组成了整个内容集,但是这种排列并不是必需的。how-to 集合可以作为更大的内容集的一部分。比如,在帮助系统中,可以包含多个 how-to 集合,将它们作为导航层次结构的一部分。类似地,可以通过创建新的外壳 DTD 把 bookmap 映射类型和 how-to 映射领域结合起来,还可以在书籍中使用 how-to 集合。
在考察设计模式和集合时您会发现,除了主题之外,设计模式还可以由更小的集合组成。比如,可以分别为 how-to 集合、案例研究集合和参考设置集合创建设计模式。然后产品信息设计模式可以包含产品总结主题和一些次一级的集合,每一种至少一个。您可以通过创建每种较低层次的设计模式和一个高层设计模式,用 XML 实现这种设计。
您还会发现,为了用集合表示高层关系,可以为集合创建到根主题的关系。根主题可以作为集合的介绍和入口,提供关于集合内容最一般性的陈述。也就是说,您可以将主题集看作是一个集合性的内容对象,使用根主题将集合表示成导航和交叉引用的一个整体。
本文介绍了如何专门化
topicref 元素,以限制特定的主题集合。对于完整的、用途单一的集合,如功能规范、信息规划和快速参考指南,您可以将这类专门化的
topicref 元素打包成新的映射类型。对于 how-to 或者案例研究这类可能出现在更大的内容集中的设计模式,尤其是不同的设计者可能创建不同的集合类型的时候,可以将这类专门化的
topicref 元素打包成映射领域。
通过以这种方式专门化 DITA 映射,就可以借助于 XML 定义实现正式的、应用设计模式的信息体系结构。具体地说,通过将这些大尺度的设计模式用作集合对象,信息体系结构可以描述出内容集的规划。通过这种方式,信息体系结构可以为作者提供指导,为处理程序声明集合的语义,最终使用户看到前后一致的、完整的、组织良好的信息。
| 名字 | 大小 | 下载方法 |
|---|---|---|
| x-dita7-howto.zip | 15KB | HTTP |
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文。
- 下载本文使用的
definition for the how-to map domain和 DITA 源文件作为使用领域的一个例子。将这个例子解压到
developerWorks
public DITA toolkit dita13 发行版本的根目录下。
- 从
OASIS Cover page了解 DITA。
- 阅读
developerWorks文章“
介绍 Darwin 信息分类体系结构”(2003 年 10 月)。
- 了解如何实现 DITA 专门化,阅读 Michael Priestley 撰写的“
在 Darwin 信息分类体系结构中的专门化”(
developerWorks,2003 年 10 月)。
- 阅读 Erik Hennum 的文章“
DITA 中对域进行专门化”,该文介绍了如何利用可扩展的 DITA DTD 描述新的信息领域(
developerWorks,2003 年 10 月)。
- 了解如何参加
DITA 论坛的讨论组,该论坛由 Don Day 和 Michael Priestley 主持。
- 在
DITA 用户组参加关于 DITA 的讨论。
- 进一步了解
网站的设计模式和其他联机信息系统。
- 看一看具体的
设计模式目录,主要是关于用户界面的,但也有一些信息结构的应用。
- 追踪
信息体系结构的发展趋势。
- 进一步了解
设计模式背景知识。
Erik Hennum 从事 User Assistance for the IBM Storage Systems Group 的设计和实现方面的工作,他还帮助定义了 DITA 领域专门化的基本原理。
Don Day 为 IBM Information Development 社区设计和支持发布工具,曾经代表 IBM 参加 W3C XSL 和 CSS 工作组。过去的三年中,Don 领导了开发并维护 DITA DTD 和规范的工作。他从新墨西哥州立大学获得了英语和新闻学学士学位、技术和专业通信硕士学位。