根据属性做出选择的最简洁方法是什么?

时间:2011-01-26 16:03:58

标签: xml xsd

我有一些你可以拥有的XML

<a type="b">
    <b></b>
</a>

<a type="c">
    <c></c>
</a>

<a type="d">
    <d></d>
</a>

但以下内容无效:

<a type="c">
    <b></b>
</a>

我正在尝试创建一个表示此的XML Schema,但是,如果我理解正确,则以下内容不能正确地将type属性绑定到标记的内容。

<?xml version="1.0" encoding="UTF-8" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="a" type="A" minOccurs="1" maxOccurs="1" />

    <xs:complexType name="A">
        <xs:attribute name="type" type="AType" use="required" />
        <xs:choice>
            <xs:group ref="B" />
            <xs:group ref="C" />
            <xs:group ref="D" />
        </xs:choice>
    </xs:complexType>

    <xs:simpleType name="AType">
        <restriction base="xs:string">
            <enumeration value="b"/>
            <enumeration value="c"/>
            <enumeration value="d"/>
        </restriction>
    </xs:simpleType>

    <xs:complexType name="B">
        STUFF
    </xs:complexType>

    <xs:complexType name="C">
        OTHER STUFF
    </xs:complexType>

    <xs:complexType name="D">
        YET MORE STUFF
    </xs:complexType>
</xs:schema>

正确地执行此操作的唯一方法是:令人难以置信的冗长:

<?xml version="1.0" encoding="UTF-8" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="a" type="A" minOccurs="1" maxOccurs="1" />

    <xs:complexType name="A">
        <xs:choice>
            <xs:group ref="B" />
            <xs:group ref="C" />
            <xs:group ref="D" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="B">
        <xs:attribute name="type" type="xs:string" fixed="b" />
        STUFF
    </xs:complexType>

    <xs:complexType name="C">
        <xs:attribute name="type" type="xs:string" fixed="c" />
        OTHER STUFF
    </xs:complexType>

    <xs:complexType name="D">
        <xs:attribute name="type" type="xs:string" fixed="d" />
        YET MORE STUFF
    </xs:complexType>
</xs:schema>

1 个答案:

答案 0 :(得分:2)

在XSD 1.0中没有直接的方法。可以使用“条件类型赋值”的新功能在XSD 1.1中轻松完成。 Saxon和Xerces随附的最新版架构处理器支持此功能。