1

我为一个项目制作了一个简单的 UI 定义语言,现在想创建一个模式,以便于验证。不幸的是,我的 XSD 技能相当生疏,我发现自己正在尝试做一些我什至不确定的事情。

UI 由“块”组成,这些“块”可以相对于彼此定位。为了简化最常见的用例,我希望引用属性能够包含任何字符串parentpreviousnext。为了尽可能灵活,我还希望它能够指向任何具有 ID 的元素。

换句话说,我希望以下内容有效:

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

我如何在 XSD 中描述这一点?

4

1 回答 1

1

事实证明,XSD 包含一个功能正是这样做的——结合了两种或多种类型——而我只是错过了它。Aunion创建一个类型,其词法空间覆盖其所有成员类型的词法空间(换句话说,它可以包含与其任何子类型匹配的值)。

需要注意的是IDREFs 不能包含前导#(它是对 ID 的直接引用,而不是 URL 的片段标识符),以下模式将验证示例 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 回答