代码之家  ›  专栏  ›  技术社区  ›  Bryan Ward

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

  •  0
  • Bryan Ward  · 技术社区  · 15 年前

    我想基于XML属性值指定基础子元素的结构。例如:

    <param type="uniform">
        <high>10</high>
        <low>0</low>
    </param>
    
    <param2 type="normal">
        <mean>5</mean>
        <stdev>2.5</mean>
    <param2>
    

    是否有方法使用XSD验证这种类型的结构?

    2 回复  |  直到 15 年前
        1
  •  1
  •   marc_s Hady Salah    15 年前

    不,不幸的是,这是一个缺少XSD的区域——您不能基于属性或元素中的值控制结构。XSD严格控制结构。

    对于类似的事情,您必须使用其他XML验证技术,因此我建议您可以查看Schematron:

    Schematron是一种可以在其中定义这些依赖项的方法(“如果此属性的值为xyz,则…….”)。

    马克

        2
  •  1
  •   Pieter Degraeuwe    15 年前

    可以使用抽象类型执行类似的操作。

    <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”表示法。