1

您可以使用 XSD 将 XML 元素的内容限制为等于其祖父元素吗?这样就可以通过验证:

<pupil>
<pupilid>342424</pupilid>
<name>John Smith</name>
<assessment>
<assessmentid>1</assessmentid>
<pupilid>342424</pupilid>
</assessment>
</pupil>

这验证失败

<pupil>
<pupilid>342424</pupilid>
<name>John Smith</name>
<assessment>
<assessmentid>1</assessmentid>
<pupilid>666</pupilid>
</assessment>
</pupil>
4

1 回答 1

2

如果您将上述内容视为参照完整性,则可以这样做。可以轻松地说存在冗余信息,但由于模型重用,我也看到了它。

这就是您的 XML 的样子:

在此处输入图像描述

这就是 XSD 的样子:

在此处输入图像描述

来源:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="pupil">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="pupilid" type="xsd:unsignedInt"/>
                <xsd:element name="name" type="xsd:string"/>
                <xsd:element name="assessment">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="assessmentid" type="xsd:unsignedByte"/>
                            <xsd:element name="pupilid" type="xsd:unsignedInt"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:key name="PK">
            <xsd:selector xpath="pupilid"/>
            <xsd:field xpath="."/>
        </xsd:key>
        <xsd:keyref name="FK" refer="PK">
            <xsd:selector xpath="assessment/pupilid"/>
            <xsd:field xpath="."/>
        </xsd:keyref>
    </xsd:element>
</xsd:schema>

您的第一个 XML 将通过验证,而第二个可能会产生:

Error occurred while loading [], line 8 position 3 The key sequence '666' in Keyref fails to refer to some key. xsd-restrict-content-to-be-equal-to-grandparent-if-it-is-present.xml is XSD 1.0 invalid.

只要可以将此类约束建模为类似于对数据库人员的参照完整性意味着什么,那么 key/unique 和 keyref 就可以提供帮助。

对于更一般的共同约束,您必须要么迁移到 XSD 1.1,要么在 XSD 1.0 之外使用 Schematron。

于 2013-09-24T13:22:10.880 回答