【问题标题】:How to make tags children unique?如何使标签孩子独一无二?
【发布时间】:2012-07-10 15:59:43
【问题描述】:

如何在我的 xml 文件中的限制标签中禁止重复标签? 例如在我的 xml 文件中,我有两个语言环境标记,但它应该只有一个标记

这是我的 xml 文件:

    <app:string name="firstName">
        <app:restriction>
            <app:regex>^\w*$</app:regex>
            <app:type/>
            <app:locale/>
            <app:locale/>
        </app:restriction>
    </app:string>

这是我的字符串标签的xsd:

<xs:element name="string">
    <xs:complexType>
        <xs:complexContent>
            <xs:extension base="main:BaseType">
                <xs:sequence>
                    <xs:element name="restriction" type="main:StringRestriction" minOccurs="0"
                                maxOccurs="1"/>
                </xs:sequence>
                <xs:attribute name="lang" type="main:LocaleTypes"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:element>

<xs:complexType name="BaseType">
    <xs:attribute name="name" type="main:nameType" use="required"/>
    <xs:attribute name="readonly" type="xs:boolean" use="optional" default="true"/>
</xs:complexType>

<xs:complexType name="StringRestriction">
    <xs:complexContent>
        <xs:extension base="main:RestrictionBase">
            <xs:sequence>
                <xs:choice maxOccurs="1">
                    <xs:element type="xs:string" name="locale"/>
                    <xs:element type="xs:string" name="type"/>
                    <xs:element type="xs:string" name="regex"/>
                    <xs:element type="xs:string" name="maxLen"/>
                    <xs:element type="xs:string" name="minLen"/>
                </xs:choice>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

【问题讨论】:

    标签: xml validation xsd schema


    【解决方案1】:

    如果我正确理解,您需要一个架构来强制您的 restriction 标签包含不重复的标签。

    如果你用这个代替:

    <xs:sequence>
        <xs:choice maxOccurs="1">
            <xs:element type="xs:string" name="locale"/>
            <xs:element type="xs:string" name="type"/>
            <xs:element type="xs:string" name="regex"/>
            <xs:element type="xs:string" name="maxLen"/>
            <xs:element type="xs:string" name="minLen"/>
        </xs:choice>
    </xs:sequence>
    

    用这个:

    <xs:all minOccurs="0">
        <xs:element type="xs:string" name="locale"/>
        <xs:element type="xs:string" name="type"/>
        <xs:element type="xs:string" name="regex"/>
        <xs:element type="xs:string" name="maxLen"/>
        <xs:element type="xs:string" name="minLen"/>
    </xs:all>
    

    您的架构不允许在您的restriction 标记内重复locale 元素。 您可以在此处查看摘要:http://www.w3schools.com/schema/el_all.asp 除此之外,您还可以使用minOccursmaxOccurs 来强制某些元素始终出现,而其他元素则只是可选的。

    【讨论】:

    • sequence 是一个排序的列表,但我需要一个未排序的列表。所以我使用了有选择的序列
    • 在这种情况下,您可以将 xsd:sequence 元素替换为 xsd:all 元素。 xsd:all 指定子元素可以以任意顺序出现,并且每个子元素可以出现零次或一次。
    • 我编辑了答案,用 xsd:all 标签更改了 xsd:sequence 标签。
    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 2012-07-08
    • 2015-12-22
    • 1970-01-01
    相关资源
    最近更新 更多