如何在XML Schema中定义具有相同名称和不同属性值的多个元素?

Luk*_*mpa 8 xsd

我想为这个xml块创建XML Schema,我想限制"name"属性的值,这样在输出文档中,每个工作日只允许一天的实例:

<a>
  <day name="monday" />
  <day name="tuesday" />
  <day name="wednesday" />
</a>
Run Code Online (Sandbox Code Playgroud)

我试过用这个:

 <xs:complexType name="a">
  <xs:sequence>
    <xs:element name="day" minOccurs="1" maxOccurs="1">
      <xs:complexType>
        <xs:attribute name="name" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="monday" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:complexType>
    </xs:element>
    <xs:element name="day" minOccurs="1" maxOccurs="1">
      <xs:complexType>
        <xs:attribute name="name" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="tuesday" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

但是eclipse中的XML Schema验证器说错误"具有不同类型的名称'day'的多个元素出现在模型组中."

还有其他方法吗?

小智 13

你需要这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="a">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="day"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="day">
    <xs:complexType>
      <xs:attribute name="name" use="required">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="monday"/>
                <xs:enumeration value="tuesday"/>
                <xs:enumeration value="wednesday"/>
            </xs:restriction>
        </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
  </xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

  • 不,这不是诀窍.如果目标是为每个日期名称允许一个且只有一个元素,则此模式将不会执行此操作.您需要使用xs:unique来正式规定每日最多一次约束. (3认同)

Che*_*eso 9

为了满足原始问题中描述的最多一次约束,您需要在架构中使用xs:unique元素.

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

  <xs:element name="a">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="day" maxOccurs="7" minOccurs="1">
          <xs:complexType>
            <xs:attribute name="name" use="required">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:pattern value="(mon|tues|wednes|thurs|fri|satur|sun)day"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
          <xs:unique name="eachDayAtMostOnce">
            <xs:selector xpath="day"/>
            <xs:field xpath="@name"/>
          </xs:unique>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>
Run Code Online (Sandbox Code Playgroud)