本記事は生成AIと共同で執筆しています。事実関係は可能な範囲で公式ドキュメント等と照合していますが、誤りが含まれている可能性があります。重要な判断を行う前にご自身でも一次情報をご確認ください。
対象:TEI/XML を触り始めて、ODD・XSLT・Processing Model の関係を整理したい方。XSLT や ODD を一から書ける必要はありません。
TEI/XML(Text Encoding Initiative。人文学のテキストを構造化するための国際標準)を使い始めると、ODD・XSLT・Processing Model という3つの言葉に出会います。どれもファイルやスクリプトの形で登場するため、「結局どれを書けばよいのか」「どれかを選ぶものなのか」が分かりにくいところです。
この3つは二者択一の関係ではなく、それぞれ別の仕事を担当します。本記事では、最小限の例を使って3つの役割と関係を整理します。
3つの役割を一枚で
先に結論を表にします。
| 名前 | 何をするもの | 主な成果物 |
|---|---|---|
| XSLT | XML を別の形式に変換する | HTML / PDF / 別の XML など |
| ODD | TEI のどの要素・属性を使うかを定義する | スキーマ+仕様書 |
| Processing Model | ODD の中に「各要素の描画方法」を宣言する | (processor 経由で)HTML など |
混同を避けるうえで大事なのは、XSLT と ODD は別レイヤーで、Processing Model は ODD の一部だという点です。関係を整理すると入れ子になります。
ODD ファイル(.odd = 中身は TEI XML)
├── スキーマ定義部 …… どの要素・属性が正しいか
└── Processing Model 部 …… 各要素をどう描画するか(<model> 要素)
XSLT ファイル(.xsl)…… ODD とは独立。変換処理を書く
以下、それぞれを順に見ていきます。例として、次のような簡単な TEI/XML があるとします。
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<teiHeader><!-- 書誌情報など --></teiHeader>
<text>
<body>
<p><persName type="person">夏目漱石</persName>は
<placeName>松山</placeName>に滞在した。</p>
</body>
</text>
</TEI>
XSLT — TEI を別の形式に変換する
XSLT(XSL Transformations)は、XML を別の形式に変換するための W3C 標準言語です。TEI/XML はそのままではブラウザで読みやすい形にならないため、HTML へ変換する用途でよく使われます。
たとえば TEI の <persName>(人名)を HTML の <span> に変換するなら、次のようなテンプレートを書きます。
<xsl:template match="tei:persName">
<span class="person">
<xsl:apply-templates/>
</span>
</xsl:template>
要素ごとに「これが来たら、こう出力する」というルールを並べていく、というのが XSLT の書き方です。XSLT には 1.0 / 2.0 / 3.0 のバージョンがあり、1.0 は xsltproc、2.0 以降は Saxon などのプロセッサで実行します。
XSLT は変換ルールを自分で書く方式です。自由度が高い反面、出力フォーマットの数だけ(HTML 用、PDF 用…)スタイルシートを保守することになります。
ODD — 使う要素と属性を定義する
ODD は "One Document Does it all" の略で、TEI の「カスタマイズ」を記述するためのものです。中身は TEI XML で書きます。
TEI には数百の要素が定義されていますが、ひとつのプロジェクトでそのすべてを使うことはまずありません。「この資料では <persName> と <placeName> と <date> だけ使う」「<persName> の @type には person だけ許す」といった取り決めを書く場所が ODD です。
ODD からは次の2つを生成できます。
- スキーマ(RELAX NG など)。XML がこの取り決めに沿っているかを機械的に検証できる
- 仕様書。どの要素をどう使うか、というプロジェクトのルール文書
たとえば「<persName> の @type は person か place のどちらかに限る」という制約は、ODD では次のように書きます。
<elementSpec ident="persName" mode="change">
<attList>
<attDef ident="type" mode="change">
<valList type="closed">
<valItem ident="person"/>
<valItem ident="place"/>
</valList>
</attDef>
</attList>
</elementSpec>
こう書いておくと、<persName type="prson"> のようなタイポがスキーマ検証で弾けます。散文のマニュアルに「type は person か place で」と書くのと違い、機械が強制してくれるのが ODD の値打ちです。
ODD の処理には、ブラウザで使える ODD エディタの Roma や、TEI Stylesheets のコマンド群を使います。
ここで注意したいのは、ODD は HTML を作らないという点です。ODD が決めるのは「何が正しい XML か」であって、表示用の出力ではありません。表示は XSLT か、次に説明する Processing Model の担当です。
Processing Model — ODD の中に描画方法を書く
Processing Model(処理モデル)は、ODD の中に「各要素を出力時にどう描画するか」を宣言する仕組みです。別ファイルでも別技術でもなく、ODD の <elementSpec> の中に <model> 要素を足したものです。
ODD のスキーマ定義部が「何が正しい XML か」を決めるのに対し、Processing Model 部は「その要素をどう見せるか」を決めます。
<elementSpec ident="persName" mode="change">
<model behaviour="inline">
<outputRendition>font-weight: bold;</outputRendition>
</model>
</elementSpec>
behaviour の値は、あらかじめ定められた語彙から選びます。標準では次の26種類が用意されています。
| behaviour | 役割 |
|---|---|
alternate | 複数の候補を切り替えて表示する(校訂の sic/corr など) |
anchor | 本文中の位置を指し示すアンカー点 |
block | 段落のように改行を伴うブロック |
body | 文書の本文領域 |
break | 改ページ・改行などの区切り |
cell | 表のセル |
cit | 引用(引用文と出典のまとまり) |
document | 文書全体 |
figure | 図 |
glyph | 字形・特殊文字 |
graphic | 画像 |
heading | 見出し |
index | 索引項目 |
inline | 行内に流し込む要素 |
link | リンク |
list | リスト |
listItem | リストの項目 |
metadata | メタデータ(通常は表に出さない書誌情報など) |
note | 注 |
omit | 出力しない(省略する) |
paragraph | 段落 |
row | 表の行 |
section | 章・節などのまとまり |
table | 表 |
text | 文字列そのもの |
title | タイトル |
behaviour のデータ型自体は開かれていて、processor が独自の behaviour を追加することもできますが、標準として推奨されるのはこの26種類です。predicate 属性を使えば「@type が person のときだけこの描画」のように条件分岐もできます。
ここに書いた描画指示は、Processing Model に対応した processor(代表例は TEI Publisher)が読み取り、HTML などを生成します。XSLT を一から書く代わりに、ODD に宣言だけ書く、というのが Processing Model の発想です。
XSLT と Processing Model の使い分け
XSLT と Processing Model はどちらも「TEI を HTML などに変換する」ための手段なので、ここが一番混同しやすいところです。おおまかな目安は次の通りです。
| XSLT を直接書く | Processing Model を使う | |
|---|---|---|
| 書き方 | 変換ルールを手続き的に記述 | ODD に宣言的に記述 |
| 自由度 | 高い(どんな出力でも書ける) | behaviour の語彙の範囲内 |
| 向く場面 | 凝ったレイアウト、特殊な版面の再現 | 一般的な構造の文書、複数フォーマット出力 |
| 学習コスト | XSLT の習得が必要 | ODD と behaviour 語彙の理解 |
Processing Model は決まった語彙で宣言するぶん、複数の出力フォーマット(HTML・PDF・EPUB など)を一度の記述でまかなえます。一方、behaviour の語彙は文書の構造的な意味(これは段落、これは見出し)を表すものなので、見た目を細かく作り込む変換には向きません。そうした場合は XSLT を手で書くほうが素直です。調査した限りでは、版面を忠実に再現するような用途では XSLT が選ばれることが多いようです。
典型的なワークフローは次のようになります。
- ODD を書いて、プロジェクトで使う要素・属性を決める(あわせてスキーマを生成する)
- その ODD でデータ(TEI/XML)を検証しながら符号化する
- 表示用の変換は、一般的な構造の文書なら Processing Model、凝った見た目が必要なら XSLT で行う
よくある誤解
- 「ODD は XSLT の代わりになる」… なりません。ODD はスキーマと仕様書のためのもので、HTML を作るのは XSLT か Processing Model です。
- 「Processing Model は ODD とは別物」… 別物ではなく、ODD の一部(
<elementSpec>の中の<model>要素)です。 - 「TEI を使うなら ODD が必須」… 必須ではありません。全要素入りのスキーマ(TEI All)でも検証はできます。ODD はプロジェクト固有のルールを明示・強制したいときに効きます。
3つの関係をもう一度まとめると、ODD が「使ってよい部品の定義」、Processing Model が「ODD の中に書く描画の宣言」、XSLT が「ODD とは独立した変換処理」です。役割の違うレイヤーだと捉えると、混同しにくくなります。
動画版(生成AIによる自動生成): 本記事の内容を、2キャラクターの掛け合い形式の解説動画にまとめています。VOICEVOX による音声合成で構成しており、自動生成のため内容に誤りが含まれる可能性があります。正確な情報は記事本文をご参照ください。



コメント
…