新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> DTD, XML Schema(XMLS), RELAX NG
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DTD/XML Schema 』 → 使用 Emacs 来编辑 XML 文档 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 7445 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: 使用 Emacs 来编辑 XML 文档 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     anchen0617 帅哥哟,离线,有人找我吗?双子座1983-6-17
      
      
      威望:5
      等级:大二(研究C++)
      文章:281
      积分:3413
      门派:XML.ORG.CN
      注册:2004/10/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给anchen0617发送一个短消息 把anchen0617加入好友 查看anchen0617的个人资料 搜索anchen0617在『 DTD/XML Schema 』的所有贴子 访问anchen0617的主页 引用回复这个贴子 回复这个贴子 查看anchen0617的博客楼主
    发贴心情 使用 Emacs 来编辑 XML 文档

    对于 UNIX 开发人员而言,以功能强大的文本编辑器而著称的 Emacs 是用于 MS-DOS、Windows 和 MacOS 的理想 XML 编辑器。作者描述了如何正确安装附加的包并修改设置以创建带有扩展的(PSGML 和 OpenSP)Emacs 强大的 XML/SGML 编辑与验证环境。下载并安装 Emacs 和单独的几个包就可以完成大部分环境设置工作,但是还必须正确地配置 Emacs 并启用计划要使用的 DTD。本文包含一些样本配置文件和 XHTML DTD。
    虽然 Emacs 以深受 UNIX 开发人员所喜爱的一种功能强大的文本编辑器而著称,但是也可以在非 UNIX 平台(例如,Windows、MS-DOS 和 MacOS)上将 Emacs 用来编辑 XML。作为一种成熟的开发环境,Emacs(请参阅边框里的 Emacs 简介)可以用来处理文本、编写应用程序以及我将要讨论的创建结构化的信息(XML 和 SGML)。我将它作为一种一般用途的编辑器,用来创建和管理我的某些编程项目,以及编写 XHTML 和处理 SGML 与 XML。事实上,我正是使用 Emacs 来写这篇文章的。

    本文讲述了如何安装 Emacs,以及 PSGML 和 OpenSP 扩展。它还概述了如何定制 Emacs 以使它适合各种 DTD。我每次介绍众多 Emacs 定制中的一段。但是,您可以下载带有样本 DTD 的 zip 文件以及所有的 Emacs 定制(请参阅参考资料)。我的目的是通过提供刚好够用的信息来帮助您理解 Emacs 是怎么回事,使您能开始使用 Emacs。然后,您将能够根据需要及喜好来添加 DTD 和定制 Emacs。

    获取和安装 Emacs
    先从安装 Emacs 开始。可以从 GNU 网站或其镜像网站(请参阅参考资料)获取更多的 Emacs 信息以及 Emacs 的分发版(distribiution)。一些基于 UNIX 的分发版中带有 Emacs。例如,我的 Redhat Linux 7.1 版本就已经安装了 Emacs 版本 20.5.1(PSGML 的一种旧版本)。

    Linux 和 UNIX 安装
    因为大多数 UNIX 和 Linux 用户不需要我的任何指导就知道如何获取并安装软件,所以我只是告诉您 GNU 项目的网站。在本文的剩余部分,我所描述的定制适用于 UNIX/Linux 环境。

    Emacs 简介
    不久以前,UNIX 用户可以选择两种编辑器:vi 或 Emacs。如果您主要对纯文本感兴趣,则 vi 过去是现在也是一种功能强大的编辑器。但是,真正有能力的用户更愿意使用 Emacs,它是 GNU 项目最初的产物之一。Emacs 被描述成“可扩展的、可定制的、自身可编制文档(self-documenting)的实时显示编辑器”,可以在 tty 或字符方式下运行 Emacs — 例如,在 telnet 或 xterm 会话中 — 或在任何 UNIX 平台的图形用户界面中运行它。而且 Emacs 已经被移植到非 UNIX 平台,包括 MS-DOS、Windows 和 MacOS。

    Emacs 的可扩展性使它得以广泛应用。可扩展性源自 Emacs 的体系结构(这种体系结构被设计用来添加新的功能),并且和 Emacs 自身语言 Emacs Lisp 一起用于制作定制功能。可以通过变量设置和宏或者通过添加包来定制 Emacs。Emacs 是“自身可编制文档的”,它的这种方式可以让您查询其环境,这种方式还可以让您访问编辑器自身和任何已安装的包的文档。

    Windows 安装
    Windows 用户可以从在 GNU FTP 列表上列出的任何 FTP 站点的 windows/emacs/ 目录中找到最新的二进制分发版。emacs-20.7-bin-i386.tar.gz 文件不包含 Emacs Lisp 源码。编者注:更新的版本(版本 21.1)已在 10 月底发布,当时正在编写本文。本文基于 20.7 版本,我将更新它使它包括有关新版本的详细信息。如果对 Emacs 编程或如何实现特殊功能感兴趣,则请下载 emacs-20.7-fullbin-i386.tar.gz 文件。将 .gz 文件下载到本地硬盘。然后使用 WinZip 或其它能识别 .gz 的工具将内容解压缩到硬盘上的目录结构中。(解压缩时,请务必“保留文件夹信息”,这样可以创建相应的目录结构)。如果将该文件解压缩到驱动器 d:,并且允许按文件的原始目录结构创建,则基本路径为 d:\emacs-20.7,其中 d: 是该分发版在解压缩后所在的驱动器。在本文后面的部分,我将这个目录指定为 d:\Emacs。自述文件建议在安装路径中避免空格。我会注意这个警告。

    将该分发版解压缩后,将有一些文件和在主目录下的四个子目录:bin、etc、info 和 lisp。README.W32 文件包含关于获取以后的分发版、设置 Emacs 等信息。(README 文件还包括一个有关 Windows 95/98/ME 和 2000 上 GNU Emacs 的 FAQ 的 URL。)虽然不是必须的,我还是建议您运行 bin 子目录中的 addpm.exe 以注册 Emacs,这样就可以从 start 菜单上访问它了。一旦安装了 Emacs,请选择 Start->Gnu Emacs->Emacs。如果选择不注册 Emacs,则双击安装在 d:\Emacs\bin 目录中的 runemacs.exe 文件来启动。

    可以通过启动 Emacs 并选择 Help->Emacs Tutorial 来运行教程。不要因为必须使用控制键(ctrl)组合来完成许多功能而灰心。可以从学习一些常用控制键(ctrl)组合开始,然后在发现需要使用新的控制键(ctrl)组合时,再来学习它们。另外,在 Emacs 的 GUI 版本中,可以在菜单中执行许多功能。关于 Emacs 和 PSGML 其它教程的的建议,请参阅参考资料。

    定制 Emacs
    下一步是开始必要的 Emacs 定制,例如:

    设置变量以控制各种行为
    添加包
    编写自己的 Emacs Lisp 代码

    那么,我首先讲述如何设置变量和添加包。

    第一步是访问 Emacs 初始化文件。Emacs 在主目录中寻找这个文件。在 UNIX 环境中,初始化文件通常命名为 .emacs,并且在缺省情况下,该文件位于主目录下。

    在 Windows 上,我使用称为 _emacs 的文件,因为 Windows 通常不用以句点开头的文件名。在 Windows 上,通过设置环境变量或通过设置注册表项来指定主目录。如果没有进行设置,则作为最后的方法,Emacs 在目录 c:\ 下查找初始化文件。(因此,现在要么在 c:\ 中创建这个文件,要么参考 Windows 的 GNU Emacs FAQ(请参阅参考资料)以获取其它选择。)

    要测试 Emacs 是否正在查找初始化文件,可以使用您喜爱的文本编辑器添加清单 1 中这一项,它会在 Emacs 状态栏中打开时钟。在打开钟并启动 Emacs 之后,在状态区中查找该时间(在当前文件名称后)。如果看到时钟,则万事大吉了。

    清单 1. 测试 Emacs 初始化文件
    ; Display the time in the Emacs status area (an easy way to test
    ; that we are picking up our Emacs customizations).
    (display-time)

    既然已经安装了 Emacs,已经为定制它打下了基础,那么我们将考虑如何添加包,这些包为编辑和验证 SGML 和 XML 文档提供环境。

    添加 PSGML 以支持 SGML 和 XML 方式
    当前的 GNU Emacs 分发版包含 HTML 和 SGML 主要的编辑方式。通常,这些方式所提供的功能被限于辅助元素/属性项以及在元素中导航。对 HTML 的支持是基于 HTML 的较早版本。

    随着时间推移,SGML 正逐渐成为文档发布的流行工具,Lennart Staflin 创建了 PSGML,它是将 SGML 主要的编辑方式添加到 Emacs 的包。因为 HTML 和 XML 是 SGML 的子集,所以也可以使用 PSGML 来编辑 HTML 和 XML。实际上,最近的 PSGML 版本提供了 XML 编辑方式。

    PSGML 还包括一个内置的 SGML 解析器,它可以识别 DTD。如果您有自己的 SGML 或 XML 分支语言,则可以简单地安装您的 DTD。通过安装新的 DTD(或 DTD 集)来处理 HTML 标准的变化。PSGML 提供了与上下文相关的编辑,因此可以根据在文档中的位置添加元素或属性。导航特性允许在元素中移动,甚至可以移动到 下一个故障点以定位不符合您的 DTD 的标记。格式化特性基于嵌套来缩进元素,或者隐藏元素内容,因此可以将视图限制在特定区域。最后,可以使用外部的验证解析器来验证文档,我将在本文的后面介绍。

    图 1. 安装了 PSGML 的 Emacs(编辑 DITA FAQ)


    图 1 显示了一些 PSGML 添加到 Emacs 中的结构化的编辑特性,包括:

    带颜色的标记语法。
    基于嵌套层次的缩进标记。
    元素折叠。请注意 <prolog> 和前两个 <section> 元素是如何叠在一行的,在将这三个元素展开后,会发现在展开的 Tips and Techniques <section> 元素中的子元素。
    使用外部解析器的验证。验证的结果显示在文档缓冲区下的一个缓冲区中。在本文中,我使用 OpenSP 来验证文档。如果验证结果出现错误,则可以使用 Emacs“下一个错误命令”([Ctrl]-x `)来定位源文档中的错误。

    除了在图 1 中可以看见的特性以外,PSGML 添加了许多功能,可以通过下拉菜单、弹出菜单或控制(ctrl)键组合或命令来调用这些功能。

    Windows 技巧
    这里是我发现对于工具(例如,编辑器)非常有价值的 Windows 技巧。将 Emacs 添加到 SendTo 菜单中,而不要将 Emacs 与您想用它来编辑的特殊文件类型相关联(因为可能想让另一个应用程序与它们关联)。
    打开安装了 Emacs 的文件夹并导航到 \bin 目录。
    选择 runemacs.exe,单击鼠标右键并选择 Create Shortcut。出现突出显示的新快捷方式。
    单击鼠标右键并选择 Cut(您将要移动它)。
    移动到 start 按钮并单击鼠标右键以解压缩菜单。
    选择 Explore,会打开 Windows Explorer 中的 Start Menu 文件夹。
    在导航窗格中,选择 SendTo 文件夹(通常在 Start Menu 文件夹上)以打开它。
    在 SendTo 文件夹中,单击鼠标右键并选择 Paste 以插入 runemacs.exe 快捷方式。
    如果愿意,重命名快捷方式。
    现在,在系统中浏览文件时,可以选择一个文件(或几个)单击鼠标右键并选择 SendTo->Emacs 以用 Emacs 打开文件。
    获取和安装 PSGML
    需要下载 PSGML 的当前版本。可以从 Source Forge(请参阅参考资料)下载本文写作时的 PSGML 的当前版,版本 1.2.2。因为是和 Emacs 一起使用,PSGML 被压缩成为 .gz 文件以供下载;使用能识别 .gz 的实用程序(例如,WinZip)解压缩它。我将 PSGML 分发版解压缩到 Emacs 安装目录下的 site-lisp 目录中。解压缩时,请再次记住要指定保留目录信息。我在安装 PSGML 时,安装路径为 d:\Emacs\site-lisp\psgml-1.2.2。

    解压缩完毕后,请查阅 README.psgml 以获取一些基本信息,包括如何在 Emacs 的 UNIX 版本中安装 PSGML。

    在 Emacs Windows 版中安装 PSGML
    要准备在 Emacs Windows 版中安装 PSGML,首先要为 PSGML 创建一个目录(我的是 site-lisp)并且将 .gz 文件解压缩到该目录下,保留目录信息。

    下一步,需要确保 Emacs 可以找到包含 PSGML 的文件。可以将清单 2 的内容添加到 Emacs 初始化文件 _emacs 中来做到这一点。

    现在,Emacs 应该可以访问 PSGML 文件了,从而每当调用 sgml 方式或 xml 方式时,Emacs 都将使用 PSGML。后面我将说明如何根据正在编辑的文件的文件扩展名来自动调用那些方式。

    编译 PSGML 文件
    无论使用 Linux 还是 Windows,完成安装还需要再做一件事:编译 PSGML 文件。在 psgml 目录下找到一组 .el 文件类型。这些是 Emacs Lisp 文件。如果编译它们,则 PSGML 支持会运行得更快。有一个简单的实现办法:

    启动 Emacs。
    输入 [Alt]-x。
    当提示输入命令时,输入 byte-force-recompile [Enter]。
    当提示输入目录名时,将路径更改为您的 PSGML 文件,例如,d:/Emacs/site-list/psgml-1.2.2,并按 [Enter]。
    这应该编译大部分的 .el 文件并在“*Compile-log*”缓冲区中显示结果。(或在编译时收到几个关于已不用的变量的警告,但是我相信它们是无害的,可以忽略它们。)对于 psgml 目录中的大部分 .el 文件来说,最终结果应该是 .elc 文件(不会编译所有文件,因此如果漏掉某些文件,也不必担心)。

    添加 DTD
    如果 SGML 和 XML 方式不合并 DTD (用来描述需要创建的文档类型)则它们没有多大用处。因此这里讲述如何添加一些 DTD 和适当的配置以使 SGML 和 XML 成为 PSGML 中真正有用的方式。

    让我们从 XHTML 1.0 开始,它是 HTML 4.01 的 XML 化的版本(有关 XHTML 的更多信息,请参阅参考资料)。XHTML DTD 可使您创建符合 XML 标准并且可以用解析器验证(后面有更多关于这方面的描述)的 HTML,从而提供了更健壮和可管理性更好的文档。(可在参考资料中找到我在这一节中所讨论的 XHTML 1.0 DTD 和目录文件的 zip 文件)。

    这里是关于如何下载 XHTML DTD 和相关实体的步骤:

    创建 XHTML DTD 的子目录。我将所有我的 DTD 放在系统上的一个地方;假设它们驻留在与 Emacs 同级的 DTD 文件夹下:d:\DTDs。在该目录下创建 XHTML DTDs 的文件夹 d:\DTDs\xhtml1。
    在创建保存这些 DTD 文件的文件夹后,只需转至 W3C 的 DTD 站点(请参阅参考资料)以获取 XHTML DTD。有三种文档类型(strict、transitional 和 frameset)。
    对于这三种文档类型的每一种,在链接上单击鼠标右键将目标保存为文件。(可能需要除去浏览器保存文件时添加的额外的 .txt 扩展名)。
    将这三个实体集(xhtml-lat1.ent、xhtml-special.ent 和 xhtml-symbol.ent)保存到与 DTD 相同的子目录中。

    下一步,需要创建 SGML 目录文件,PSGML 可以使用它来查找这些 DTD。

    在与这些 DTD 同一个目录下创建一个称为 xhtml1.soc 的文件。其内容应该类似于清单 3。

    有关“SGML 开放目录”(SGML Open Catalogs)的背景知识,请参阅参考资料。对于本文,我只解释在清单 3 中使用的一些特殊特性。PUBLIC 项将称为正式公共标识映射到文件系统实体(在本文这种情况下,该实体是包含各种 DTD 的文件)。这允许我们引用这些 DTD,而不必知道它们在文件系统中的实际位置。这些 DTD 需要文档有 <!DOCTYPE xxxxxx PUBLIC "yyyyy"> 文档类型声明,其中“xxxxx”与目录文件中的某一项匹配。PSGML 实际上不使用 DTDDECL 项,但是 SGML 解析器(仍在调整中)将使用这些项,并且这些项表明了 SGML 声明将使用具有相同正式公共标识的 DTD。

    最后,DOCTYPE 项允许我们引用特殊 DTD,而不需要使用正式公共标识或实际的文件名。这样做的缺点是,对于 XHTML,会有几个定义同一文档类型 html 的 DTD,因此必须从中选取一个。我只简单地选择最想使用的那个。在清单 3 中,选择了过渡的(transitional)DTD。请记住,只要包含全部 !DOCTYPE 声明,就可以使用任何 XHTML 文档类型。

    这里还需要做一些配置。PSGML 需要知道到哪里查找 SGML 目录文件。有几种方法可以实现这一点,这在 PSGML 文档中都有所描述。我利用环境变量 SGML_CATALOG_FILES 这种方法,因为 SGML 解析器也使用它(耐心一些,我将在本文的下一节讨论它)。那么,既然已经有了一组 DTD 和一个目录文件,现在创建前面提到的环境变量,并设置它为包含指向 xhtml1.soc 文件的路径,例如,d:\DTDs\xhtml1\xhtml1.soc。如果有多个目录文件,则可以把它们都包括进来,用路径定界符来分隔它们(在 Windows 上是“;”,在基于 UNIX 的系统上是“:”)。

    我将说明如何再添加一个 DTD 集:

    如果必要,为新的 DTD 创建子目录,例如 d:\DTDs\dita。
    下载当前的 DITA zip 文件。
    下载完毕后,使用您喜欢的实用程序将该分发版解压缩到 d:\DTDs\dita 中,再次声明:请保留目录信息。
    将所包含的目录文件添加到 SGML_CATALOG_FILES 环境变量中,因此,现在您的路径可能是 d:\DTDs\xhtml1\xhtml1.soc;d:\DTDs\dita\dtd\dita.soc。


    清单 4. dita.soc — DITA DTD 的 SGML 目录文件 OVERRIDE        YES

    -- For documents that don't include a DOCTYPE declaration --
    DOCTYPE topic "topic.dtd"
    --DOCTYPE topic "ditabase.dtd"--
    DOCTYPE task "task.dtd"
    DOCTYPE reftopic "reftopic.dtd"
    DOCTYPE concept "concept.dtd"
    DOCTYPE APIdesc "APIdesc.dtd"
    DOCTYPE bctask "bctask.dtd"

    -- There should probably be an entry here referencing the standard --
    -- XML SGML declaration for example SGMLDECL or DTDDECL  --
    -- (once we have public identifiers for the DTDs) --
               

    正如您所见,一旦初始设置完成,添加新的 DTD 相对比较容易。

    用 PSGML 编辑文档
    既然已经安装了带有 PSGML 的 Emacs,并且有了一组要使用的 DTD,则可以使用 PSGML 来开始编辑文档。每当编辑带有扩展名 .sgml 或 .xml 的文档时,您将注意到 Emacs 会调用 SGML 主方式(会在状态区中显示),菜单会变为图 2 所示的样子。

    图 2. 带 SGML 编辑方式的 Emacs 菜单


    到目前为止,如果编辑 .html 文档,则会调用原有的 HTML 主方式。过一会儿我会说明如何纠正它。同时,可以用 [Alt]-x,然后键入 xml mode 强制进入 xml 方式。

    要尝试使用 PSGML,先编辑一个称为 test.html 的测试文件,并插入 html 的开始和结束标记。

    <html>
    </html>


    调用 [Alt]-x,然后输入 xml mode,从而开启 XML 方式。下一步,单击菜单项 DTD->Info->General DTD Info。这会使 PSGML 解析 DTD,并在文档下面的缓冲区中显示常规信息。如果测试不成功,则在目录文件或环境变量中检查错误。这个测试还假设在 SGML 目录文件的其中之一包含 DOCTYPE html 项,以便于 PSGML 知道哪个 DTD 与文档类型“html”关联。另外,可以包含一个文档类型声明,例如, <!DOCTYPE html PUBLIC ...>,其中 PUBLIC 标识符要与某个 SGML 目录文件中的一项相匹配。如果目录和环境变量设置正确,则应该看到类似下列的输出:

               Doctype: html
          Element types: 89
               Entities: 253
    Parameter entities: 63
             Files used: d:/DTDs/xhtml1/xhtml-special.ent
                         d:/DTDs/xhtml1/xhtml-symbol.ent
                         d:/DTDs/xhtml1/xhtml-lat1.ent
                         d:/DTDs/xhtml1/xhtml1-transitional.dtd


    这个输出表明 PSGML 能够找到 DTD 并可以解析它,包括所有引用的实体模块。

    现在,PSGML 可以支持 DTD 了,您可以开始利用 PSGML 的一些更强大的特性。例如,将光标放在 <html> 标记后,并选择菜单项 Markup->Insert Element。这会显示一个元素列表,这些元素在文档中这个位置是有效的。然而在了解更多其它的编辑特性之前,先让我们完成更多的定制来加深对 PSGML 的了解。

    更多定制
    既然可以用 PSGML 来编辑文档,就让我们研究更多的定制,这会利用更多 PSGML 特性,使 PSGML 更易于使用。清单 5 显示了您可以附加到现有 Emacs 初始化文件中的更多定制。

    清单 5 中的第一部分告诉 Emacs,当装入带有特定扩展名的文件时,调用哪种主方式,这与 Windows 中根据文件类型关联应用程序的方法类似。请注意,这里我已经将 .htm 和 .html 文件设置成使用 xml 方式。这是因为实际上我正在编写 XHTML。

    清单 5 中接下来的四个部分将提供基于语法的突出显示表示法,在编辑器中,使不同标记构造以不同的颜色来表示。缺省情况下,PSGML 简单地定义标记用黑体显示,注释用斜体显示。这里,我将开始和结束标记设置成用蓝色显示,用紫色显示注释,用蓝色显示实体引用,用红紫色显示 PI 等。除了我修改的这部分结构外,您还可以定义被忽略的记号部分、记号部分的开始和结束以及简短引用的外观。这四部分的目的是:

    定义 face
    设置 face 的特征
    将 face 与特殊标记类型相关联
    激活设置

    清单 5 的下一部分 sgml-auto-activate-dtd 使装入文档时就解析与文档关联的 DTD。缺省情况下,由于处理需要,这被设置成假。随着处理器越来越快,不用再考虑此问题。同样,如果在最初装入文档时不将 sgml-auto-activate-dtd 设置为真,则直到显式地解析 DTD 时(使用 DTD->Parse DTD 菜单项或 [Ctrl]-c[Ctrl]-p 键组合),对语法的着色才生效。

    下一部分修改 DTD->Insert DTD 菜单项以允许您快速地向新文档插入 DOCTYPE 声明。我已经包含了各种文档类型,包括 SGML 和 XML 文档类型(一些被注释掉了)。请注意 XML 文档类型是如何包含 XML 声明。每当添加新的 DTD,可能想更新 sgml-custom-dtd 变量以将您的新 DTD 添加到 Insert DTD 菜单中。

    最后一部分定义了 my-psgml-hook,并与 SGML 方式挂接。这允许您根据正在编辑的文件启动缺省的浏览器。这在您编辑时,便于查看 HTML 和 XHTML。当浏览器完全支持 XML 和 XSLT 时,这将更加方便。

    PSGML 的快速测试运行
    既然您已经有了一些定制,那么让我们采用快速测试驱动以查看某些 PSGML 编辑特性。

    启动 Emacs,然后打开([Ctrl]-x[Ctrl]-f)test.html 文件。此时 Emacs 应该处于 XML 方式,可以查看状态行来验证是否处于 XML 方式。
    从菜单上选择 DTD->Insert DTD->XHTML 1.0 Transitional。这应该插入 XML 声明和带有缺省名“html”文档的 <!DOCTYPE html...> 声明。还要注意到对这两项语法的着色。
    下一步,将光标放在 DOCTYPE 声明后,并且从菜单上选择 Markup->Insert Element(或按 Shift 和鼠标右键)。您应该看见一个弹出菜单,该菜单列出了文档中这个位置上有效的元素,在这种情况下是 html 元素。请注意,当插入 HTML 元素时,同时还要插入元素 head 和 body。还会出现一个注释提示您必须插入 title 或 base 元素。这个特性是很方便的,直到您熟悉了特定的标记语言,到那时,可能会觉得这个特性让人烦,而不是有所帮助。可以通过在 Emacs 初始化文件中将 sgml-insert-missing-element-comment 变量设置为假来禁用这个提示。
    可以使用相同的技术来添加或修改属性:将光标放入开始标记内并从菜单上选择 Markup->Insert Attribute(或同时按 [Shift] 和鼠标右键)。弹出菜单显示了为选择的元素所提供的有效属性。从弹出菜单上选择一个属性。
    请注意,是如何根据元素嵌套来缩进结构的。如果在 body 中插入了 H1,它是不会缩进的。这是因为缺省设置不缩进混合内容元素(那些可以包含标记和文本的元素或 SGML/DTD 用法中的 PCDATA)。可以通过将 Emacs 初始化文件中的 sgml-indent-data 设置为真来更改这个缩进假设。在做这之前,要考虑空白在 XML 应用程序中是否很重要(请参阅参考资料)。
    如果已经安装了外部验证器,则请测试运行验证您的文档:选择 SGML->Validate,然后按 Enter(可能提示您保存文件)或按 [Ctrl]-c [Ctrl]-v,然后按 Enter。
    注:如果验证不起作用,则安装外部验证器(我将在下一节中讨论如何完成该操作)并在以后尝试该特性。如果验证起作用,则应该收到一个表示未完成“head”的错误。如果按 Ctrl-x`(请注意是反的单引号),会将您带至源文档中发生错误的行号。继续并插入 title 元素。

    使用 SP 或 OpenSP 进行 SGML 和 XML 验证
    虽然 PSGML 包含 SGML 解析器,但是它仍不是一个具有完整功能的解析器。但是,它确实提供了使用外部解析器来验证 SGML 和 XML 文档的能力。这允许您完全验证源文档以及例如,查找带 IDREF 的元素,其缺少相应的带一个匹配 ID 的目标元素。

    当从菜单调用 SGML->Validate,或在键盘上按 Ctrl-c Ctrl-v 时,PSGML 将启动一个 shell 进程以调用 SGML 解析器解来验证当前正在编辑的文件。它会在当前正在编辑的文件下的缓冲区中显示验证结果。如果遇到错误,则使用 Emacs [Ctrl]-x `(请注意是反的单引号),让 Emacs 带您到源文档中出错的位置。

    缺省情况下,它被配置成调用 nsgmls(SP 的一部分),SP 是最初由 James Clark 编写的 SGML 解析器。但现在已不再支持 SP,然而 SP 是 OpenSP 的基础,现在 OpenSP 是作为在 OpenJade 项目的一部分在 SourceForge.net 上维护。(有关 SP 和 OpenSP 的更多信息,请参阅参考资料。)可以下载并使用 SP 或 OpenSP。我选择使用 OpenSP,是因为当前有组织支持它,并且它包含对 SGML 目录的 DTDDECL 关键字的支持,然而 SP 不支持它(从 OpenSP 版本 1.4 开始支持 DTDDECL)。如果只处理 XML,则仅需要为 XML 定义的单个 SGML 声明。然而,如果您还将处理 SGML,则正在使用的 DTD 将可能引用其自身的声明。因为 PSGML 仅允许您指定一个要使用的特定 SGML 声明,通过 sgml-declaration(或者 XML 方式的 sgml-xml-declaration),就可以方便地使用 DTDDECL 目录特性了。最后一个要考虑的问题是,我无法找到针对 Windows 平台的 OpenSP 的二进制文件。因为 SourceForge.net 只维护源代码,所以您需要自己构建二进制文件或通过比我更努力的搜索来找到它们。

    使用 SP
    如果愿意使用 SP,所要做的是下载 SP(请参阅参考资料),解压缩该文件,并更新两个环境变量。您需要将 SP 所在的位置附加到 PATH 中,以便当 PSGML 调用 nsgml 时,可以找到 nsgml。假设将 SP 分发版解压缩到路径 d:\SP,则将需要将 d:\SP\bin 添加到 PATH 中。您还需要在 SGML_CATALOG_FILES 中添加一项,这样就可以找到 XML 的 SGML 声明了。如果在验证 XML 时,没有应用正确的 SGML 声明,则可能收到一些错误消息。这是因为 XML 不支持 SGML 的 OMITTAG 特性,该特性需要 DTD 指定最小化的信息(XML DTD 不包括这个信息,因为它需要所有标记)。我们再一次假设您在 d:\SP 中安装 SP,则 XML 的 SGML 声明将在 d:\SP\pubtext\xml.dcl 中,该文件会被 d:\SP\pubtext\xml.soc 引用(请参阅 SGMLDECL 项)。因此,只要简单地将 d:\SP\pubtext\xml.soc 添加到 SGML_CATALOG_FILES 中,nsgml 就可以找到这个目录。另外,您也可以在 Emacs 初始化文件中设置 Emacs/PSGML 变量 sgml-xml-declaration 以指向这个文件,如清单 6 所示。

    清单 6. _emacs — 让 SP 来验证 ; Note the forward slashes in the path!!!!
    (setq sgml-xml-declaration "d:/SP/pubtext/xml.dcl")

    使用 OpenSP
    如果希望使用 OpenSP,则需要对 PSGML 做一些略微的更改,但所有这些操作都可以通过使用 Emacs 初始化文件来完成。

    假设已经构建并安装了 OpenSP 或者找到预先构建好的二进制文件分发版,则要做的第一件事还是更新 PATH,这样就可以找到可执行文件了。假设 OpenSP 安装在 d:\OpenSP 中,那么需要将 d:\OpenSP\bin 添加到 PATH 中。请注意,可以同时安装 SP 和 OpenSP 这两者,并同时访问它们,因为已经重新命名了 OpenSP 中的可执行文件。

    需要完成的下一步操作是更新 Emacs 配置以改变用于验证的命令。这通常是通过设置 Emacs 变量 sgml-validate-command 来完成的,实际上,我们将设置该变量以处理在 sgml 方式下使用 OpenSp 的 onsgml 可执行文件进行验证的情况。然而对于 xml 方式,这似乎不能正确工作:当我在 Emacs 初始化文件中设置该变量时,sgml 方式应用了这个变化,但是 xml 方式却没有这样。可以通过提供方式挂接(mode-hook)来解决这个问题。这个目的是覆盖缺省的验证命令(该命令被定义成 nsgmls -wxml -s %s %s),将它设置成 onsgmls -wxml -s %s %s。清单 7 中的 Emacs 初始化代码片段就是负责完成这两个任务。

    您实际上不必理解是怎样使 PSGML 和 OpenSP 一起工作的。但是,如果您感兴趣,方式挂接基本上定义了一个初始化方式后将要调用的 Emacs 功能。这提供了一个机会,使您能够覆盖由那个方式建立的功能和设置。在这种情况下,因为验证命令硬连接在 PSGML 代码中,所以可以使用方式挂接来覆盖该设置,而不必修改 PSGML 代码并重新编译它(每次安装 PSGML 的新版本时,都需要完成该操作)。

    建议与提示
    一旦您了解我描述的这些基本功能,请尝试研究由 PSGML 给 Emacs 菜单栏中增添的每个菜单。

    在 SGML 菜单上,尝试 File Options 和 User Options,这些选项可以让您更好地理解在 PSGML 中可以定制什么。有关特殊设置的更多信息,请参考在线文档或查阅 PSGML 中的“Editing SGML with Emacs and PSGML”文档。在这个菜单中进行的更改只能在这个特定编辑会话期间有效。如果想作永久的更改,则必须更新 Emacs 初始化文件。
    Modify 菜单主要提供更改现有的标记的功能。这些功能中的一些,例如 Normalize,可以很容易地整理 HTML 并把它变成 XHTML。
    Move 菜单下的功能主要是允许更快地导航文档结构。
    Markup 菜单提供了对插入元素、标记、属性、实体等的菜单访问。我只想指出不很明显的两项。 Tag Region 使用 PSGML 的内部解析器来确定什么元素对于突出显示的位置有效,允许您将现有的文本包进元素中。 Insert Entity 允许您插入在 DTD 中定义的常规文本实体。如果在文本开始处的内部子集中定义了新的文本实体,将需要重新解析 DTD 以在编辑会话期间应用新定义的实体。
    View 下的各项是自说明的。
    我们已经涉及到了 DTD 菜单下大部分项。但是,Info 项还值得一提,因为如果还不熟悉 DTD,则它对研究您的 DTD是有用的。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    xml这门语言太好了,我们共同努力吧!!!!!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/11/13 14:54:00
     
     GoogleAdSense双子座1983-6-17
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DTD/XML Schema 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/29 17:04:06

    本主题贴数1,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  使用 Emacs 来编辑 XML 文档(22734字) - anchen0617,2004年11月13日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    93.750ms