首页 > 解决方案 > 如何为XSD中的不同元素指定具有相同名称但不同值的元素?

问题描述

我在 XML 中有一个元素,其值可以根据它所属的元素而有所不同。例如,考虑下面的 XML 代码

<element1>

    <action></action> //here action can have value -> add, delete

</element1>

<element2>

    <action></action> //here action can have value -> attach, detach

</element2>

<element3>

    <action></action> //here action can have value -> add, delete, attach, detach

</element3>

我需要为此编写 XSD,但我在某处读到这种场景不能用 XSD 编写。任何帮助将不胜感激。

(编辑) 我的 xsd 中需要这样的东西。(以下 XSD 不正确)

<xs:element name="e1">
  <xs:complexType>
    <xs:element name="action">
      <xs:sequence>
        <xs:restriction base="xs:string">
          <xs:enumeration value="Add"/>
          <xs:enumeration value="Delete"/>
        </xs:restriction>
      </xs:sequence>
    </xs:element>
  </xs:complexType>
</xs:element>

<xs:element name="e2">
  <xs:complexType>
    <xs:element name="action">
      <xs:sequence>
        <xs:restriction base="xs:string">
          <xs:enumeration value="Attach"/>
          <xs:enumeration value="Detach"/>
        </xs:restriction>
      </xs:sequence>
    </xs:element>
  </xs:complexType>
</xs:element>

标签: xmlxsd

解决方案


XSD 允许局部元素声明和全局声明,局部声明可以有不同的类型:

<xs:element name="e1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="action" type="xs:integer"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="e2">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="action" type="xs:dateTime"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

但是,如果两个action元素可以是彼此的兄弟,那么它们必须具有相同的类型(这种约束称为“元素声明一致”)。例如,您不能有一个元素有两个名为的子元素,action其中第一个是 an xs:integer,第二个是 an xs:dateTime


推荐阅读