1

プロジェクト用の単純なUI定義言語を作成しましたが、検証を容易にするためにスキーマを作成したいと思います。残念ながら、私のXSDスキルはかなり錆びており、確信が持てないようなことをしようとしていることに気づきました。

UIは、相互に関連して配置できる「ブロック」で構成されています。parent最も一般的なユースケースを単純化するために、参照属性に文字列、、、previousまたはのいずれかを含めることができるようにしたいと思いますnext。できるだけ柔軟にするために、IDを持つ任意の要素を指すことができるようにもしたいと思います。

言い換えれば、私は以下が有効であることを望みます:

<ui>
    <block id="foo"/>
    <block/>
    <block anchor="previous"/>
    <block anchor="#foo"/>
</ui>

これをXSDでどのように説明できますか?

4

1 に答える 1

1

結局のところ、XSD にはまさにこれを行う機能 (2 つ以上の型を結合する機能) が含まれていますが、私はそれを見逃していました。Aunionは、その字句空間がすべてのメンバー型の字句空間をカバーする型を作成します (つまり、そのサブタイプのいずれかに一致する値を含めることができます)。

IDREFs に先頭を含めることはできません#(URL のフラグメント識別子ではなく、ID への直接参照です)という注意事項があるため、次のスキーマは XML の例を検証します。興味深い部分はAnchorTypeTreeReferenceTypeです。

<schema targetNamespace="urn:x-ample:ui" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ui="urn:x-ample:ui">
    <element name="ui" type="ui:UIType"/>

    <complexType name="UIType">
        <sequence>
            <element minOccurs="1" maxOccurs="unbounded" name="block" type="ui:BlockType"/>
        </sequence>
    </complexType>

    <complexType name="BlockType">
        <attribute use="optional" name="id" type="ID"/>
        <attribute name="anchor" type="ui:AnchorType"/>
    </complexType>

    <simpleType name="AnchorType">
        <union memberTypes="ui:TreeReferenceType IDREF"/>
    </simpleType>

    <simpleType name="TreeReferenceType">
        <restriction base="string">
            <enumeration value="parent"/>
            <enumeration value="previous"/>
            <enumeration value="next"/>
        </restriction>
    </simpleType>
</schema>
于 2013-03-25T04:37:44.943 に答える