如何使标签儿童独一无二?

时间:2012-07-09 10:58:00

标签: xml validation xsd schema

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

这是我的xml文件:

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

这是我的xsd for string tag:

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

1 个答案:

答案 0 :(得分: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>

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