繁体   English   中英

XML模式:带有可选字段的keyref

[英]XML Schema: keyref with optional field

我想知道是否可以将keyref元素与可选字段一起使用。

例如,鉴于以下模式:

<element name="myElement" type="myType">
    <complexType>
        <sequence>
            <element name="subElem">
                <complexType>
                    <attribute name="name" type="string"/>
                    <attribute name="type" type="string"/>
                </complexType>
            </element>
            <element name="subElem2">
                <complexType>
                    <sequence>
                        <element name="subSubElem" minOccurs="0">
                            <complexType>
                                <attribute name="type" type="string"/>
                            </complexType>
                        </element>
                    </sequence>
                    <attribute name="name" type="string" use="required"/>
                </complexType>
            </element>
        </sequence>
    </complexType>
    <key name="uniqueSubElem">
        <selector xpath="subElem"/>
        <field xpath="@name"/>
        <field xpath="@type"/>
    </key>
    <keyref name="uniqueSubElemRef" refer="uniqueSubElem">
        <selector xpath="subElem2"/>
        <field xpath="@name"/>
        <field xpath="subSubElem/@type"/>
    </keyref>
</element>

在此示例中,如果我未在XML中指定subSubElem,则验证器将抱怨:

Not enough values specified for <keyref name="uniqueSubElem"> identity constraint specified for element "myElement".

我需要minOccurs="0"和keyref约束,如果该字段不存在,根本就不希望执行任何检查(对于NULL FOREIGN KEYs)。

编辑:忽略此示例的名称空间,我对所有内容使用默认名称空间...

希望我能正确理解您的问题。 在您的架构中,您需要将<sequence>括在<complexType> ,并且需要关闭指向“ subSubElem / @ type”的字段:

<xs:element name="myElement">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="subElem">
                <xs:complexType>
                    <xs:attribute name="name" type="xs:string"/>
                    <xs:attribute name="type" type="xs:string"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="subElem2">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="subSubElem">
                            <xs:complexType>
                                <xs:attribute name="type" type="xs:string"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                    <xs:attribute name="name" type="xs:string" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:key name="uniqueSubElem">
        <xs:selector xpath="subElem"/>
        <xs:field xpath="@name"/>
        <xs:field xpath="@type"/>
    </xs:key>
    <xs:keyref name="uniqueSubElemRef" refer="uniqueSubElem">
        <xs:selector xpath="subElem2"/>
        <xs:field xpath="@name"/>
        <xs:field xpath="subSubElem/@type"/>
    </xs:keyref>
</xs:element>

此XML应该在不指定subSubElem的情况下进行验证:

<myElement>
    <subElem name="foo" type="bar"/>
    <subElem2 name="foo2"/>
</myElement>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM