2009-09-16 65 views
0

我想基于xml属性值指定基础子元素的结构。例如:使用属性指定XSD中的元素结构

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

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

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

回答

1

不幸的是,这是一个缺乏XSD的领域 - 您无法基于属性或元素中的值来控制结构。 XSD严格控制结构。

这样的事情,你不得不使用其他的XML验证技术,所以我建议你可能想看看的Schematron:

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

马克

+0

这是我怀疑的情况。感谢您验证我的想法。 – 2009-09-16 20:28:57

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

相关问题