XML 基础
CSL 是基于 XML 的,如果你不熟悉 XML,本章将带你了解编辑 CSL 样式及其本地化文件所需的 XML 基础知识。
标记语言
「标记语言」是计算机领域中的概念,抛开晦涩的概念定义,我们的书面语言其实就是使用标记的语言。我们会用逗号、句号、感叹号等标点符号来标记句子的停顿和结束,用括号来标记补充信息,用引号来标记句子中引用的内容。在标点符号的帮助下,连续的信息变得富有层次,无声的字符也能表示丰富的语气。
在其他场景中,学生们使用不同颜色的荧光笔来标记文本的不同内容,语言学家们使用成分符号来标记句子的语法成分(如主语、谓语、宾语等),编辑们使用校对符号来标记对文本的修订行为(如删除、添加、替换等)……
标记语言将信息记录为结构化的文本,从而使得计算机能够识别和处理这些信息。
XML
XML(eXtensible Markup Language)是一种广泛使用的标记语言,结合下面的例子来看看 XML 的基本结构。
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- 这是一个注释 -->
<root>
<child-one>
<child-two attribute="属性" />
</child-one>
<child-tone />
</root>
下面,我们将逐行介绍这段代码。
- 第一行称为声明,或者称为序言,总是在文档的最前面。包括了 XML 的版本、编码信息以及是否依赖外部文档等。实际编写 CSL 样式时,我们遵从的是同一套规则,只需从现有的样式文件中原封不动抄写这一行即可。
- 第二行是 XML 文档的注释,格式为
<!-- 注释内容-->
。注释的位置比较自由,但需要单独成行。你可以在某一段代码上方概括下一段代码的主要作用。 - 剩下的代码为 XML 文件的主体部分,它由根元素及内部若干个子元素构成。
上面的代码中,最明显的是像「 <xxx>
」这样的内容,它就是 XML 的「标签」。作为一种通用的标记语言,XML 中要表示许许多多的成分,标签就像注明了名称的括号,一方面像括号一样选定一段内容,另一方面又通过它的名称来指示这是一段什么内容。相比上一节 XML 基础 中的例子,读者在不知道标签具体定义的情况下仅凭标签名就能大致推测该标记的含义,而且使用命名来区分标记也使标记不再局限于有限的标点符号,提高了标记的可读性和拓展性。
元素就是被标签标记起来的一块内容,一个 XML 文档必需有一个唯一的根元素(如例子中的 root
元素),根元素包含其他所有元素。当然,其他元素内也可以有子元素。例子第一个 child-one
元素内有其他元素,因此它是一个「开放」的元素,以开始标签<child-one>
和 结束标签 </child-one>
标记范围(正如括号那样需要成对使用);而第二个 child-tone
元素没有子元素,因此它是一个「闭合」的元素,在同一个标签上开始和结束(正如逗号那样单独使用)。
属性写在标签名后,是对元素及其内容的描述,属性名和属性值之间用 =
隔开,属性值使用双引号 "
包裹。每个元素中,一个属性最多出现一次,一个属性只能有一个值。
值得注意的是,标签已经使用空格作为标签名和属性之间的分隔符,标签名和属性名中不允许使用空格(否则会引起歧义)。我们通常使用「烤串命名法」(kebab case)来命名标签名和属性名,即使用 -
来分隔一系列小写单词,如 child-one
、attribute-one
。
实体
在上一节我们了解到,XML 文档是由声明、元素和注释组成的,大量使用了 <
和 >
等字符,为了避免歧义,在确实需要表达类似这样的字符时,需用名为「实体」的代码来代替。
所定义的实体 | 所代表的字符 |
---|---|
< | < |
> | > |
" | " |
' | ' |
& | & |
<Para1>John asked "What's your name?"</Para1>
中间的结果:
John asked "What's your name? "