• DITAによるドキュメントソリューションのために
  • XML/DITAオーサリングソフト

Oxygen top image

サブジェクトスキーマでOxygenの編集がさらに便利に

DITAのoutputclass属性はとても便利なものなのですが、入力した属性値の妥当性を確認しづらいという欠点もあります。ここではその欠点を補う入力方法の提案をします。

outputclass属性の問題点と解決方法

DITAは用意されている要素のほとんどに outputclass 属性を付けることが許されています。ある要素を出力するときに何か特別なスタイル付けをしたいときなどに使われることが多いです。

たとえば、

<p>あいうえお</p>

としたとき、通常この文字列は10ptで出力されるが、あまり重要な情報ではないので例外的に小さなサイズで出力したい、というような場合

<p outputclass="memo">あいうえお</p>

などとするわけです。

もちろん処理系の方で @outputclass="memo" をきちんと解釈する実装は必要です。

本当であれば特殊化をして、たとえば <p-memo> みたいな要素を用意した方がいいのかもしれませんが、そうしないケースが多々あるようです。なぜなら特殊化は面倒だからです。

それに対して @outputclass の使用はとても手軽ですが、属性値に何を書いてもエラーにはなりません。本来

<p outputclass="memo">あいうえお</p>

と書くべきところを

<p outputclass="mome">あいうえお</p>

としてもエラーにはならず、ただ期待した結果が得られないだけです(この場合はおそらく10ptで出力される)。

多くの場合ライティングガイドラインをきちんと定めて、<p>要素の outputclass 属性には "memo"しか書いてはいけない、などとルールを定めると思いますが、執筆者がそれを100%守るとは断言できません。"Memo""MEMO" 、中には"メモ"などと書いてしまうことがあるかもしれませんし、そもそも何が書けるのか、まったく思い出せないということもあるでしょう。

それを防ぐために、何が書けるのかを機械的に厳しく限定する方法のひとつがサブジェクトスキーマです。下記はサブジェクトスキーマの一部を切り出したサンプルです。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE subjectScheme PUBLIC "-//OASIS//DTD DITA Subject Scheme Map//EN" "subjectScheme.dtd">
<subjectScheme>
	<title>@outputclassを定義するsubjectScheme</title>
	<subjectdef keys="outpugclass_topicref">
		<topicmeta>
		 <navtitle>outputclass属性を入力します。</navtitle>
		</topicmeta>
		<subjectdef keys="cover1">
			<topicmeta>
				<navtitle>[topicref] PDFの表紙を指定します。</navtitle>
			</topicmeta>
		</subjectdef>
		<subjectdef keys="cover2">
			<topicmeta>
				<navtitle>[topicref] PDFの前付けを指定します。</navtitle>
			</topicmeta>
		</subjectdef>
		<subjectdef keys="cover3">
			<topicmeta>
				<navtitle>[topicref] PDFの奥付けを指定します。</navtitle>
			</topicmeta>
		</subjectdef>
			...
	</subjectdef>

	<enumerationdef>
	  <elementdef name="topicref"/>
	  <attributedef name="outputclass"/>
	  <subjectdef keyref="outpugclass_topicref"/>
	</enumerationdef>

</subjectScheme>

ここでは topicref 要素の outputclass 属性に何が書けるのかを定義しています。enumerationde 要素の中にそのことが記述されています。具体的な制限内容は <subjectdef keys="outpugclass_topicref"> の中で定義されています。

このサブジェクトスキーマを使ったとき、たとえば Oxygen では topicref/@outputclass を入力しようとすると次のような画面が表示され、属性値をリストの中から選択することになります。これであるなら、入力をミスすることはまずないでしょう。

subjectScheme image