はじめに

TEI (Text Encoding Initiative) は人文学テキストのデジタル化において広く使われている標準規格です。本記事では、TEI P5で導入された Processing Model という機能を使って、TEI XMLから複数のフォーマット(HTML、LaTeX/PDF、EPUB3)への変換を実現した事例を紹介します。

https://www.tei-c.org/Vault/P5/3.0.0/doc/tei-p5-doc/en/html/TD.html#TDPM

対象プロジェクトは「校異源氏物語」で公開されているテキストを例とします。

https://kouigenjimonogatari.github.io/

背景

これまで、以下の記事で紹介したように、変換処理を個別に行ってきました。

ODD/RNGファイルのカスタマイズによる、使用するタグの限定

XSLTを用いたHTMLへの変換

XSLTを用いたTeX/PDFへの変換

EPUBへの変換

それぞれの取り組みにおいて、個別の変換ルールなどを記載したファイルを作成する必要があり、その煩雑さが課題となっていました。

Processing Modelとは

Processing Modelは、TEI要素の変換ルールを宣言的 に記述する仕組みです。従来は各出力フォーマット用に個別のXSLTを書く必要がありましたが、Processing Modelを使うことで:

  • ODDファイル内で変換ルールを定義 できる
  • 複数の出力フォーマット に対応可能(web、latex、epubなど)
  • スキーマと変換ルールを一元管理 できる

Processing Modelの構造

<e/l<<eedm/lmeo<<<<<<meesd!m/!m/!m/omnce-o<m-o<m-o<mdet>l-dm/o-dm/o-dm/oenSP>eo<mdeo<mdeo<mdltpeHldodoeEldodoeLldodoe>SerTSeuedlPSeuedlaSeuedlpcsMeltseSUeltseSTeltseSeoLqpcleBqpcleeqpclecinubu>>q3ubu>>qXubu>>q>daoeetIueetIueetCuelunhRneonhRneonhRuentcaelnucaelnucaesntnpevnictevnictevntc=auidnepidnepidoe"mtooie>uooie>uooim>peuuttuuttuute<tristristriLr/p=opp=opp=oasdu"nau"nau"nTNeti>nti>nti>eas=ns=ns=n\Xmc"lpf"lpf"lpe>wiaoeiaoliec"ennrpnnranrobe<ue<tesmm""/pb"/pe"omo>>oe">oex>nadur>ur"<netsts>/d=popoo"ununufctttohRnRnpraeaeaunnmnmtpgdedeReei<ier"t/tins>idindooeoinnsnEt>c>Pin>UoaBnm3>e<s/<d/edsecs>c>

主な要素:

  • elementSpec/@ident: 対象となるTEI要素名
  • modelSequence/@output: 出力モード (web, latex, epubなど)
  • model/@behaviour: 変換の振る舞い (inline, block, paragraph, break, omitなど)
  • outputRendition: 出力要素名またはコマンド

実装アーキテクチャ

本プロジェクトでは、関心の分離(Separation of Concerns) の原則に基づき、以下の2層構造を採用しました:

1. Processing Model層(自動生成)

ODDファイル内のProcessing Model定義から、基本的な要素変換ルールを自動生成:

otttdeeediii____weeeiolololtdededehdmdmdm__e_e_eptntntnmototot._s_s_sox_x_x_dshslsedltlalptmtttu(.l.e.bPp.pxp.ryxy.yxosxsclslelso(oo(suHu(uEitTtLtPnpMpapUguLuTuBttet3M--X-ommmdoooedddle)ee)wl)e)eapbtu)ebx))

2. Wrapper層(手動作成)

フォーマット固有の機能を実装:

  • HTML Wrapper (html_wrapper.xsl)

    • Mirador IIIF viewerの統合
    • JavaScript (ページナビゲーション、ハイライト)
    • Tailwind CSSスタイリング
    • 縦書き表示
    • メタデータモーダル
  • LaTeX Wrapper (tex_wrapper.xsl)

    • ltjtarticleドキュメントクラス
    • LuaLaTeX日本語対応
    • カスタムジオメトリ
    • カラーコマンド定義
  • EPUB3生成ツール (tei_to_epub.py)

    • EPUB構造ファイル生成 (container.xml, content.opf, nav.xhtml)
    • 縦書きCSS
    • ZIPパッケージング

実装手順

Step 1: ODDにProcessing Model定義を追加

<<!e/-l<<e-edm/lmeo<<<mesesdm/m/m/omenceo<mo<mo<mdegt>ldm/odm/odm/oenST>eo<mdeo<mdeo<mdltpelddoelddoelddoe>SexSeedlSeedlSeedlpctelseSelseSelseSeqcleqcleqclecisub>>qub>>qub>>q>deeeIueeIueePuegnhnenhnenhaenmcalncalncarnteevicevicevac=nineineige"tooe>ooe>oor>suuuuuuaewtrstrstrpgip=pp=pp=h"tu"au"au"htintintpwm=n=n=aioo"lw"lf"rtdpwiieiolahetentpnrag=ibehuetrm"o""b"Eeaecn>>d">Pxpdhaa>U"hialtB>"una3>mgc<eoa/s"rtdk>rteierspsic<pb>/oudntedesescn>cfeorliJnakv<a/Sdcersicp>tprocessing</desc>

校異源氏物語では、以下の要素のProcessing Modelを定義:

  • seg: テキストセグメント(HTMLではインライン、LaTeXでは段落)
  • lb: 改行(HTMLでは<br/>、LaTeXでは省略)
  • pb: ページブレーク(HTMLではインラインマーカー、LaTeXでは省略)
  • persName: 人名(HTMLでは<span>、LaTeXでは\person{}コマンド)
  • placeName: 地名(HTMLでは<span>、LaTeXでは\place{}コマンド)
  • body, div, p: 構造要素

Step 2: XSLT生成ツールの作成

Processing ModelからXSLTを自動生成するPythonツール odd_to_xslt.py を開発:

ccccllllaaaasssss"@d@d#s"#s"#s"#"aeae"""X"bfbfH"HL"LE"XSXssTHTaLaPEHLStg"pt_"pMTMTaTUPTTLre"arg"aLMLeTeBUMGTan"sae"sbGLXeXGBLeceXscniseeGXe35ntrStenhnXenemaLmrlaeSnXeXretTeaivrLeSrSatettniaTrLaLth_heeotaTtTooho_uotordedibrr"orB"ane("r"(a"dlhX"("HHs"e"ia.SX"TTer"nv.LSMM(("ei.TLLLAs(oGTGBesueGeClernen)flene:)frer,"ara"tat"e"oto"lror"LeBr)imaB:sesatnes[t)es,:)t:rr]e:ndition,params):

使用方法:

#p#p#pyyyHtLtEtThahPhMoToUoLnenBn3X333ooodddddd___tttooo___xxxssslllttt...pppyyyooouuutttpppuuuttt---mmmooodddeeewleeapbtueboxdodod_ddwd_i_wtwihit_thph_m_p.pmom.d.ododddtdetite_eiei_l_eeelmleeemnmetensnt_tshs_t_emlplau.tbxe.sxxl.sxlsl

Step 3: Wrapper XSLTの作成

生成されたXSLTをインポートし、フォーマット固有の機能を追加:

<<!x/-s<<<<<<<<x-l!x!x/!x/!x/s:-s-s<x-s<x-s<xlhs-l-lxs-lh/s-l!s:tt::sl:t<<hl:-lsmyPitl:tmh/b/t:t-:tllrme:tele<ho<<bmtety_eopmaem>a!ed!solemIelwscoppmpd-ay-csd>mpImerherlppHl>-d>-rcyplIpsaestallTa>ir>laFlhpestyaMtMpJiataeptihe-tLeitapteCteenrter>vteaetrvgeme>maa>>mn>>.efamadSavxrM=tptoctasso"clcrrcslidthah,ihoee=t=p=Inli"e"Tt"D=_/stat"e"eife2Xl>siloi.See:wr:0LmlTip"TeeEnnbncIda"tt"v>s=>Ci_"SghtSate,tmiil:o.TMnxEi,sIrl"ah"/di/>og>rhlighting,etc.

Step 4: 変換実行

各フォーマットへの変換:

#s#sl#paauyHxLxaEtToaolPhMnTnaUoLetBn-X-e33x/xxsPstlDl-e:F:iihtn_tettmxeol_r__waewrcpratuapibppo.penper=yr.n.xoxsn-slsxlts-ol-sp=s:mt:0oe01di1.e_.xexm0lml1el.mteoeno:xt:0s01_1.e.tpheutxbm.lxsl01.xml01.epub

出力結果

1つのTEI XMLファイル(01.xml)から、3つのフォーマットを生成:

フォーマットファイルサイズ特徴
HTML115KBMirador IIIFビューワー統合、縦書き、インタラクティブナビゲーション
PDF201KB (8ページ)LuaLaTeX日本語組版、横長レイアウト、カラー表示
EPUB314KB縦書き電子書籍、XHTML5準拠

HTML

PDF

EPUB3

実装の利点

1. 保守性の向上

  • Processing Modelの変更が容易 : ODDを修正してXSLTを再生成するだけ
  • 要素変換とプレゼンテーションの分離 : 基本変換とインタラクティブ機能が独立
  • 一元管理 : スキーマと変換ルールがODDに集約

2. 再利用性

  • 基本変換XSLTの再利用 : 他のプロジェクトでも利用可能
  • Wrapperのカスタマイズ : プロジェクト固有の要件に対応

3. 宣言的記述

  • 可読性 : Processing Modelは命令型XSLTより理解しやすい
  • ドキュメント化 : <desc>でルールの意図を明示

4. 一貫性

  • 複数フォーマット間の一貫性 : 同じODDから生成
  • スキーマと実装の同期 : 定義と実装が分離しない

課題と解決策: Processing Modelの実行環境

TEI Publisherなど、Processing Modelを直接実行できるツールは限られています。

今回の取り組みでは、カスタムXSLT生成ツール (odd_to_xslt.py) を開発し、Processing ModelからXSLTスケルトンを生成しています。

まとめ

TEI Processing Modelを使用することで:

  1. 宣言的保守しやすい 変換ルールを記述できる
  2. 複数フォーマット (HTML、LaTeX/PDF、EPUB3)を一元管理 できる
  3. 関心の分離 により、基本変換とフォーマット固有機能を独立して管理できる
  4. 再利用性 が高く、他のTEIプロジェクトにも適用可能

校異源氏物語プロジェクトでは、この approach により:

  • 1つのODDファイルから3種類の出力フォーマットを生成
  • インタラクティブなWebビューワー(Mirador統合)
  • PDF(LuaLaTeX日本語組版)
  • 電子書籍フォーマット(縦書きEPUB3)

を実現しました。

参考資料

ソースコード

本記事で紹介したすべてのコードは、以下のリポジトリで公開しています:

root/gteonojlithtRstdeteEdedimxAdi__l_D__we_wMttilwrEootera___hmappxe_epprsppnpeolumterctb.sr.e..o_.xsppd*xssyyd.slixlnsgl_model.md#######PHLXErTaSPoMTLUcLeTBeX3sXsSiLnTgModel