让元素的内容在xsd中是唯一的

问题描述 投票:0回答:1

我有一个元素。

<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>

我如何做到这一点?

xml xsd
1个回答
1
投票

你可以用下面的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表达式,该表达式指定了选择器元素所指定的元素集的值必须是唯一的。

0
投票

如果你想让Y中的每一个X对Z有一个唯一的值,那么。

(a)Y的声明应保持: xs:unique 约束

(b) 选择器应该是一个路径表达式,从Y开始选择X。

三)字段应该是一个路径表达式,从X开始选择Z。

所以你犯的根本错误是在错误的层次上定义了约束。xs:unique 不属于你想要唯一的东西,它属于需要唯一的内含元素。

这是因为一个元素的有效性只取决于它的内容,而不取决于它的上下文。如果两个X对Z有相同的值,那么包含的Y才是无效的。

© www.soinside.com 2019 - 2024. All rights reserved.