此XML Schema中定义的名称为FKNotasAlumnos和FKNotasAsignaturas的主键不起作用,并在验证器中抛出此错误:
keyref 'FKNotasAlumnos' refers to out of scope key/unique
keyref 'FKNotasAsignaturas' refers to out of scope key/unique
架构格式良好且有效。我在这里写下来:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="bd">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="alumno" maxOccurs="unbounded"/>
<xsd:element ref="nota" maxOccurs="unbounded"/>
<xsd:element ref="asignatura" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="alumno">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="cod" type="xsd:string"/>
<xsd:element name="apenom" type="xsd:string"/>
<xsd:element name="direc" type="xsd:string"/>
<xsd:element name="pobla" type="xsd:string"/>
<xsd:element name="telef" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="PKAlumnos">
<xsd:selector xpath="."/>
<xsd:field xpath="cod"/>
</xsd:key>
</xsd:element>
<xsd:element name="asignatura">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="cod" type="xsd:string"/>
<xsd:element name="nombre" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="PKAsignaturas">
<xsd:selector xpath="."/>
<xsd:field xpath="cod"/>
</xsd:key>
</xsd:element>
<xsd:element name="nota">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="idNota">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="alum" type="xsd:string"/>
<xsd:element name="asig" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="calificacion" type="xsd:float"/>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="PKNotas">
<xsd:selector xpath=".//idNota"/>
<xsd:field xpath="alum"/>
<xsd:field xpath="asig"/>
</xsd:key>
<xsd:keyref name="FKNotasAlumnos" refer="PKAlumnos">
<xsd:selector xpath="bd/alumno/cod"/>
<xsd:field xpath="."/>
</xsd:keyref>
<xsd:keyref name="FKNotasAsignaturas" refer="PKAsignaturas">
<xsd:selector xpath="bd/asignatura/cod"/>
<xsd:field xpath="."/>
</xsd:keyref>
</xsd:element>
</xsd:schema>
我测试模式的“所谓”有效XML如下:
<?xml version="1.0"?>
<bd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///d:/DAW/Lenguajes%20de%20Marcas/Tarea%206/tarea6.xsd">
<alumno>
<cod>n12344345</cod>
<apenom>Alcalde García, Luis</apenom>
<direc>Las Manos, 24</direc>
<pobla>Lamadrid</pobla>
<telef>942756645</telef>
</alumno>
<alumno>
<cod>n43483437</cod>
<apenom>González Pérez, Olga</apenom>
<direc>Miraflor 28 - 3A</direc>
<pobla>Torres</pobla>
<telef>942564355</telef>
</alumno>
<alumno>
<cod>n88234942</cod>
<apenom>Fernández Díaz, María</apenom>
<direc>Luisa Fernanda 53</direc>
<pobla>Miera</pobla>
<telef>942346945</telef>
</alumno>
<nota>
<idNota>
<alum>n12344345</alum>
<asig>a1</asig>
</idNota>
<calificacion>4</calificacion>
</nota>
<nota>
<idNota>
<alum>n43483437</alum>
<asig>a1</asig>
</idNota>
<calificacion>5</calificacion>
</nota>
<nota>
<idNota>
<alum>n88234942</alum>
<asig>a1</asig>
</idNota>
<calificacion>8</calificacion>
</nota>
<nota>
<idNota>
<alum>n12344345</alum>
<asig>a2</asig>
</idNota>
<calificacion>10</calificacion>
</nota>
<nota>
<idNota>
<alum>n43483437</alum>
<asig>a2</asig>
</idNota>
<calificacion>7</calificacion>
</nota>
<nota>
<idNota>
<alum>n88234942</alum>
<asig>a2</asig>
</idNota>
<calificacion>6</calificacion>
</nota>
<nota>
<idNota>
<alum>n12344345</alum>
<asig>a3</asig>
</idNota>
<calificacion>3</calificacion>
</nota>
<nota>
<idNota>
<alum>n88234942</alum>
<asig>a3</asig>
</idNota>
<calificacion>6</calificacion>
</nota>
<nota>
<idNota>
<alum>n12344345</alum>
<asig>a4</asig>
</idNota>
<calificacion>8</calificacion>
</nota>
<nota>
<idNota>
<alum>n43483437</alum>
<asig>a4</asig>
</idNota>
<calificacion>4</calificacion>
</nota>
<nota>
<idNota>
<alum>n12344345</alum>
<asig>a5</asig>
</idNota>
<calificacion>6</calificacion>
</nota>
<nota>
<idNota>
<alum>n12344345</alum>
<asig>a6</asig>
</idNota>
<calificacion>9</calificacion>
</nota>
<asignatura>
<cod>a1</cod>
<nombre>FH</nombre>
</asignatura>
<asignatura>
<cod>a2</cod>
<nombre>FOL</nombre>
</asignatura>
<asignatura>
<cod>a3</cod>
<nombre>ISO</nombre>
</asignatura>
<asignatura>
<cod>a4</cod>
<nombre>LMSGI</nombre>
</asignatura>
<asignatura>
<cod>a5</cod>
<nombre>PAR</nombre>
</asignatura>
<asignatura>
<cod>a6</cod>
<nombre>GBD</nombre>
</asignatura>
</bd>
注意:根元素未显示,编辑器将它们取出。
你有什么可能失败的线索吗?这让我疯了!三江源!
答案 0 :(得分:1)
可视化键的范围可能有所帮助...... XSD约束的范围限定为包含元素;至于@ Dijkgraaf的观点,PKAlumnos
在alumno
元素之外是不可见的,这意味着它在nota
下定义的引用不可见;由于类似的原因,PKAsignaturas
也不可见......
以下是您的固定XSD:
突出点:
在适当的级别移动了所有主键。选择器的问题...... XSD规范将XPath“包含”在包含级别......这意味着.
选择当前节点,这正好是一个节点。在只有一个节点的节点集中,您不能违反主键...
修复了PKNotas
...错误的选择器... .//idNota
将始终返回一个节点,因为根据XSD,只有一个idNota子节点;如上所述,使用一个节点,您无法打破唯一约束......
从那里......故意破坏XML:
<?xml version="1.0"?>
<bd>
<alumno>
<cod>n12344345</cod>
<apenom>Alcalde García, Luis</apenom>
<direc>Las Manos, 24</direc>
<pobla>Lamadrid</pobla>
<telef>942756645</telef>
</alumno>
<alumno>
<cod>n12344345</cod>
<apenom>González Pérez, Olga</apenom>
<direc>Miraflor 28 - 3A</direc>
<pobla>Torres</pobla>
<telef>942564355</telef>
</alumno>
<alumno>
<cod>n88234942</cod>
<apenom>Fernández Díaz, María</apenom>
<direc>Luisa Fernanda 53</direc>
<pobla>Miera</pobla>
<telef>942346945</telef>
</alumno>
<nota>
<idNota>
<alum>n12344345-</alum>
<asig>a1</asig>
</idNota>
<calificacion>4</calificacion>
</nota>
<nota>
<idNota>
<alum>n43483437</alum>
<asig>a1-</asig>
</idNota>
<calificacion>5</calificacion>
</nota>
<nota>
<idNota>
<alum>n88234942</alum>
<asig>a1</asig>
</idNota>
<calificacion>8</calificacion>
</nota>
<nota>
<idNota>
<alum>n88234942</alum>
<asig>a2</asig>
</idNota>
<calificacion>10</calificacion>
</nota>
<nota>
<idNota>
<alum>n43483437</alum>
<asig>a2</asig>
</idNota>
<calificacion>7</calificacion>
</nota>
<nota>
<idNota>
<alum>n88234942</alum>
<asig>a2</asig>
</idNota>
<calificacion>6</calificacion>
</nota>
<nota>
<idNota>
<alum>n12344345</alum>
<asig>a3</asig>
</idNota>
<calificacion>3</calificacion>
</nota>
<nota>
<idNota>
<alum>n88234942</alum>
<asig>a3</asig>
</idNota>
<calificacion>6</calificacion>
</nota>
<nota>
<idNota>
<alum>n12344345</alum>
<asig>a4</asig>
</idNota>
<calificacion>8</calificacion>
</nota>
<nota>
<idNota>
<alum>n43483437</alum>
<asig>a4</asig>
</idNota>
<calificacion>4</calificacion>
</nota>
<nota>
<idNota>
<alum>n12344345</alum>
<asig>a5</asig>
</idNota>
<calificacion>6</calificacion>
</nota>
<nota>
<idNota>
<alum>n12344345</alum>
<asig>a6</asig>
</idNota>
<calificacion>9</calificacion>
</nota>
<asignatura>
<cod>a1</cod>
<nombre>FH</nombre>
</asignatura>
<asignatura>
<cod>a2</cod>
<nombre>FOL</nombre>
</asignatura>
<asignatura>
<cod>a3</cod>
<nombre>ISO</nombre>
</asignatura>
<asignatura>
<cod>a4</cod>
<nombre>LMSGI</nombre>
</asignatura>
<asignatura>
<cod>a5</cod>
<nombre>PAR</nombre>
</asignatura>
<asignatura>
<cod>a1</cod>
<nombre>FH</nombre>
</asignatura>
</bd>
会给出这些错误消息:
加载[]时发生错误,第17行位置4有一个 'PKAlumnos'键的重复键序列'n12344345'或唯一 身份约束。
加载[],第66行位置时发生错误 5'PKNotas'有一个重复的键序列'n88234942 a2' 密钥或唯一身份约束。
加载[]时出错, 第136行位置4有一个重复的键序列'a1' 'PKAsignaturas'密钥或唯一身份约束。
发生错误 加载[]时,第137行位置3键序列'n43483437'中 'PKAlumnos'Keyref未能引用某些关键字。
发生错误 loading [],第137行位置3键序列'n12344345-'in 'PKAlumnos'Keyref未能引用某些关键字。
发生错误 loading [],第137行位置3键序列'a1-'in 'PKAsignaturas'Keyref无法引用某些键。
发生错误 加载[]时,第137行位置3键序列'a6'中 'PKAsignaturas'Keyref无法引用某些密钥。
和XSD(固定):
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="bd">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="alumno" maxOccurs="unbounded"/>
<xsd:element ref="nota" maxOccurs="unbounded"/>
<xsd:element ref="asignatura" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="PKAlumnos">
<xsd:selector xpath="alumno"/>
<xsd:field xpath="cod"/>
</xsd:key>
<xsd:key name="PKAsignaturas">
<xsd:selector xpath="asignatura"/>
<xsd:field xpath="cod"/>
</xsd:key>
<xsd:key name="PKNotas">
<xsd:selector xpath="nota/idNota"/>
<xsd:field xpath="alum"/>
<xsd:field xpath="asig"/>
</xsd:key>
</xsd:element>
<xsd:element name="alumno">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="cod" type="xsd:string"/>
<xsd:element name="apenom" type="xsd:string"/>
<xsd:element name="direc" type="xsd:string"/>
<xsd:element name="pobla" type="xsd:string"/>
<xsd:element name="telef" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="asignatura">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="cod" type="xsd:string"/>
<xsd:element name="nombre" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="nota">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="idNota">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="alum" type="xsd:string"/>
<xsd:element name="asig" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="calificacion" type="xsd:float"/>
</xsd:sequence>
</xsd:complexType>
<xsd:keyref name="FKNotasAlumnos" refer="PKAlumnos">
<xsd:selector xpath="idNota"/>
<xsd:field xpath="alum"/>
</xsd:keyref>
<xsd:keyref name="FKNotasAsignaturas" refer="PKAsignaturas">
<xsd:selector xpath="idNota"/>
<xsd:field xpath="asig"/>
</xsd:keyref>
</xsd:element>
</xsd:schema>
使用其等效数据集(关系)视图(遗憾的是,XSD约束不可逆):
还有一件事......尽量避免在此类型(域)的XSD中使用float
...它与精度有关...请改用xsd:decimal。
答案 1 :(得分:0)
KeyRef需要与他们所指的Keys处于相同的范围。
e.g。
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="bd">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="alumno" maxOccurs="unbounded"/>
<xsd:element ref="nota" maxOccurs="unbounded"/>
<xsd:element ref="asignatura" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="alumno">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="cod" type="xsd:string"/>
<xsd:element name="apenom" type="xsd:string"/>
<xsd:element name="direc" type="xsd:string"/>
<xsd:element name="pobla" type="xsd:string"/>
<xsd:element name="telef" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="PKAlumnos">
<xsd:selector xpath="."/>
<xsd:field xpath="cod"/>
</xsd:key>
<xsd:keyref name="FKNotasAlumnos" refer="PKAlumnos">
<xsd:selector xpath="bd/alumno/cod"/>
<xsd:field xpath="."/>
</xsd:keyref>
</xsd:element>
<xsd:element name="asignatura">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="cod" type="xsd:string"/>
<xsd:element name="nombre" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="PKAsignaturas">
<xsd:selector xpath="."/>
<xsd:field xpath="cod"/>
</xsd:key>
<xsd:keyref name="FKNotasAsignaturas" refer="PKAsignaturas">
<xsd:selector xpath="bd/asignatura/cod"/>
<xsd:field xpath="."/>
</xsd:keyref>
</xsd:element>
<xsd:element name="nota">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="idNota">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="alum" type="xsd:string"/>
<xsd:element name="asig" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="calificacion" type="xsd:float"/>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="PKNotas">
<xsd:selector xpath=".//idNota"/>
<xsd:field xpath="alum"/>
<xsd:field xpath="asig"/>
</xsd:key>
</xsd:element>
</xsd:schema>