[英]Make content of element unique in xsd
我有一个元素:
<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 并在第一个上失败。
xsd:unique元素有两个子元素:
xsd:unique 元素必须包含以下内容(按顺序):
- 一个也是唯一一个 xsd:selector 元素(包含一个 XPath 表达式,该表达式指定一组元素,字段指定的值必须在其中唯一)
- 一个或多个 xsd:field 元素(包含一个 XPath 表达式,该表达式指定对于选择器元素指定的元素集必须唯一的值)
如果您希望 Y 中的每个 X 对 Z 具有唯一值,则:
(a) Y 的声明应该持有xs:unique
约束
(b) 选择器应该是从 Y 开始选择 X 的路径表达式
(c) 该字段应该是从 X 开始选择 Z 的路径表达式。
因此,您所犯的根本错误是将约束定义在错误的级别。 xs:unique
不属于你想要唯一的东西,它属于它需要唯一的包含元素。
这是因为元素的有效性仅取决于其内容,而不取决于其上下文。 如果两个 X 的 Z 值相同,则包含的 Y 无效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.