我想为这个xml块创建XML Schema,我想限制“name”属性的值,这样在输出文档中,每个工作日只允许一天的实例:
<a>
<day name="monday" />
<day name="tuesday" />
<day name="wednesday" />
</a>
我试过用这个:
<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>
但是eclipse中的XML Schema验证器说错误“具有不同类型的名称'day'的多个元素出现在模型组中。”。
还有其他办法吗?
答案 0 :(得分:12)
你需要这样的东西:
<?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>
答案 1 :(得分:8)
为了满足原始问题中描述的最多一次约束,您需要在架构中使用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>
答案 2 :(得分:0)
试试这个:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="day">
<xs:complexType>
<xs:attribute name="atrib" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
我认为你需要的是maxOccurs =“unbounded”。
答案 3 :(得分:0)
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="day" />
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:element name="monday" maxOccurs="1" minOccurs="0" type="day" />
<xs:element name="tuesday" maxOccurs="1" minOccurs="0" type="day" />
<xs:element name="wednesday" maxOccurs="1" minOccurs="0" type="day" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
答案 4 :(得分:0)
使用选择而不是序列
通过这种方式,你只能在一个元素中拥有第一个元素
对于name属性,使用ref属性并使用枚举引用它