TEI ODDの「チェーン」機能を使ってスキーマをカスタマイズする方法を学ぶチュートリアルです。

ODD Chainとは

ODD chainには2つの方式があります:

1. 継承型(縦のチェーン)

source属性で親ODDを参照し、カスタマイズを継承します。

TEI_all → ベースODD → 派生ODD → さらなる派生...

2. 組み合わせ型(横のチェーン)

specGrpspecGrpRefを使って、複数の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

生成されるファイル

ソースODDRNGHTML
01-inheritance/base.oddoutput/base.rngoutput/base.html
01-inheritance/derived.oddoutput/derived.rngoutput/derived.html
02-chain/main.odd(統合後)output/combined.rngoutput/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.xslStylesheets/odds/ODDのコンパイル(モジュール展開、継承解決)
odd2relax.xslStylesheets/odds/RelaxNGスキーマ生成
odd2html.xslStylesheets/odds/HTMLドキュメント生成
merge-specs.xsl02-chain/specGrpRef展開(自作)

参考