使用属性在XSD中指定元素结构

时间:2009-09-16 02:26:51

标签: xml validation xsd

我想基于xml属性值指定底层子元素的结构。例如:

<param type="uniform">
    <high>10</high>
    <low>0</low>
</param>

<param2 type="normal">
    <mean>5</mean>
    <stdev>2.5</mean>
<param2>

有没有办法使用XSD验证这种类型的结构?

2 个答案:

答案 0 :(得分:1)

不,不幸的是,这是缺少XSD的区域 - 您无法根据属性或元素中的值来控制结构。 XSD严格控制结构。

对于这样的事情,您必须使用其他XML验证技术,所以我建议您可以查看Schematron:

Schematron是一种可以定义这种依赖关系的方法(“如果此属性具有值XYZ,那么.......”)。

马克

答案 1 :(得分:1)

你可以使用抽象类型做类似的事情。

<xs:complexType name="basePqrameterType" abstract="true"/>

遵循特定(具体)类型定义:

<xs:complexType name="Param_uniform">
    <xs:complexContent>
        <xs:extension base="baseParameterType">
            <xs:attribute name="type" use="required" fixed="uniform"/>
            ...<!--other specific restrictions for type uniform-->
        </xs:extension>
        </xs:complexContent>
</xs:complexType>

<xs:complexType name="Param_normal">
    <xs:complexContent>
        <xs:extension base="baseParameterType">
            <xs:attribute name="type" use="required" fixed="normal"/>
            ...<!--other specific restrictions for type normal-->
        </xs:extension>
        </xs:complexContent>
</xs:complexType>

您的xml将如下所示:

<Param xsi:type="Param_normal" type="normal"/>
<Param xsi:type="Param_uniform" type="uniform"/>

因此,可以使用相同名称的元素,但是由于不同类型的定义而限制它们,但是你不能通过使用属性值来“选择”这些类型。必须使用'xsi:type'表示法。