首页 > 解决方案 > 如何根据父标签对相同的复杂类型应用不同的限制

问题描述

我想达到下面显示的场景,其中我有相同的元素(在本例中为组件)和不同的父母。我只想对 < component > 的第一级添加限制。例如,我想添加颜色(在组件下)只能是黄色或绿色但 < component-set > 下的颜色可以是任何颜色的限制。

<components>
    <component color="yellow"/>
    <component color="green"/>
    <component-set>
      <component color="black"/>  
    </component-set>
  </xs:complexType>
</components>

这是我当前的 xsd,我不应该编辑复杂的类型或元素名称。

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://../custom.xsd" xmlns="http://../custom.xsd">

 <xs:complexType name="componentType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="color" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="component-setType" mixed="true">
    <xs:sequence>
      <xs:element type="componentType" name="component" maxOccurs="unbounded" minOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="componentsType">
    <xs:choice maxOccurs="unbounded" minOccurs="0">
      <xs:element type="componentType" name="component"/>
      <xs:element type="component-setType" name="component-set"/>
    </xs:choice>
  </xs:complexType>
</xs:schema>

标签: xmlxsd

解决方案


您已经在使用本地元素声明(xs:element具有name出现在复杂类型的内容模型中的属性)。出现在不同内容模型中的两个局部元素声明可以有不同的类型;仅仅因为两个元素都被调用"component"并不意味着它们都需要具有 type "componentType"


推荐阅读