2

我需要用一个标签 (A) 和一个属性 (A-Attr)、另一个标签 (B) 和另一个属性 (B-Attr) 和第三个标签 (C) 和两个属性 (A-Attr 和 B) 做一个模式-属性)。

我不知道我做错了什么。我认为它可能与 id 和 idref 有关,但我不知道如何解决它。

<xsd:element name="students">
    <xsd:complexType>
        <xsd:sequence>
            <!-- Elemento que contendrá los alumnos, solo puede haber 1 -->
            <xsd:element maxOccurs="1" ref="students"/> 
            <!-- Elemento que contendrá las asignaturas, solo puede haber 1 -->
            <xsd:element maxOccurs="1" ref="cursos"/>
            <!-- Elemento que contendrá las notas, solo puede haber 1 -->  
            <xsd:element maxOccurs="1" ref="grades"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
<!-- Todo lo relacionado con alumnos, el elemento alumnos tendrá los elementos alumno que hagan falta-->
<xsd:element name="students">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" ref="student"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
<!-- El elemento alumno tiene 4 elementos y un atributo con el codigo, que sera la clave primaria -->
<xsd:element name="student">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="1" ref="namelastname"/>
            <xsd:element maxOccurs="1" ref="adress"/>
            <xsd:element maxOccurs="1" ref="number"/>
            <xsd:element maxOccurs="1" ref="tel"/>
        </xsd:sequence>
        <xsd:simpleContent>
            <xsd:extension base="xs:string">
                <xsd:attribute name="cod_student" use="required" type="xs:ID">
                    <xsd:restriction base="xs:string">
                        <xsd:pattern value="[a-z][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"/>
                    </xsd:restriction>
                </xsd:attribute>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
</xsd:element>

<xsd:element name="namelastname" type="xs:string"/>
<xsd:element name="adress" type="xs:string"/>
<xsd:element name="number" type="xs:string"/>
<xsd:element name="tel" type="xs:string"/>

<xsd:element name="cursos">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" ref="curso"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

<xsd:element name="curso">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="1" ref="name"/>
        </xsd:sequence>
        <xsd:simpleContent>
            <xsd:extension base="xs:string">
                <xsd:attribute name="cod_asig" use="required" type="xs:ID">
                    <xsd:restriction base="xs:string">
                        <xsd:pattern value="[a-z][0-9]"/>
                    </xsd:restriction>
                </xsd:attribute>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
</xsd:element>

<xsd:element name="name" type="xs:string"/>

<xsd:element name="grades">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" ref="grade"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

<xsd:element name="grade">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="1" ref="points"/>
        </xsd:sequence>
        <xsd:simpleContent>
            <xsd:extension base="xs:string">
                <xsd:attribute name="stud" use="required" type="xs:IDREF"/>
                <xsd:attribute name="grad" use="required" type="xs:IDREF"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
</xsd:element>

<xsd:element name="points" type="xs:string"/>

4

1 回答 1

1

xs:ID并且xs:IDREF是从 DTD 验证继承的类型,并且 XML Schema 以兼容的语义接管。它们的语义是 ID 在整个 XML 文档中必须是唯一的,在所有元素中,无论它们的名称是什么。这尤其意味着,当预期 A 时,第三个标签 C 可能错误地引用 B,反之亦然,因此这可能导致不一致。

更细粒度的键和外键可以而且应该通过使用更现代和特定于 XML 模式的xs:keyxs:keyRef. 有一些StackOverflow 问题可以解释这些问题。

于 2017-05-22T08:51:12.900 回答