SGML 的设计宗旨是不依赖于系统;因此,甚至找到了一种避免使用文件名称的方法。 SGML 讨论了“外部实体”,可以通过两种方式进行标识:公共标识符或系统标识符。通常,首选公共标识符,因为它与系统无关。所有编辑过 HTML 的人都知道公共标识符。以下行:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Draft//EN">
表示:“这是一个 `HTML' 文档,您可以通过公共标识符 `-//W3C//DTD HTML 3.2 Draft//EN' 找到规范”。 可以通过多种方式将公共标识符解析为 SGML:通过数据库、文件系统、网络或手头的 SGML 系统实现的任何方式。
将公共标识符映射到系统标识符的标准方法是通过 SGML Open 目录。 这些文件包含如下条目:
PUBLIC "-//W3C//DTD HTML 3.2 Draft//EN" "/usr/local/sgml/html3-2.dtd"
其中第三个字段是系统标识符,在这种情况下(实际上在大多数情况下)是一个文件名。 SGML 软件知道如何找到这些目录并使用它们来转换公共标识符,而用户无需担心文件位置。 通常,名称是硬编码的,但可以通过环境变量中的一组名称来覆盖SGML_CATALOG_FILES.
SGMLtools 在一个众所周知的位置 (/var/lib/sgml/catalog) 构建和使用共享目录,其中包含所有这些映射,因此尽可能避免使用硬编码的系统标识符,从而使文档更具可移植性。