XSD依赖于上下文的类型;包装类型

时间:2012-11-05 18:53:29

标签: validation xsd

我正在为这样的XML文档编写模式:

<workbook>
  <worksheet>
    <column/>
  </worksheet>
</workbook>

每个节点都可以包装到env元素中(例如)

<workbook>
 <env>
  <worksheet>
   <column/>
  </worksheet>
 </env>
</workbook>

<workbook>
 <worksheet>
  <env>
   <column/>
  </env>  
 </worksheet>
</workbook>

因此,根据env元素的位置,它可以有不同的子节点(工作簿的子节点必须包含工作表子节点,工作表的env-child必须具有列子节点)

当我将env元素声明为嵌套时,我会得到多重定义的元素错误。

我怎么能为这样的文件写xsd,或者它是否可能?

提前致谢!

1 个答案:

答案 0 :(得分:0)

是的,这是可能的,因为你可以拥有同名env但在不同地方有不同类型(结构)的元素 - 这可以解决这个问题:

<xs:element name="workbook">
  <xs:complexType>
    <xs:choice>
      <xs:element name="env">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="worksheet"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element ref="worksheet"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

<xs:element name="worksheet">
  <xs:complexType>
    <xs:choice>
      <xs:element name="env">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="column"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element ref="column"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

<xs:element name="column" type="xs:string">
</xs:element>