【问题标题】:XML Schema: keyref with optional fieldXML Schema:带有可选字段的 keyref
【发布时间】:2016-02-24 01:26:02
【问题描述】:

我想知道是否可以使用带有可选字段的 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)。

编辑:在本例中忽略命名空间,我对所有内容都使用了默认命名空间...

【问题讨论】:

    标签: xml xsd keyref minoccurs


    【解决方案1】:

    我希望我正确理解了您的问题。在您的架构中,您需要将&lt;sequence&gt; 包含在&lt;complexType&gt; 中,并且您需要关闭指向“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>
    

    【讨论】:

    • 我已经修复了架构。无论如何,这可以验证,因为属性“名称”也丢失了,但我需要它。我为 name 属性添加了 'use="required"'。
    • 如果你在模式中添加 use="required" 应该可以工作。仍然不需要指定 subSubElem。我更新了解决方案。
    • 如果仍有问题,请给我们一个您希望验证的 XML 示例。下次请在问题中包含您的所有要求,并且不要以使答案过时的方式更新您的问题。
    • 对不起,这似乎是验证器中的一个错误:issues.apache.org/jira/browse/XERCESJ-682。我希望验证的 XML 正是您提供的那个。
    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 2017-04-06
    • 2011-12-22
    • 1970-01-01
    • 2021-10-06
    • 2022-08-11
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多