XSD外键不起作用

时间:2014-01-22 21:25:09

标签: xml validation xsd

此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>

注意:根元素未显示,编辑器将它们取出。

你有什么可能失败的线索吗?这让我疯了!

三江源!

2 个答案:

答案 0 :(得分:1)

可视化键的范围可能有所帮助...... XSD约束的范围限定为包含元素;至于@ Dijkgraaf的观点,PKAlumnosalumno元素之外是不可见的,这意味着它在nota下定义的引用不可见;由于类似的原因,PKAsignaturas也不可见......

enter image description here

以下是您的固定XSD:

enter image description here

突出点:

  • 在适当的级别移动了所有主键。选择器的问题...... 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约束不可逆):

enter image description here

还有一件事......尽量避免在此类型(域)的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>