【问题标题】:Make content of element unique in xsd使元素的内容在 xsd 中唯一
【发布时间】:2020-05-02 17:58:51
【问题描述】:

我有一个元素:

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

    您可以使用以下 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:unique 元素有两个子元素:

    xsd:unique 元素必须包含以下内容(按顺序):

    • 一个且只有一个 xsd:selector 元素(包含一个 XPath 表达式,该表达式指定一组元素,字段指定的值在这些元素中必须是唯一的)
    • 一个或多个 xsd:field 元素(包含一个 XPath 表达式,该表达式指定对于选择器元素指定的元素集必须唯一的值)

    【讨论】:

      【解决方案2】:

      如果您希望 Y 中的每个 X 都对 Z 具有唯一值,那么:

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

      (b) 选择器应该是从 Y 开始选择 X 的路径表达式

      (c) 该字段应该是从 X 开始选择 Z 的路径表达式。

      因此,您所犯的根本错误是在错误的级别定义了约束。 xs:unique 不属于你想要唯一的东西,它属于它需要唯一的包含元素。

      这是因为元素的有效性仅取决于其内容,而不取决于其上下文。如果两个 X 的 Z 值相同,则包含的 Y 无效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多