TEI ODDの「チェーン」機能を使ってスキーマをカスタマイズする方法を学ぶチュートリアルです。
ODD Chainとは
ODD chainには2つの方式があります:
1. 継承型(縦のチェーン)
source属性で親ODDを参照し、カスタマイズを継承します。
TEI_all → ベースODD → 派生ODD → さらなる派生...
2. 組み合わせ型(横のチェーン)
specGrpとspecGrpRefを使って、複数のODDを統合します。
ヘッダー用ODD ─┬─→ 統合されたスキーマ
本文用ODD ─────┘
フォルダ構成
tutorials/
├── 01-inheritance/ # 継承型の例
│ ├── base.odd # ベースとなるODD
│ └── derived.odd # base.oddを継承する派生ODD
├── 02-chain/ # 組み合わせ型の例
│ ├── header-specs.odd # ヘッダー関連のカスタマイズ
│ ├── text-specs.odd # 本文関連のカスタマイズ
│ ├── main.odd # 統合用メインODD
│ └── merge-specs.xsl # specGrpRefを展開するXSLT
├── output/ # 生成されたファイル
│ ├── base.rng # 01のベースODDから生成
│ ├── base.html # 同上のHTMLドキュメント
│ ├── derived.rng # 01の派生ODDから生成
│ ├── derived.html # 同上のHTMLドキュメント
│ ├── combined.rng # 02の統合ODDから生成
│ ├── combined.html # 同上のHTMLドキュメント
│ └── intermediate/ # 中間ファイル
│ ├── base.compiled.odd
│ ├── derived.compiled.odd
│ ├── combined.merged.odd
│ └── combined.compiled.odd
├── build.sh # ビルドスクリプト
└── README.md # このファイル
前提条件
- Saxon(XSLT 2.0プロセッサ)
- TEI Stylesheets(
../scripts/Stylesheetsにインストール済み)
ビルド方法
cd tutorials
./build.sh
生成されるファイル
| ソースODD | RNG | HTML |
|---|---|---|
| 01-inheritance/base.odd | output/base.rng | output/base.html |
| 01-inheritance/derived.odd | output/derived.rng | output/derived.html |
| 02-chain/main.odd(統合後) | output/combined.rng | output/combined.html |
各ファイルの説明
01-inheritance(継承型)
base.odd
ベースとなるODD。最小限のモジュールと基本的なカスタマイズを含む。
schemaSpec ident="baseSchema" start="TEI" source="tei:4.7.0">
moduleRef key="tei"/>
moduleRef key="header"/>
moduleRef key="core"/>
moduleRef key="textstructure"/>
schemaSpec>
derived.odd
TEI標準を継承し、追加のカスタマイズを行う派生ODD。
schemaSpec ident="derivedSchema" start="TEI" source="tei:4.7.0">
elementSpec ident="note" mode="delete"/>
elementSpec ident="p" mode="change">
attList>
attDef ident="rend" mode="change">
valList type="closed">
valItem ident="indent"/>
valItem ident="center"/>
valList>
attDef>
attList>
elementSpec>
schemaSpec>
02-chain(組み合わせ型)
header-specs.odd
ヘッダー関連のカスタマイズをspecGrpで定義。
specGrp xml:id="header-customizations">
elementSpec ident="titleStmt" mode="change">
elementSpec>
specGrp>
text-specs.odd
本文関連のカスタマイズをspecGrpで定義。
specGrp xml:id="text-customizations">
elementSpec ident="p" mode="change">
elementSpec>
specGrp>
main.odd
複数のODDをspecGrpRefで参照して統合。
schemaSpec ident="combinedSchema" start="TEI" source="tei:4.7.0">
moduleRef key="tei"/>
moduleRef key="header"/>
moduleRef key="core"/>
moduleRef key="textstructure"/>
specGrpRef target="header-specs.odd#header-customizations"/>
specGrpRef target="text-specs.odd#text-customizations"/>
schemaSpec>
処理の流れ
継承型
base.odd
↓ odd2odd.xsl (コンパイル)
intermediate/base.compiled.odd
├─→ odd2relax.xsl → base.rng
└─→ odd2html.xsl → base.html
derived.odd (source="tei:4.7.0")
↓ odd2odd.xsl (コンパイル+継承解決)
intermediate/derived.compiled.odd
├─→ odd2relax.xsl → derived.rng
└─→ odd2html.xsl → derived.html
組み合わせ型
header-specs.odd ─┐
│ merge-specs.xsl
text-specs.odd ───┤ (specGrpRef展開)
│
main.odd ─────────┘
↓
intermediate/combined.merged.odd
↓ odd2odd.xsl
intermediate/combined.compiled.odd
├─→ odd2relax.xsl → combined.rng
└─→ odd2html.xsl → combined.html
使用しているXSLT
| XSLT | 場所 | 役割 |
|---|---|---|
| odd2odd.xsl | Stylesheets/odds/ | ODDのコンパイル(モジュール展開、継承解決) |
| odd2relax.xsl | Stylesheets/odds/ | RelaxNGスキーマ生成 |
| odd2html.xsl | Stylesheets/odds/ | HTMLドキュメント生成 |
| merge-specs.xsl | 02-chain/ | specGrpRef展開(自作) |