我有一个元素。
<xsd:element name="tags" type="tagsType"></xsd:element>
这个是... tagsType
:
<xsd:complexType name="tagsType">
<xsd:sequence>
<xsd:element name="t" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="tagname" type="xsd:string"></xsd:attribute>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:key name="tagKey">
<xsd:selector xpath="tags/tag"/>
<xsd:field xpath="@tagname"/>
</xsd:key>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
我是如何限制的 tagname
属性是唯一的,但我想让该标签的内容也是唯一的。例如,我想让这个标签的内容也是唯一的。
<tags>
<t>tag1</t>
<t>tag1</t>
<t>tag2</t>
</tags>
这应该是无效的,因为有重复的内容。tag1
. 这应该是验证。
<tags>
<t>tag1</t>
<t>tag2</t>
<t>tag3</t>
</tags>
我如何做到这一点?
你可以用下面的XSD来达到预期的效果。它使用了 xsd:unique
元素,以确保这些值是唯一的。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="tagsType">
<xsd:sequence>
<xsd:element name="t" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="tags" type="tagsType">
<xsd:unique name="t_unique" >
<xsd:selector xpath="t"/>
<xsd:field xpath="."/>
</xsd:unique>
</xsd:element>
</xsd:schema>
这个XSD验证了第二个XML,而在第一个XML上失败了。
这个 xsd:唯一 元素有两个子元素。
xsd:unique元素必须包含以下内容(按顺序)。
- 一个且仅有一个xsd:selector元素(包含一个XPath表达式,用于指定由字段指定的值必须是唯一的元素集)
- 一个或多个xsd:field元素(包含一个XPath表达式,该表达式指定了选择器元素所指定的元素集的值必须是唯一的。
如果你想让Y中的每一个X对Z有一个唯一的值,那么。
(a)Y的声明应保持: xs:unique
约束
(b) 选择器应该是一个路径表达式,从Y开始选择X。
三)字段应该是一个路径表达式,从X开始选择Z。
所以你犯的根本错误是在错误的层次上定义了约束。xs:unique
不属于你想要唯一的东西,它属于需要唯一的内含元素。
这是因为一个元素的有效性只取决于它的内容,而不取决于它的上下文。如果两个X对Z有相同的值,那么包含的Y才是无效的。