我想为所有元素添加name-attribute。为了确保只允许某些属性值,我创建了一个限制模式。有没有办法确保每个文档只使用一次枚举值?
simpleStyle:
<xsd:simpleType name="myname">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="1"/>
<xsd:enumeration value="2"/>
</xsd:restriction>
</xsd:simpleType>
XML
<element name="1"/>
<element name="2"/>
<element name="1"/>
不应该允许最后一个。
这甚至可能吗?
答案 0 :(得分:2)
有一个类似的概念称为身份约束,可能适合您的目的。您希望使用xs:unique
,它是父元素的约束,而不是枚举的属性。类似的东西:
<xs:unique name="myconstraint">
<xs:selector xpath=".//*"/>
<xs:field xpath="@name"/>
</xs:unique>
selector
说明约束适用的子元素(本例中的所有后代),field
表示哪个部分必须是唯一的。
答案 1 :(得分:0)
正如@xan和this guide正确建议的那样,您可以通过以下方式更改代码:
定义myname
枚举。
这样只允许使用1
或2
值。
<!-- The Enumeration definition (allowing only values 1 or 2) -->
<xsd:simpleType name="myname">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="1"/>
<xsd:enumeration value="2"/>
</xsd:restriction>
</xsd:simpleType>
定义element
结构。
这将定义<element name="..." />
节点的结构。
<!-- the element definition (defines the <element /> structure) -->
<xs:complexType name="elementType">
<xs:attribute name="name" type="myname" use="required"/>
</xs:complexType>
Univque usage 。
定义element
标记用法,要求对name
属性进行单向使用。
<xs:element name="myelements">
<!-- The <element/> tag usage -->
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="element" type="myname"/>
</xs:sequence>
</xs:complexType>
<!-- The univocity constraint -->
<xs:unique name="nameUniqueConstraint">
<xs:selector xpath="element"/>
<xs:field xpath="@name"/>
</xs:unique>
</xs:element>
请注意,nameUniqueConstraint
只是一个任意名称,用于标识您想要的约束。