なぜXMLを学ぶのか

TEIガイドラインはXML(Extensible Markup Language)をベースとしています。TEIドキュメントを正しく作成し、ツールで処理するためには、XMLの基本的な文法と概念を理解する必要があります。

XMLは「拡張可能なマークアップ言語」と訳されます。HTMLと同じくSGMLを起源とするマークアップ言語ですが、HTMLが固定のタグセットを持つのに対し、XMLは目的に応じて独自のタグ(要素)を定義できる汎用的な言語です。TEIは、このXMLの汎用性を活用して、人文学テキスト向けの要素セットを定義したものです。

筆者はXMLの処理に関して多くの記事を書いてきました。Pythonでの処理はPythonでXML文字列を整形するXMLファイルで文字列のみを抽出して処理する方法で、Node.jsでの処理はNode.jsでXML文字列をパースするで紹介しています。

XML文書の基本構造

XML文書は以下の要素から構成されます。

XML宣言

XML文書の先頭にはXML宣言を記述します。

<?xml version="1.0" encoding="UTF-8"?>

versionはXMLのバージョン(通常は1.0)、encodingは文字エンコーディング(通常はUTF-8)を指定します。TEIドキュメントでは必ずUTF-8を使用することが推奨されています。

要素(Element)

XML文書の基本単位は要素(element)です。要素は開始タグ、内容、終了タグから構成されます。

<title>源氏物語</title>

この例では、<title> が開始タグ、源氏物語 が内容(テキストコンテンツ)、</title> が終了タグです。

内容を持たない要素(空要素)は、以下のいずれかの書き方ができます。

<pb/>
<pb></pb>

TEIでは <pb/>(改ページ)、<lb/>(改行)、<gap/>(欠損)など、多くの空要素が定義されています。

属性(Attribute)

要素には属性(attribute)を付与して、追加の情報を記述できます。

<div type="chapter" n="1">
  <head>桐壺</head>
  <p>いづれの御時にか、女御、更衣あまたさぶらひたまひける中に...</p>
</div>

TEIでよく使われる共通属性には以下のものがあります。

属性名説明
xml:id要素の一意な識別子xml:id="ch01"
xml:lang言語コードxml:lang="ja"
n番号やラベルn="42"
type要素のサブタイプtype="chapter"
ref外部リソースへの参照ref="https://viaf.org/..."
corresp対応する要素への参照corresp="#note1"
facsファクシミリ画像への参照facs="#surface_001"

筆者はxml:id属性の扱いについて、BeautifulSoupでxml:id属性を与える方法JavaScriptのquerySelector()でxml:idに特定の値を持つ要素を取得する方法で具体的な操作方法を紹介しています。

要素のネスト(入れ子構造)

XML要素は入れ子にすることができます。TEIドキュメントでは、テキストの論理的な階層構造を要素のネストで表現します。

<div type="chapter" n="1">
  <head>桐壺</head>
  <div type="section" n="1">
    <p>いづれの御時にか、<persName>女御</persName>    <persName>更衣</persName>あまたさぶらひたまひける中に、
    いとやむごとなき際にはあらぬが、すぐれて時めきたまふありけり。</p>
  </div>
</div>

ネストの規則として、要素は正しく入れ子にしなければなりません。タグが交差するのは不正なXMLです。

Well-formed と Valid

XMLには2つの重要な「正しさ」の概念があります。

Well-formed(整形式)

XML文書がwell-formedであるとは、XMLの基本的な構文規則に従っていることを意味します。具体的には以下の条件を満たす必要があります。

  1. ルート要素が1つだけ存在する
  2. すべての開始タグに対応する終了タグがある
  3. 要素が正しくネストされている
  4. 属性値が引用符で囲まれている
  5. 要素名・属性名がXMLの命名規則に従っている

Valid(妥当)

XML文書がvalidであるとは、well-formedであることに加えて、スキーマに従っていることを意味します。TEIの場合、TEIスキーマに対してvalidであることが求められます。

筆者はCWRC XML Validator APIを試すで、XMLの妥当性検証をAPI経由で行う方法を紹介しています。

名前空間(Namespace)

XMLの名前空間(namespace)は、要素名の衝突を防ぐための仕組みです。TEIの名前空間URIは以下のとおりです。

http://www.tei-c.org/ns/1.0

TEIドキュメントのルート要素では、この名前空間をデフォルト名前空間として宣言します。

<TEI xmlns="http://www.tei-c.org/ns/1.0">
  ...
</TEI>

XMLスキーマ

XMLスキーマは、XML文書の構造や内容に対する制約を定義するものです。TEIでは主に以下のスキーマ言語が使われています。

Relax NG

Relax NG(Regular Language for XML Next Generation)は、TEIで最も広く使われているスキーマ言語です。XML構文(.rng)とコンパクト構文(.rnc)の2つの記述形式があります。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_all.rng"
  type="application/xml"
  schematypens="http://relaxng.org/ns/structure/1.0"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
  ...
</TEI>

筆者はRelax NGスキーマに関して複数の記事を執筆しています。RELAX NGスキーマを操作するライブラリjingtrangを試す:検証編ではPythonを使ったスキーマの検証方法を、RELAX NGスキーマを操作するライブラリjingtrangを試す:rngファイルの作成編ではスキーマファイルの作成方法を解説しています。また、生成AIを用いてプロジェクトに特化したrngファイルを作成するでは、生成AIを活用したスキーマ作成の可能性も紹介しています。

Schematron

Schematronは、ルールベースの検証言語です。Relax NGでは表現しきれない、より複雑な制約を記述できます。TEIでは、Relax NGスキーマとSchematronルールを組み合わせて使うことが一般的です。

筆者はRELAX NGとSchematronRELAX NGとSchematronを組み合わせたTEI XMLスキーマの実装ガイドで、これらの組み合わせ方を解説しています。

XSD(W3C XML Schema)

W3C XML Schemaによるバリデーションについても、筆者はJPCOARスキーマ(v1)を用いたxmlファイルのバリデーションツールの試作JPCOARスキーマを用いたxmlファイルのバリデーションで実例を紹介しています。TEI以外のXMLスキーマに対するバリデーションですが、考え方は共通です。

XPath

XPathは、XML文書内の要素や属性を指定するためのパス式言語です。TEIドキュメントを処理する際に頻繁に使います。

/T//EpdIei/rvtts[yeN@piateHmyeepaed='ep'crech/rhaftsapiiNptltateelmerDeer'e's]c/titldeiSvtmt/title

筆者はCETEIceanとXPathを使って特定の要素にスクロールするで、XPathを使ったTEI要素へのアクセス方法を実践的に紹介しています。

XSLT

XSLT(Extensible Stylesheet Language Transformations)は、XML文書を別の形式に変換するための言語です。TEIドキュメントをHTML、PDF、プレーンテキストなどに変換する際に使われます。

以下は、TEIの <p> 要素をHTMLの <p> 要素に変換する簡単なXSLTの例です。

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:tei="http://www.tei-c.org/ns/1.0">

  <xsl:template match="tei:p">
    <p>
      <xsl:apply-templates/>
    </p>
  </xsl:template>

  <xsl:template match="tei:persName">
    <span class="person-name">
      <xsl:apply-templates/>
    </span>
  </xsl:template>

</xsl:stylesheet>

筆者はXSLTに関して複数の記事を執筆しています。VSCodeとXSLTを用いたTEI/XMLのリアルタイムプレビューでは、VSCodeでXSLT変換結果をリアルタイムに確認する方法を紹介しています。また、XSLTを使いながらTEI/XMLファイルを編集するでは、XSLTとAI支援を組み合わせた編集フローを解説しています。Node.js で XSLT を実行するサンプルリポジトリを作成しました。では、Node.jsでXSLTを実行する方法も紹介しています。XSLTを使ってIIIFとTEIの対照表示を実現するでは、XSLTの実践的な応用例として、IIIFとTEIの連携表示を取り上げています。

TEIコミュニティでは、TEIドキュメントからHTML、LaTeX、ePub、ODTなどへの変換を行うXSLTスタイルシート集「TEI Stylesheets」が公開されています。

https://github.com/TEIC/Stylesheets

実践: 最初のTEI/XMLファイルを作る

ここまでの知識を使って、実際に簡単なTEI/XMLファイルを作成してみましょう。テキストエディタ(Visual Studio Code、oXygen XML Editorなど)を開き、以下の内容を入力して sample.xml として保存してください。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_all.rng"
  type="application/xml"
  schematypens="http://relaxng.org/ns/structure/1.0"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
  <teiHeader>
    <fileDesc>
      <titleStmt>
        <title>方丈記(冒頭)</title>
        <author>鴨長明</author>
      </titleStmt>
      <publicationStmt>
        <p>TEI学習用サンプル</p>
      </publicationStmt>
      <sourceDesc>
        <p>底本情報をここに記述</p>
      </sourceDesc>
    </fileDesc>
  </teiHeader>
  <text xml:lang="ja">
    <body>
      <div type="section" n="1">
        <p>ゆく河の流れは絶えずして、しかももとの水にあらず。
        淀みに浮かぶうたかたは、かつ消えかつ結びて、
        久しくとどまりたるためしなし。
        世の中にある人とすみかと、またかくのごとし。</p>
      </div>
    </body>
  </text>
</TEI>

oXygen XML Editorをお使いであれば、ファイルを開いた時点でスキーマによる妥当性検証が自動的に行われます。Visual Studio Codeで編集する場合は、筆者の記事Visual Studio Live Shareを用いてTEI/XMLファイルを共同編集する(xmlでなくても可)も参考にしてください。共同作業でTEI/XMLファイルを編集する環境を整えることもできます。

まとめ

本章では、TEIの基盤技術であるXMLの基礎を学びました。要素、属性、ネスト構造、well-formed/validの概念、名前空間、スキーマ、XPath、XSLTという一連の技術は、TEIドキュメントを扱う上で不可欠な知識です。

次章からは、いよいよTEIドキュメントの具体的な構造に踏み込んでいきます。まずはTEIドキュメントの「顔」であるTEIヘッダーの設計から始めましょう。

関連記事