我想基于xml属性值指定基础子元素的结构。例如:使用属性指定XSD中的元素结构
<param type="uniform">
<high>10</high>
<low>0</low>
</param>
<param2 type="normal">
<mean>5</mean>
<stdev>2.5</mean>
<param2>
有没有一种方法来验证这种类型的结构使用XSD?
我想基于xml属性值指定基础子元素的结构。例如:使用属性指定XSD中的元素结构
<param type="uniform">
<high>10</high>
<low>0</low>
</param>
<param2 type="normal">
<mean>5</mean>
<stdev>2.5</mean>
<param2>
有没有一种方法来验证这种类型的结构使用XSD?
不幸的是,这是一个缺乏XSD的领域 - 您无法基于属性或元素中的值来控制结构。 XSD严格控制结构。
这样的事情,你不得不使用其他的XML验证技术,所以我建议你可能想看看的Schematron:
Schematron是一种可以定义这种依赖关系的方法(“如果此属性的值为XYZ,则.......”)。
马克
您可以使用抽象类做类似的事情。
<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'表示法。
这是我怀疑的情况。感谢您验证我的想法。 – 2009-09-16 20:28:57