Cela semble simple mais des erreurs, il y'en a pleines.
[0] Les éléments key et keyref ne peuvent apparaître et prennent un sens que comme enfant d'une xsd:element et convenablement dans le élément emboîtant les éléments en questions. Ici, il faut les placer dans xsd:element de root.
1 2 3 4
| <xsd:element name="root">
<!-- etc etc -->
<!-- xsd:key, xsd:keyref sont placés ici -->
</xsd:element> |
[1] Les clés sont mal conçues en deux sens.
[1.1] Ce ne sont pas d'attributs, professionId et studentId, ils sont des enfants directed de root. Il faut éliminer le signe @.
[1.2] Et puis, là c'est plus difficile à comprendre. Les xpaths des selector et field ne connaient pas le namespace par défaut; il faut les prefixés et pour ce but il faut rajouter la déclaration pour ça dans la racine xsd:schema.
1 2 3 4 5
| <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="targetNamespaceURI"
xmlns="targetNamespaceURI"
elementFormDefault="qualified"
xmlns:tns="targetNamespaceURI"> |
Après, les clés et les ref sont écrits comme ça, éliminé en plus les points et / inutiles.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <xsd:key name="professorK">
<xsd:selector xpath="tns:professor"/>
<xsd:field xpath="tns:professorId"/>
</xsd:key>
<xsd:key name="studentK">
<xsd:selector xpath="tns:student"/>
<xsd:field xpath="tns:studentId"/>
</xsd:key>
<xsd:keyref name="professorRefstudent " refer="studentK">
<xsd:selector xpath="tns:professor "/>
<xsd:field xpath="tns:teaches"/>
</xsd:keyref>
<xsd:keyref name="studentRefprofessor " refer="professorK">
<xsd:selector xpath="tns:student "/>
<xsd:field xpath="tns:teachedby"/>
</xsd:keyref> |
[2] Et puis, encore une chose difficile. Il faut les types de clé et clé ref s'accordent les unes les autres. xsd:integer ne peut pas s'accorder avec xsd:string parce qu'ils ne se dérivent pas. Dans le cas-ci, il vaut mieux les accorder par xsd:integer. Pour ce fait, il faut s'écrire les teaches et teachedby.
<xsd:element name="teaches" type="xsd:integer" maxOccurs="unbounded"/>
et
<xsd:element name="teachedby" type="xsd:integer" maxOccurs="unbounded"/>
[3] Et puis les cardinalité de professor et student. Comme s'écrits ils ne peuvent que s'apparaître une fois ce qui est une peu contre-productif. Je pense vous devriez s'entendre par multiple au lieu qu'une.
<xsd:element name="professor" maxOccurs="unbounded">
et
<xsd:element name="student" maxOccurs="unbounded">
Voilà et il doit commencer à fonctionner.
Partager