我想基于xml属性值指定底层子元素的结构。例如:
<param type="uniform">
<high>10</high>
<low>0</low>
</param>
<param2 type="normal">
<mean>5</mean>
<stdev>2.5</mean>
<param2>
有没有办法使用XSD验证这种类型的结构?
答案 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'表示法。