1 TEI 的基礎架構 (Infrastructure)

本文譯自:http://www.tei-c.org/release/doc/tei-p5-doc/zh-tw/html/ST.html, 周邦信, 2011.10.25

本章描述本指引(Guidelines)所定義的 encoding scheme 的基礎架構。

它將介紹以下各章的概念架構,以及實做這個概念架構的方法。

它假設對於 XML 以及 XML schemas (參考 v. A Gentle Introduction to XML) 有一些了解,但也試圖讓任何使用者都易於使用這些指引。

其他各章提供進一步的技術細節,尤其是 第22章 Documentation Elements 描述表達 Guidelines 本身的 XML schema,第23章 Using the TEI 結合了關於修改和一致性議題的討論,以及 ODD 處理器的行為描述;對於試圖實做一個新的 TEI-based 系統的任何人來說,應該要閱讀這些章節。

TEI encoding scheme 由若干 modules (模組、組件) 所組成,每一個都宣告了一些特定的 XML elements(元素) 以及它們的 attributes(屬性)。

一個 element 的宣告部分包含了指定它到一個或多個 element classes (元素類別)。

另外部分定義它可能的 content(內容) 和 attributes,其中可能參照到一些 classes。

這種間接的做法讓 TEI 系統更強大、更有彈性。

依據某些特定的需求,elements 可以或多或少地自由地形成一個適當的 schema。

在 schema 裡增加一個新的 element 參照到現存的 class 或 element 也很簡單,或是將 schema 包含的任一個 module 所提供的一些 element 排除在外也是一樣。

原則上,一個 TEI schema 可以由任意的 modules 組成。

不過,某些 TEI modules 特別重要,除了例外情況外應該都要包含:本章所描述的 tei module 就是這種,因為它定義了所有其他 modules 都會用到的 classes、macros 以及 datatypes。

第3章 Elements Available in All TEI Documents 定義的 core module 所包含的 elements 以及 attributes 的宣告,在幾乎任何類型的文件都有需要用到,建議在所有用途中使用。

第2章 The TEI Header 定義的 header module 提供了構成 TEI Header 的 metadata elements 以及 attributes 的宣告,這是 TEI conformance 必須的元件,而 第4章 Default Text Structure 定義的 textstructure module 宣告了大部份書籍類型的物件都需要的基本結構 elements。

大部分的 schemas 需要 include 這四個 modules。

TEI schema 規格本身也是一個 TEI 文件,使用 22 Documentation Elements 所描述的 module 的 elements:我們非正式地稱呼這種文件為 ODD 文件,它來自於起初為本系統所制定的設計目標:「One Document Does it all」(一份文件全部搞定)。

維護及處理 ODD 文件的 stylesheets 由 TEI 維護,並且這些 Guidelines 也都是由這樣的文件來維護。

如同 23.4 Implementation of an ODD System 所進一步討論的,一份 ODD 文件可以經過處理後產生 schema,這個 schema 可以由目前廣泛使用的三種 schema 語言之中的任何一種來表達:XML DTD language、ISO RELAX NG language 或是 W3C Schema language,也可以產生像 Guidelines 這樣的說明文件,以及它們相關的網站。

本章大部分在描述 TEI infrastructure module 本身。

雖然在初次閱讀時它可能被跳過去,不過,了解這裡所提出的主題是不可或缺的,如果任何人想要完全發揮 23.2 Personalization and Customization 章節中所描述的客製化技術的話。

本章一開始先簡介 TEI scheme 中可用的 modules 的特性。

1.2 Defining a TEI Schema 概括描述,使用某種特定 schema 語言來構成 TEI schema 的方法,例如 XML DTD language、RELAX NG 或 W3C Schema。

接著是本章最大的部份,介紹 attribute 以及 element classes,它們用來定義 elements 以及它們的特性的分組 (1.3 The TEI Class System)。

最後,1.4 Macros 介紹 macro 概念,它用來表達一些常用的 content models (元素的內容模型),以及列出用來限制 TEI attributes 合法值範圍的 datatypes (1.4.2 Datatype Macros)。

TEI Modules

這些指引定義了用來標記任何種類文件的數百個 elements 以及 attributes。

每個定義都包含下列元件:

  • 一個散文體的描述
  • 一個正式宣告,表示式是由本指引所定義的專用 XML vocabulary 結合一些取自 ISO schema 語言 RELAX NG 的元素
  • 使用範例

這些指引的每一章都會呈現一群相關的 elements,並定義對應的宣告,我們稱之為 module。

所有的定義都會收集在附錄參照章節之中。

各章的正式宣告會依它們對應的 module 收錄在一起。

為了方便起見,每個 element 只被指派到一個 module,通常是使用在某個特定應用領域,或者支援某種特定用途。

一個 module 就只是一個便利的方式,把一些關聯的 element 宣告組合在一起。

簡單的情況下,一個 TEI schema 是由少數幾個 modules 結合在一起,如同底下 1.2 Defining a TEI Schema 所進一步描述的。

下表列出本指引目前版本所定義的 modules:

上面列出的每一個 module,當它被 include 在一個 schema 裡面的時候,可用的 classes、elements 以及 macros,在對應的章節裡都有完整的描述。

這些指引的其他章節將探索使用 TEI scheme 的其他面向。

定義一個 TEI Schema

要確認某個 XML 文件是 valid (相對於僅只是 well-formed),它的結構必須與一個 schema 核對,如同 v. A Gentle Introduction to XML 所討論的。

而一個 valid TEI 文件,這個 schema 必須是一個 conformant TEI schema ,如同 23.3 Conformance 進一步定義的。

地方性的系統可能允許它們的 schema 是不明確的,但對於交換的目的來說,一個文件關聯的 schema 必須是明確的。

這些指引建議的方法是明確提供或參照一個 TEI schema 規格,讓該文件可以被確認為有效 (validated)。

一個 TEI-conformant schema 是 TEI modules 的某個特定組合,可能包含為了修改 module 裡的 element 以及 attribute 宣告所做的額外宣告,例如禁止某些 elements,或對某些 elements 重新命名。

TEI 提供一個 application-independent 的方式來具體指定一個 TEI schema,方法是使用 22 Documentation Elements 所定義的 schemaSpec element。

相同的系統也可以用來指定一個擴充 TEI 的 schema,方法是明確增加新 elements,或參照其他 XML vocabularies。

上述的任一種情況,這個規格都可以經過處理產生一個正式的 schema,這個 schema 可以由某幾個特定的 schema 語言表達,例如 XML DTD language、RELAX NG 或 W3C Schema。

這些輸出的 schema 可以讓 validator (驗證器) 或編輯器等 XML 處理器用來 validate 或處理文件。

關於處理 TEI 正式規格的進一步資訊在 23 Using the TEI 提供。

簡單的客製化 (A Simple Customization)

對 TEI 架構的最簡單的客製化, 是僅包含上述4個建議的 module.

以 ODD格 式表示的 schema specification 如下:

<schemaSpec ident="TEI-minimal" start="TEI">
 <moduleRef key="tei"/>
 <moduleRef key="header"/>
 <moduleRef key="core"/>
 <moduleRef key="textstructure"/>
</schemaSpec>

這個 schema 規格包含四個 modules 的識別碼參照,由 moduleRef element 的 @key attribute 指定。

這個 schema 規格本身也被賦予了一個識別碼 (TEI-minimal)。

ODD 處理器可以從這些宣告的集合產生適當的 schema,使用 XML DTD 語言、ISO RELAX NG 語言、W3C Schema 語言,或者原則上任何適當強大的 schema 語言來表達。

產生的 schema 接著可以用幾種不同的機制關聯到某個文件,如同 v. A Gentle Introduction to XML 所進一步描述的。

文件透過 schema 進行 validate 的起點 (或 root element) 是由 @start attribute 所指定。

關於處理 ODD 規格的進一步資訊在 23.4 Implementation of an ODD System 提供。

大一點的客製化

這些指引會一個接一個介紹構成 TEI scheme 的每一個 module,為了更清楚的說明,每一章只專注在某個單一 module 裡面的 elements。

當然,在實務上,某個文本的標記會使用多個不同 modules 裡面的 elements,部分原因是文本由不同成分組成,部分原因是進行編碼標記的人(encoder)有不同的目的。

異質性的一些例子包括:

  • 一個文本可能是數種不同類型文本的匯集:例如,一個散文、韻文以及戲劇的文選;
  • 一個文本可能包含其他小一點的、內嵌的文本:例如,一個散文體記敍文裡包含的詩或歌。
  • 一個文本中的某些章節可能以某種體裁撰寫,其他章節又是不同體裁:例如,一本小說的一些章節是散文,其他章節的體裁是字典條目,還有一些是戲劇場景體裁;
  • 一個經過標記的文本可能包含詳細的分析註釋,例如修辭學或語言學上的特徵;
  • 一個經過標記的文本可能結合相同或不同來源的文字轉錄以及仿真版本(diplomatic edition);
  • 一個文本的描述可能需要額外專門的 metadata elements,例如要詳細描述手寫稿材料的時候。

TEI 提供的機制可以支持所有這些以及許多其他使用案例。

這個架構允許來自任意結合 modules 的 elements 以及 attribute 並存在一個單一的 schema 裡面。

特定的 modules 裡,elements 跟 attributes 被提供來支援文本的「granularity (粒度)」的不同觀點,例如:

  • 文集或叢書定義為一系列的 TEI 文件,分享一個共用的 TEI header (參照 15 Language Corpora)
  • 複合文本(composite texts)的定義,該文本可能結合由收集的文本組成的 front-matter 以及 back-matter,它們本身也可能是複合的 (參照 4.3.1 Grouped Texts)
  • 一個用來呈現內嵌文本的 element,一個敍述以「float」的方式出現在另一個裡面 (參照 4.3.2Floating Texts)

這些指引接下來各章將詳細描述適合這些以及許多其他有趣功能的標記構想(markup constructs)。

這些標記構想可以依照任何應用或專案的需求結合在一起。

例如,某個專案的目標是製作一個手稿材料珍藏的野心數位版,要包含每一個來源的詳細 metadata、內容的數位映像,連同每一個來源的詳細文字轉錄,以及一個支援的傳記、地理資料庫,這樣的專案可能需要由多個 modules 結合而成的 schema,如下:

<schemaSpec ident="TEI-PROJECT" start="TEI">
 <moduleRef key="tei"/>
 <moduleRef key="header"/>
 <moduleRef key="core"/>
 <moduleRef key="textstructure"/>
 <moduleRef key="msdescription"/><!-- manuscript description -->
 <moduleRef key="transcr"/><!-- transcription of primary sources -->
 <moduleRef key="figures"/><!-- figures and tables -->
 <moduleRef key="namesdates"/><!-- names, dates, people, and places -->
</schemaSpec>

或者,一個簡單些的 schema 可能用在這種專案的某個部分:例如準備文字轉錄的部分,可能只需要 coretextstructure 以及 transcr modules 裡面的 elements,可能傾向使用如下較簡單的 schema:

<schemaSpec ident="TEI-TRANSCR" start="TEI">
  <moduleRef key="tei"/>
  <moduleRef key="core"/>
  <moduleRef key="textstructure"/>
  <moduleRef key="transcr"/>
</schemaSpec>

除了簡單選擇 modules 之外,TEI 架構也支持更詳細的客製化。

一個 schema 可以從一個 module 之中禁止某些 elements,也可以禁止它們的某些 attributes,改變它們的名稱,甚至增加新的 elements 和 attributes。

這種方式的修改可能性在 23.2 Personalization and Customization 詳細討論,與它們的應用相關的 conformance 規則在 23.3 Conformance 討論。

任何 schema 語言都可以使用這些技能 (不過有些功能可能不是所有的語言都能用)。

ODD 語言也讓結合 TEI 和 non-TEI modules 至一個單一 schema 成為可能,它提供以 RELAX NG schema 語言來表示 non-TEI modules (進一步參照 22.6 Combining TEI and Non-TEI Modules)。

TEI 類別系統 (Class System)

TEI scheme 區別分類了大約 500個不同的 elements。

為了有助於理解、模塊化以及修改,這些 elements 大多數以某些方式正式分類。

Classes 被用來表達 elements 之間的兩種共同性。

屬於某一個 class 的 elements,可能共享某些 attributes,或者出現在某個 content model 的同一個地方。

一個 class 被稱為 attribute class,如果它的成員共享 attributes;它會被稱為 model class,如果它的成員出現在相同的位置。

任一種情況,這個 element 元素從它所屬的 class 繼承了它的特性。

Classes (這些 classes 的成員 elements 也會跟著一起) 也可以從其他 classes 繼承特性。

例如,假設 class A 是 class B 的成員 (或 subclass),class A 的任何成員 element 不只繼承 class A 所定義的特性,它們也會繼承 class B 定義的特性。

這種情況,我們也說 class B 是 class A 的 superclass (上層類別)。

一個 superclass 的特性會被它的 subclasses (下層類別) 的所有成員繼承。

強烈建議對於 TEI scheme 組織成的 classes 能有基本的了解,而且這對系統進行成功客製化也是不可或缺的。

屬性類別 (Attribute Classes)

一個屬性類別是把某些共享某些屬性的元素集合在一起.

屬性類別的名稱都是以「att.」開頭, 而且通常都是形容詞.

例如 att.canonical 這個類別的成員都有 @key 屬性和 @ref 屬性,

這是因為它們是該類別的成員而繼承得來的, 不必每個元素都各別定義這兩個屬性.

我們說, 這些屬性由 att.canonical 這個類別所定義, 或者說, 從 att.canonical 這個類別繼承得來.

如果要把某個元素加入 TEI 架構,而且這個元素也要有這兩個屬性,那麼,最簡單的方法便是把這個元素加入 att.canonical 這個類別。

同時,這種做法可以確保這些屬性都會以相同的方式定義,都會擁有相同的預設值...等等,不管它們是被附加到哪些元素上。

有一些屬性類別是在 tei 這個基礎組件(module)裏定義的,它們到處都可以使用。

另一些屬性類別則是在某個特定的組件裏定義,那就要在 schema 裏包含這個組件,才能使用這些類別。

一個屬性類別所提供的屬性,可能是直接在這個屬性類別裏定義,或者從另一個類別繼承得來。

例如,att.pointing.group 這個屬性類別為所有成員提供了 @domains 跟 @targFunc 這兩個屬性。

這個類別同時也是 att.pointing 的子類別,於是它的成員也從 att.pointing 繼承了 @type 跟 @evaluate 這兩個屬性。

於是,att.pointing 的成員有2個屬性,att.pointing.group 的成員則有全部4個屬性。

注意,有些組件(module) 會定義 某個已經存在的基礎類別 的上層類別(superclass)。

例如,全域屬性類別 att.divLike 提供了 @org、@part、@sample 這3個屬性,而 verse module 裏的 att.metrical 類別則提供了 @met、@real、@rhyme 這3個屬性。

因為 att.metrical 被定義為 att.divLike 的上層類別,att.divLike 的成員元素(element)都可以使用這6個屬性;當 verse module 被包含在 schema 裏面的時候,att.metrical 的宣告在 att.divLike 已經定義的3個屬性之外又增加了3個屬性。

如果這個 module 沒有被包含在 schema 裏面,那麼 att.divLike 就只提供那3個屬性。

屬於某個特定 module 的屬性不會在本章中說明,而是在與它相關的 module 裏說明。

有一個特殊的屬性類別叫做 att.global,它是所有 module 共用的,會在下一節中詳細說明。

全部屬性類別的完整列表在這裏

全域屬性 (Global Attributes)

下列屬性是為每一個 TEI 元素所定義的。

att.global 提供一組屬性,通用於 TEI 編碼標準中的所有元素。

任何一個 TEI element 都可以選用這些屬性,它們都不是必須的。

它們的用法在下面小節裏討論。

元素的識別碼及標籤 (Element Identifiers and Labels)

@xml:id 屬性的值必須是一個合法的 name,如同 World Wide Web Consortium's XML Recommendation 所定義的。

這表示它必須由字母或底線字元(‘_’)開頭,而且只能包含字母、數字、連字號、底線等字元。1

XML names (XML TEI 文件裏的 @xml:id 屬性的值也是) 的規則是區分大小寫的,所以 partTimeparttime 是兩個不同的 name,可以被用來指稱兩個不同的 element。(不過這可能不是聰明的做法)

如果兩個 elements 有相同的識別碼,可以驗證 XML 的解析器(parser)會通知語法錯誤。

下面就是一個 not valid 的範例:

<p xml:id="PAGE1"><q>What's it going to be then, eh?</q></p>
<p xml:id="PAGE1">There was me, that is Alex, and my three droogs, that is Pete, Georgie, ... </p>

關於為元素提供唯一識別碼的方法討論,請參考:3.10.2 Creating New Reference Systems

@n 屬性也可以為元素提供一個辨識名稱或數字,但是它不一定得是合法的 @xml:id 值。

它的值可以是由字元組成的任意字串;通常它是一個數字或其他類似的列舉值(enumerator)或標籤。

例如,一個編號清單 (numbered list) 的項目編號可以記錄在 @n 屬性裏;這樣就可以記錄底本的編號錯誤。

下面這個章節清單是由錯誤的原始文件抄寫過來的,其中 10號 被使用了兩次,而 11號則被忽略了:

<list type="ordered">
  <item n="1">About These Guidelines</item>
  <item n="2">A Gentle Introduction to SGML</item>
  <item n="9">Verse</item>
  <item n="10">Drama</item>
  <item n="10">Spoken Materials </item>
  <item n="12">Print Dictionaries</item>
</list>

@n 屬性也可以用來記錄文本中某些元素不一定是唯一(non-unique)的名稱,也可能同時提供一個供唯一的識別碼,如下例:

<div type="Book" n="One" xml:id="TXT0101">
  <!-- ... -->
  <div type="stanza" n="xlii">
  <!-- ... -->
  </div>
</div>

如上述,不一定要記錄 @xml:id 或 @n 屬性的值。

任何一個 XML 處理器都可以鑑定 XML 文件之中元素與元素之間的連續位置,不需要任何額外的標籤。

下面這個例子把一首長詩的每一行都明確地標上數字順序:

<l n="1"><!-- ... --></l>
<l n="2"><!-- ... --></l>
<l n="3"><!-- ... --></l>
<!-- ... -->
<l n="100"><!-- ... --></l>

這可能就是多餘的。

語言指示器 (Language Indicators)

@xml:lang 屬性指出某元素的內容可用的自然語言以及書寫系統。

如果它沒有被指定,那麼它的值會從最近的上層元素繼承下來。

以一個規則來說,最簡單的方式是在 TEI 元素上指定基本的語言(base language),讓大部份元素都可以取得預設的 @xml:lang 屬性值;語言與基本語言不同的元素才有需要明確指定所用的語言。

因此,建議在實務上能夠為 @xml:lang 屬性提供一個預設值,放在 TEI 根元素上,或者放在 teiHeader 以及 text 這兩個元素上。

在一些非罕見的案例中,TEI 文件裏的 text 元素所使用的語言,跟附加上的 TEI Header 不同,那麼上述的第二種做法是適當的。

來源中的其他語言轉變都應該儘可能明確指定,方法是在適當層級的元素上使用 @xml:lang 屬性。

下面的概要範例中,一個英文的 text 附加上一個英文的 TEI header:

<TEI xml:lang="eng">
  <teiHeader >
    <!-- ... -->
  </teiHeader>
  <text>
    <!-- ... -->
  </text>

</TEI>

在 header 跟 text 上都指定預設語言的效果一樣:

<TEI>
  <teiHeader xml:lang="eng">
    <!-- ... -->
  </teiHeader>
  <text xml:lang="eng">
    <!-- ... -->
  </text>
</TEI>

如果兩個不同的話,第二種做法就是必須的:

例如,一個英文的 header 被應用在一個法文的 text 上:

<TEI>
  <teiHeader xml:lang="eng">
    <!-- ... -->
  </teiHeader>
  <text xml:lang="fra">
    <!-- ... -->
  </text>
</TEI>

相同的原則可以用在任何階層層級之上。

下例中,text 的預設語言是法文,但是其中一個小節是德文:

<TEI>
  <teiHeader xml:lang="eng">
    <!-- ... -->
  </teiHeader>
  <text xml:lang="fra">
    <body>
      <div><!-- chapter one is in French --></div>
      <div xml:lang="deu"><!-- chapter two is in German --></div>
      <div><!-- chapter three is French --></div>
      <!-- ... -->
    </body>
  </text>
</TEI>

類似的情況,下例中 term 元素的 @xml:lang 屬性讓我們可以記錄這個技術術語是拉丁文而不是英文這個事實;q 元素就不需要指定 @xml:lang 屬性,因為它跟上層元素使用相同的語言。

<p xml:lang="en">The constitution declares <q>that no bill of attainder
or <term xml:lang="la">ex post facto</term> law shall be passed.</q>
...</p>

@xml:lang 屬性的值必須以某種特定的方式構成,使用標準清單之中的值。

進階參考:vi.1. Language identification

關於某個特定語言的額外資訊可以在 header 裏的 language 元素提供 (參考 2.4.2 Language Usage)。

呈現指示器 (Rendition Indicators)

@rend 屬性提供關於來源文本的實體呈現(physical presentation)資訊。

下例中,它被用來指出,被強調的詞「might」以及名稱「Bohemond」是以斜體字印刷的:

<p> ... Their motives <emph rend="italics">might</emph> be
pure and pious; but he was equally alarmed by his knowledge
of the ambitious <name rend="italics">Bohemond</name>, and
his ignorance of the Transalpine chiefs: ...</p>

如果全部或大部份 emph 以及 name 元素都是以斜體字呈現的,那麼在 TEI header 裏記錄這個事實會更方便 (使用下面討論的 rendition 元素),然後只針對呈現方式不同的元素指定 @rend 的值。

雖然 @rend 屬性的內容可以是任意文字,不過在某個專案裏,還是建議標記人員能採用一套標準語彙來描述文本的印刷或手寫樣式。

2.3.4 The Tagging Declaration 裡定義的 rendition 元素可以用來放這些描述,可以用自由文字表達,或採用某個正規語言。

然後一個 rendition 元素可以關聯到任何元素,可以是預設值,或者使用全域 @rendition 屬性。

例如:

<!-- 使用 CSS 定義斜體樣式 -->

<rendition xml:id="IT" scheme="css">font-style: italic</rendition>

<!-- 將 emph 以及 hi elements 的預設樣式設為斜體 -->

<tagUsage gi="emph" render="#IT"/>

<tagUsage gi="hi" render="#IT"/>

<!-- 指出某個特定的 p element 的樣式也是斜體 -->

<p rendition="#IT"/>

@rendition 屬性總是指到一個或多個 rendition 元素,每一個都定義文本原始格式的某種呈現方式。

這些細節可以使用正規語言來描述,例如 CSS (Lie and Bos (eds.) (1999)) 或 XSL-FO (Berglund (ed.) (2006));也可以使用某個為特定專案開發的正式語言;或使用非正式的變動散文。

雖然像 CSS 跟 XSL-FO 這樣的語言通常被用來描述文件如何輸出到螢幕或列印,他們仍然可以提供正式且精確的機制來描述許多來源文件的呈現,尤其是印刷文件,以及手寫文稿的許多方面。

例如,CSS 跟 XSL-FO 都提供機制可以描述字體、粗體(weight)以及斜體(style);字距及行距等等。

如果某個元素同時有 @rendition 跟 @rend 屬性,那麼 @rend 屬性總是會取得優先權。

@rendition 屬性就像 X/HTML 的 @class 屬性,它是參照到 Cascading Style Sheet 裏的樣式宣告。

而 @rend 屬性則像 XHTML 或 HTML 的 @style 屬性,它提供一個機制,在文件中使用到它的這個點,內嵌行內呈現資訊。

注意,不管哪種情況,TEI 屬性描述的是來源文件如何呈現,而不是希望輸出時如何呈現,雖然通常這兩者是密切相關的。

其他全域屬性

@xml:base 跟 @xml:space 這兩個全域屬性在任何 TEI schema 中也都預設會提供。

跟 @xml:id 一樣,這些屬性被定義為 XML 規格的一部份,並且屬於 XML namespace 而不是 TEI namespace。

我們不在這裡詳細描述它們:@xml:base 的參考資訊在 Marsh (ed.) (2001);@xml:space 請參考 section 2.10 of the XML Specification

如上述,@xml:base 被用來設定該元素範圍內的所有相對 URL 的基準 URL。

例如:

<body>
  <div xml:base="http://www.example.org/somewhere.xml">
    <p>...<ptr target="#p1"/>...</p>
  </div>
  <div>
    <p>...<ptr target="#p1"/>...</p>
  </div>
</body>

這裏的第一個 ptr 元素所在範圍的 div 有指定 @xml:base;它的目標會是 http://www.example.org/somewhere.xml#p1。

而第二個 ptr,所在範圍的 div 並沒有變更預設值,於是它的目標會是當前文件內某個 @xml:id 屬性值是 p1 的元素。

這個元素的第一步討論,以及它在 TEI 連結方法中的效果在 16 Linking, Segmentation, and Alignment 這章裡提供。

XML Recommendation 定義 whitespace 這個單詞代表了空白(space)、定位符號(tab)、換行符號(linebreak) 等可能在文件中出現的字元。

當這些字元在文件中以文字節點(text node)的內容(content)出現,XML 通常會把它們看做有意義的,而且要求處理器要將它們全部保留。

然而,當一個元素只包含 whitespace 以及其他元素,則期望這些在元素之間(而不是元素裡面)出現的 whitespace 字元是沒有意義的,而且可以被 XML 處理器忽略。

這當然不包含那些元素裏跟非 whitespace 的文字混合在一起的 whitespace 字元;這些必須被保留。

因此,類似如下的文件:

<list>
  <item>apple pie</item>
  <item>banana custard</item>
  <item>carrot cake</item>
</list>

第一個 item 跟第二個 item 之間的 whitespace,以及第二個和第三個之間,是沒有意義,而 item 元素裡的 whitespace 則是有意義的。

有些 XML 處理器,尤其是 XML 編輯器,可能在文件裡加進一些空白,讓它在顯示時更易於閱讀。

這樣的空白在正常情況下,應該只能加在那些沒有意義的地方,但是並非所有處理器都能可靠地偵測這件事。

大部份的 TEI 元素允許混合的內容,於是 TEI 文件裡的 whitespace 出現與否通常都是有意義的。

而對許多 TEI 結構元素(例如 divp) 來說,能夠使用沒有意義的 whitespace 卻也是很便利的。

於是,通常很少需要變更 whitespace 預設的行為,而這就是 xml:space 屬性的功能。

然而在少數的情況下它可能是不可或缺的,典型的情況是使用某個工具來處理負責複雜的標記,而這個工具為了增進文本的顯示效果而加入了一些 whitespace。

例如,當我們使用 11 Representation of Primary Sources 這一章談到的 elements 來謄寫一個碑文,一個英文單字可能會被加上好幾個額外的 tag 來標示這個單字已有或推測的部份。

這類的 tag 並不會打斷這個單字,但是如果在它們出現的地方加入 whitespace 就可能造成誤解了。

可能在上層 div element 的 @xml:space attribute 指定一個 preserve(保留) 的值,用來指出所有而且只有在 XML 來源中實際存在的空白應該被當做是有意義的;而 XML 編輯器或其他處理器則不允許在其中加入空白。

模型類別 (Model Classes)

如上述,某個 TEI model class 的成員分享共同的特性,這個特性讓它們可以出現在文件中相同的位置。

某個 TEI element 的 content model 儘可能的不直接以特定的 elements 表達,而是用特定的 model classes 間接表達。

這讓 content models 更簡單而且更易維持一致性;它也讓它們更容易理解和修改。

如同 attribute class,model class 也可以有下層類別或上層類別。

如同 element 從 class 繼承出現在文件中某個位置 (class 可以出現的地方) 的能力,上層類別可以出現的地方,下層類別的所有成員也都可以出現。

某個程度來說,這個類別系統提供了一個方法,將一大群 TEI elements 整理到一個簡潔的階層架構中。

不過並不完全都是如此。

實際上,一個由 element 組成的 class 的性質可以由兩個面向來看它:如前述,它定義這個 class 的成員在文件階層中允許出現的一些地方的集合;它也意味著某種方式的語義群組。

例如,一個很大的 class,它包含可以出現在段落之中的 element,這個 class 由許多其他 class 構成,這些 class 都有相同的結構特性,但在它們的應用領域是不同的。

有些是關於 highlighting,其他的可能是關於名稱或地點...等等。

某些案例中,「class 成員被允許出現的地點集合」的限制很大:例如,它可能只能在某個特定的 element 裡面,或只能在某個 class 的 element 裡面。

其他的案例中,element 可能允許出現在很多地方,或是超過一個「地點的集合」的地方。

這些因素反應在 model class 的命名方式上。

如果 model class 的名稱包含 part,例如 model.divPartmodel.biblPart,那麼它主要是由它的結構位置所定義的。

例如,可以出現成為 div 的內容的 elements (或由 elements 組成的 class) 構成了 model.divPart 這個 class;那些可以出現成為 bibl 的內容的則構成 model.biblPart 這個 class。

然而,如果 model class 的名稱包含 like,例如 model.biblLikemodel.nameLike,蘊含的意思是說它的成員都有一些額外的共同語義特性,例如包含書目描述,或包含某些形式的名稱。

這些 semantically-motivated class 通常提供了有用的方式把大的 structurally-motivated class 再做區分:例如,很常用的結構 class model.pPart.data (‘構成段落某部份的 data elements’) 擁有四個 semantically-motivated classes 成員 (model.addressLike, model.dateLike, model.measureLike, 以及 model.nameLike),最後的 model.nameLike 自己本身也是包含了許多成員的 superclass。

雖然大部份的類別都在 tei 這個基礎 module 中定義,不過因為 element 的宣告是在 module 裏面,某個 class 可能不能被 populated,除非某個特定的 module 有包含在 schema 裡面。

類別並不是「由上而下」宣告,而是從它的全體成員去取得個別的 element 宣告,從此取得它的所有成員。

同一個 class 可能會有不同的成員,這要看哪些 module 被啟用。

因此,某個 element 的 content model (由 model classes 表達) 也可能隨著不同的 module 被啟用而有所不同。

有些 class 只有一個成員,即使所有的 module 都被載入了。

宣告這種 class 的原因之一,是更容易客製化,方便在某個地方增加新的 element,尤其是在 TEI 沒有製作詳盡提案的區域。

例如,model.rdgLike 這個 TEI class,最初是空的,textcrit module 擴充它,只加入 TEI rdg element。

某專案如果希望新增一個不同的方式來處理 structuring text-critical information,便可以定義他們自己的 elements,然後把它們加到這個 class 裡面。

另一個宣告單一成員 class 的原因是,這個 class 的成員並不是所有文件都會用到,但它以 element 出現的地方很常用到。

例如,當 gaiji module 被加到 schema 的時候,g 這個元素被提供專門用來表達非 Unicode 字元或 glyph,而它是 model.gLike 這個 class 的唯一成員。

幾乎每一個 content model 都會參照到這個 class,因為允許出現文字的地方就應該允許出現 g;然而這些參照是無效的,除非 gaiji 這個 module 有被載入。

At the other end of the scale, a few of the classes predefined by the tei module are subsequently populated with very many members.

例如,model.pPart 這個 class 將所有可以出現在 p 或 paragraph element 裡面的元素的 class 合成一個群組。

core module 自己就在這個 class 增加了超過 50個 elements;namesdates module 增加了另外 20個,tagdocs module 也是。

既然 p element 是 TEI 文件的基礎材料之一,每個 module 都需要在它裡面增加 element 也就不奇怪了。

這個 class 系統提供了一個很方便的方法來控制產出一個複雜的結果。

典型的情況下,elements 不會直接加到這些很普遍的 class 裡,而是透過中介的 semantically-motivated class。

如同少數幾個 class 只有一個成員,也有一些 class 在 TEI 結構裡只被使用一次。

These classes, which have no superclass and therefore do not fit into the class hierarchy defined here, are a convenient way of maintaining elements which

are highly structured internally, but which appear from the outside to be uniform objects like others at the same level.2

這種 class 的成員只能出現在某個 element 裡面,或者某個 class 的 elements 裡面。

例如,model.addrPart 這個 class 只用來表達 address 這個 element 的 content model;它參照了一些其他 element 組成的 class,有一些可以出現在其他地方,有一些 elements 則只能出現在 address 裡面。

Basic Model Classes

TEI class 系統將 elements 分為以下三大部分:

divisions

高等級,可能自己套自己(self-nesting),文本的主要部份。這些 elements populate model.divLikemodel.div1Like 等 class。

chunks

例如段落或其他段落等級的 elements,可以直接出現在 texts 或 divisions 裡面,但是不能在其他 chunks 裡面。

這些 elements populate the class model.divPart,直接或透過類似 model.pLike (類似段落的 elements)、model.entryLike 等 class。

phrase-level elements

例如:被強調的片語、書名、或編輯勘誤等只能出現在 chunks (段落或段落等級的 elements) 裡面的 elements,但是不能出現在它們之間 (也就是不能直接出現在 division 裡面)。

這些 elements populate the class model.phrase3

The TEI identifies the following fundamental groupings derived from these three:

inter-level elements

例如 lists, notes, quotations 等 elements,它們可以出現在 chunks 之間 (成為 div 的 children) 或在 chunks 裡面;這些 elements populate the class model.inter

注意,這個 class 並不是 model.phrase 跟 model.chunk classes 的 superset,而是既像 chunk 又像 phrase 的 elements 合成的群組;the classes model.phrase, model.pLike, and model.inter are all disjoint.

components

可以直接出現在 texts 或 text divisions 裡面的 elements;這是上面定義的 inter- 跟 -chunk 等級 elements 的結合。

These elements populate the class model.common, which is defined as a superset of the classes model.divPart,model.inter, and (when the dictionary module is included in a schema) model.entryLike.

這些 elements populate the class model.common,它是被定義為 model.divPartmodel.inter 以及 (當 dictionary module 被包含在 schema 裡面的時候) model.entryLike 等 classes 的 superset。

大體上來說,一個 text 的 front、body 跟 back 各由一系列的 components 構成,或是再以 divisions 分成多個群組。

如前所述,某些 elements 跟 element classes 不屬於這些群組;不過,目前版本的 Guidelines 所定義的5百多個 elements,超過三分之二都以這種方式分類。

未來的版本將延伸、發展這個分類架構。

全部 model classes 的完整字母排序清單在這裡提供:Model Classes

巨集 (Macros)

本章所定義的 infrastructure module 也宣告了一些 macros,或者其他宣告中經常出現的部份的捷徑名稱(shortcut names)。

在 TEI 架構中 macros 以兩種方式被使用:代表經常遇到的 content model,或者 content model 的一部份 (1.4.1 Standard Content Models);以及,代表 attribute datatypes (屬性資料型態,1.4.2 Datatype Macros)。

Standard Content Models

TEI schema 儘可能使用下列經常遇到的 content model,以助於達到不同 element 之間的一致性。

macro.paraContent (段落內容) 定義段落與類似元素的內容。

macro.limitedContent (段落內容) 定義散文元素的內容,該元素未用於轉錄現存資料

macro.phraseSeq (詞組序列) 定義一連串文字資料與詞組層次元素。

macro.phraseSeq.limited (限定詞組序列) 定義一連串文字資料與詞組層次元素,通常不用於轉錄現存文件。

macro.schemaPattern 配合所選擇的模型語言中的元素的模式

macro.specialPara (「特殊」段落內容) 定義元素的內容模型,如註解或列表項目,這些內容模型包含一系列組合性層次元素,或與一個段落有相同的結構,包含一系列的詞組層次或inter-層次元素。

macro.xtext (擴充文件) 定義一連串文字資料與缺字元素。

《TEI 指引》的目前版本包含了大約500個不同的 elements。

下表顯示最常用到的 7個 content models。

Datatype Macros

TEI schema 的 attributes 所能持有的值,大部分定義為參照到一個 TEI datatype

每一個這樣的 datatype 由其他原始 datatypes 所定義,大部分來自於 W3C Schema Datatypes,literal values,或其他 datatypes。

這種間接的方式讓 TEI 的應用可以對全部或針對各別的案例設定限制,經由重新定義 datatype,或者各別重新定義對於 datatype 的參照。

在某些案例中,TEI datatype 包含現存 schema 語言無法強制的額外使用限制,然而,一個 TEI-compliant 的處理器應該試圖去驗證它們 (進一步的討論請看 23.3 Conformance)。

當在 datatype 的定義裡面使用 literal values 或 name tokens 的時候,有一個關聯的清單提供重要的建議值,或者 (在封閉式清單的情況下) 全部可能的值。

TEI 定義的 datatypes 可以分成幾個群組:定義 數量、機率 或 時間表示式 正規化的值(normalised values);定義不同種類的 shorthand codes 或 keys;定義 pointers 或 links。

下列 attributes 使用的 datatypes 是要持有各種正規化的值。

首先是數量或機率的表示式:

data.certainty 定義表示正確度的屬性值範圍

data.probability 定義表示可能性的屬性值範圍

data.numeric 定義用於數值的屬性值範圍

data.count 定義的屬性值範圍,用於作為總數的非負整數值

使用 data.probability datatype 的 attributes 例子包括 damage(損毁) 或 certainty(確定) 的 @degree;data.numeric 的例子包括 att.measurement class 成員的 @quantity,或 numeric 的 @value;data.count 的例子包括 cell 以及 table 的 @cols。

其次,這些 attributes 所使用的 datatype 是要持有正規化的日期或時間、時間的持續期間,或真假值:

data.duration.w3c 以 W3C datatypes 標準格式來定義表示一段持續性時間的屬性值範圍

data.duration.iso 以 ISO 8601 標準格式定義表示一段持續性時間的屬性值範圍

data.temporal.w3c 定義表示時間的屬性值範圍,如日期、時間或兩者的結合,依照 W3CXML Schema Part 2: Datatypesspecification 標準所定義。

data.temporal.iso 定義該系列表示時間的屬性值,例如日期、時間或兩者的組合,需符合國際標準 Data elements and interchange formats – Information interchange – Representation of dates and times

data.truthValue 定義的屬性值範圍表示一個可能未知的真實值

data.xTruthValue 定義的屬性值範圍表示一個可能未知的真實值

data.language 定義的屬性值範圍標明人類語言與寫作系統的特殊結合

data.sex 定義的屬性值範圍用以識別人類或動物的性別

注意這些案例之中,每一個所使用的值都是現存國際所建議的:時間期間、時間、日期的案例中的 ISO 8601 as profiled by XML Schema Part 2: Datatypes Second Edition;真假值案例中的 W3C Schema datatypes;語言案例中的 BCP 47;以及性別案例中的 ISO 5218。

下列 datatypes 有更專門的用途:

data.outputMeasurement 定義的屬性值範圍說明預定呈現在網路上之物件大小

data.namespace 定義的屬性值範圍指出 XML 名稱空間,由 XML technical recommendation 中的 W3C 名稱空間所定義。

data.pattern (regular expression pattern) 定義的屬性值範圍以固定方法表示

data.point defines the data type used to express a point in cartesian space.

data.pointer 定義的屬性值範圍提供單一指標,連結到其他位於目前文件或他處的資源

data.version 定義的屬性值範圍可用於指定 TEI 版本編號。

目前為止,TEI attributes 的值最多的是某種 coded values 或名稱。

這些值可以用幾種不同方式來限制或定義它們,每種都有一個不同的名稱,如下:

data.key 定義的屬性值範圍以隨機識別碼來表示一個編碼值,該識別碼通常來自一組外部定義的可能性

data.word 定義的屬性值範圍表示一個單字或代號

data.name 定義的屬性值範圍以XML名稱或識別符碼表示

data.enumerated 定義的屬性值範圍以單字或代號呈現,該單字或代號出自於一份紀錄所有可能性的列表

data.code 定義的屬性值範圍表示一個編碼值,以指標指向其他包含該編碼值的元素

att.canonical class 所提供的 @key 目前是唯一型態為 data.key 的屬性。

它用來提供一個外部定義的識別碼(identifier),例如資料庫的 key 或檔名。

因為這些識別碼是外部定義的,它們的值沒有限制:任何 Unicode 字元組成的字串都可以使用。

它們的值的任何限制,例如某個特定系統有效的 database key 的組成規則,可以在 TEI Header 裏用 tagUsage 這個 element 來說明,但是這裏所定義的 datatype 並沒有強制一定要這麼做。

像這樣和某特定系統相關的限制,也可以使用 23.2 Personalization and Customization 裡面所描述的客製化技巧,把這些限制加到 TEI schema 裡面。

型態為 data.word 的屬性,例如 person 元素的 @age 屬性,被用來提供一個以單一 token 或 word 表示的 ID。

TEI 為這種用途的字元做了一些限制:只有字母(letters)、數字(digits)、標點(punctuation characters)或符號(symbols)等 Unicode 字元才可以出現在這種 attribute 的值裡面。

要特別注意的是,這種值裡面不能包含 whitespace 字元。

合法的值包括「cholmondeley」、「été」、「1234」、「_content」或「xml:id」,但是「grand wazoo」就不行了。

這類的 attributes 有時用於關聯(經由交互參照)到不同類型的 elements。

型態為 data.name 的 attributes 也是上述意義的 words,但是它們多了額外的限制,它們必須是合法的 XML identifier,如 XML 1.0 specification 或之後版本所定義的。

因此,它們不能由數字或標點字元開頭。

合法的 identifiers 包括 「cholmondeley」、「été」、「e_content」或「xml:id」,但不能是「grand wazoo」或「1234」。

這種 attributes 的典型用法是用來代表 XML element 或 attribute 的名稱。

型態為 data.enumerated 的 attributes,例如 shift 元素的 @new 屬性,或 att.editLike 提供的 @evidence 屬性,跟上面的 data.word 定義一樣,再加上一個限制,它所提供 word 必須來自於某個特定的可能值清單。

包括該屬性定義的 element 或 class 規格也包含了一個可能值清單,以及它們的意義描述。

這個清單可以是開放的 (這種情況下該清單是建議值),或是封閉的 (這種情況下,它決定了合法值的範圍)。

後者的情況,datatype 就不是 data.enumerated,而是一個可能值的明確清單。

型態為 data.code 的 attributes 在功能上是類似的,它們都提供了在別的地方有更詳細定義的屬性值編碼名稱。

不過在這個案例中,完整的定義由另一個 XML element 的內容提供,典型但非必須的情況是在同一個文件裡面,而且它是由一個 pointer 所參照。

一個 attribute 當然可以有某個型態的多個值,例如 pointer values 的清單,或者 words 的清單。

在 TEI scheme 裡面,這個資訊是被看做用來說明該 attribute 的 datatype element 的 property,而不是當做一個不同的 ‘datatype’。

進一步請看 22.4.5.1 Datatypes

The TEI Infrastructure Module

本章所定義的 tei module 是任何 TEI schema 所必需的元件。

它提供了所有 datatypes 的宣告,以及 TEI scheme 裡面的其他 modules 所用到的 attribute classes、model classes 以及 macros 的初始宣告(initial declarations)。

它的元件以字母排序如下:

組件 tei: 所有TEI模組可用的元素集、資料類型、巨集指令之宣告

在 infrastructure module 裏的宣告次序是緊要的,因為好幾個 class 宣告參照到其他宣告,那麼這些宣告就必須放在前面。

其他宣告次序的限制是來自於,TEI scheme 的模塊化(modularity) 是由不同的 schema 語言實做出來的。

The XML DTD fragment implementing this TEI module makes extensive use of parameter entities and marked sections to effect a kind of conditional construction; the RELAX NG schema fragment similarly predeclares a number of patterns with null (‘notAllowed’) values.

這些議題會在 23.4 Implementation of an ODD System 章節中進一步討論。