RELAX NGとSchematronを組み合わせたTEI XMLスキーマの実装ガイド

! 人手で検証を行った後、AIが記事を執筆しました。 はじめに TEI(Text Encoding Initiative)XMLを編集する際、要素や属性の構造検証だけでなく、より複雑なビジネスルールの検証が必要になることがあります。本記事では、RELAX NG(RNG)とSchematronを組み合わせて、構造検証と内容検証の両方を実現する方法を、実際のプロジェクトで直面した課題を例に解説します。 解決したい課題 日本の古典文学テキストをTEI XMLで校訂する際、以下のような要求がありました: ID参照の動的検証 : corresp属性で参照するIDが、実際に文書内のwitness要素に存在することを検証したい Oxygen XML Editorでの補完機能 : 編集時にIDの候補を自動表示したい 複数ID参照のサポート : スペース区切りで複数のIDを指定可能にしたい 特定要素のみ参照を許可 : witness要素のIDのみを参照可能とし、person要素のIDが含まれる場合はエラーにしたい なぜRNG + Schematronなのか? RELAX NGの得意分野 要素・属性の構造定義 データ型の指定 基本的な内容モデルの定義 Schematronの得意分野 XPathベースの複雑な検証ルール 文書内の相互参照チェック カスタムエラーメッセージの提供 この2つを組み合わせることで、構造と内容の両面から厳密な検証が可能になります。 実装例 1. 基本的なRNGスキーマ構造 < < ? g / x r < < < < < g m a ! s ! s / ! r l m - c - t < s - a m - h - a r t - m v a : r e a m e r S n こ t f r R a r c s こ > t N r s x x x d n h に n > G > i m m m a s e p S a に o l l l t = m r c m よ n n n n a " a e h e る = s s s t h t f e = 構 " = : : y t r i m " 造 1 " a s p t o x a T 定 . h = c e p n = t E 義 0 t " h L : 名 " r I " t h = i / 前 t o " p t " b / 空 e n / e : t h r w 間 i ル > n / p t a w 宣 " ー c : t r w 言 ル r / p y . u を d e / : = t r 埋 i l r / " e i め n a e / h i = 込 g x l p t - " む = n a u t c h " g x r p . t U . n l : t T o g . r p F r . / g : - g c w / / 8 r l w n / " n g c w s w ? s . . / w > n o w 1 w s s r 3 . . t / g . 0 t r c o " e u d r > i c m s g - t p d / c u a l 2 . r t / 0 o e i s 0 r / b c 1 g 1 i h / / . l e X n 0 i m M s " t a L / y t S 1 / r c . a o h 0 n n e " n " m / o a > t - a d t a i t o a n t s y / p 1 e . s 0 " " 2. ID定義とanyURI型の活用 Oxygen XML Editorで自動補完を実現するために、anyURI型を使用します: ...

2025年8月9日 · 17 分 · Nakamura

CETEIceanとXPathを使って特定の要素にスクロールする

概要 CETEIceanとXPathを使って特定の要素にスクロールする方法を調べたので備忘録です。 デモ 以下のURLからお試しいただけます。 https://next-ceteicean-router.vercel.app/xpath/ ページにアクセス後、スクロールし、以下のように表示されます。 XPathの取得 上記では、以下の「校異源氏物語テキストDB」のXMLファイルを対象にしています。 https://kouigenjimonogatari.github.io/tei/01.xml そして、以下のXPathを指定しています。 /TEI/text[1]/body[1]/p[1]/seg[267] このXPathの取得にあたっては、Oxygen XML Editorを用いて、対象要素を右クリックして、「Copy XPath」から取得することができました。 スクロールの実装 以下で紹介したアプリをベースにします。 GitHub上のソースコードは以下です。 https://github.com/nakamura196/next-ceteicean-router/blob/main/src/components/xpath/Render.tsx 特に以下の部分で、XPathをCETEIceanによって作成される要素名に変換し、scrollIntoViewによってスクロールしています。 R } f e , e a c c i } t c o o f [ c t n n . . . c ) c i } t h . s s r r t ( o ; o f e D u t t e e o t n x t n X n n t } t i a s p p L e s p e u P u s ( a ) a D t e r x l l o i t a i l a l t t r b b i ; r o a E a p a a w C t C l t l a g e l n g c の f w a c c e o r h o , h t r e h o l e ] 修 f X t e e r n e , n R a g t a c i t ) 正 e p h ( ( C t s t e r e E v k n E ; c a / / a e u e s g t l i : e l t t = ( s n l n u e E e o : e ( h [ e t t t l t l m r " m ( r A ( R R t E e e : c " e ) = a / - ) e = e . l m n e c n w , Z ; f f F e e t " n e t = " X a . d . I m n . s t n . > / p " - c o c R e t s m e t s T a " z u c u S n ) c o r e t { E t ) ] r u r T t r o " r y I h r m r _ { o t , " l / e e e O = l h , e t ( n n n R l " . e ? t t t D r I , b x 先 = ) . , E e n a t 頭 \ e R s t c [ の / { v E u o k 1 ス | a D l V g ] ラ \ l _ t i r / ッ [ u N . e o b シ | a O s w u o ュ $ t D i ( n d を ) e E n { d y 削 / ( _ g C [ 除 g T l o 1 , Y e l ] P N o / " E o r p t , d [ e e = 1 i V ] - a " / $ l y s 1 u e e " e l g ) l [ a o 2 s w 6 " 7 H ; ] t T " e M ; i L - E プ l レ e フ m ィ e ッ n ク t ス ; を 追 加 まとめ 他にも良い方法があるかもしれませんが、参考になりましたら幸いです。 ...

2025年3月27日 · 3 分 · Nakamura