subjectSchemeで@outputclassを検証する(2)

ではどのような場合に不具合が出るのでしょうか?例えば@outputclassは様々な用途に使用されます.でも悩みの種は@outputclassは検証されない点です.subjectSchemaにより検証されれば、スキーマ/DTDを直すことなしに目的の結果を得ることができます.これはいいかもしれません.

考えた例は次のようなものです.

fig/@outputclass="none/left/right"
figgroup/@outputclass="auto/left/right"

と制限したいとします.そうすると作るsubjectSchemaは次のようなものになります.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE subjectScheme PUBLIC "-//OASIS//DTD DITA Subject Scheme Map//EN" "subjectScheme.dtd"> 
<subjectScheme>
    <subjectHead>
        <subjectHeadMeta>
            <navtitle> Constraint @outputclass for fig </navtitle>
        </subjectHeadMeta>
    </subjectHead>
    <subjectdef keys="floatLeft">
        <subjectdef keys="left">
            <topicmeta>
                <navtitle>Floats left</navtitle>
            </topicmeta>
        </subjectdef>
    </subjectdef>
    <subjectdef keys="floatRight">
        <subjectdef keys="right">
            <topicmeta>
                <navtitle>Floats right</navtitle>
            </topicmeta>
        </subjectdef>
    </subjectdef>
    <subjectdef keys="outputclassFig">
        <subjectdef keys="none">
            <topicmeta>
                <navtitle>No float</navtitle>
            </topicmeta>
        </subjectdef>
        <subjectdef keyref="floatLeft"/>
        <subjectdef keyref="floatRight"/>
    </subjectdef>
    <subjectdef keys="outputclassFigGroup">
        <subjectdef keys="auto">
            <topicmeta>
                <navtitle>Auto (Same as previous)</navtitle>
            </topicmeta>
        </subjectdef>
        <subjectdef keyref="floatLeft"/>
        <subjectdef keyref="floatRight"/>
    </subjectdef>
    <enumerationdef>
        <elementdef name="fig"/>
        <attributedef name="outputclass"/>
        <subjectdef keyref="outputclassFig"/>
    </enumerationdef>
    <enumerationdef>
        <elementdef name="figgroup"/>
        <attributedef name="outputclass"/>
        <subjectdef keyref="outputclassFigGroup"/>
    </enumerationdef>
</subjectScheme>

何故"floatLeft"や"floatRight"のようなキー定義を作るのは仕方がないのです.あくまでもキー定義なので、

<subjectdef keys="outputclassFig">
<subjectdef keys="outputclassFigGroup">

に同じキーを定義すると動作がおかしくなってしまうのです.ところがoXygenで出される候補を見ると、次のようにfloatLeftもfloatRightも出てしまうのです.これは望まれた結果ではないのですが、よくよくsubjectSchmeを考えてみるとあくまでもkeys/keyrefの機構をつかっているので止むを得ないのかもしれません.あげくの果てにDITA-OT 2.3.1でpublishすると画面のようにエラーメッセージが出ます.こちらもいまいちです.

イメージ 1

これはoXygenのフォーラムに出しましたが、Raduは[dita-comment]に質問を出してくれました.

Validating @outputclass by subjectScheme

Gathering restricted values using a subject scheme map

という訳で、残念ながら当面@outputclassをsubjectSchemで検証するというのは決着が付くまで無理ではないかと思います.