Considérez le schéma suivant:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Root">
<xs:sequence>
<xs:element ref="Child" />
<xs:element name="Child2" type="Child" />
</xs:sequence>
<xs:attribute ref="Att" />
<xs:attribute name="Att2" type="Att" />
</xs:complexType>
<xs:complexType name="Child">
<xs:attribute ref="Att" />
</xs:complexType>
<xs:attribute name="Att" type="xs:integer" />
</xs:schema>
Le ref
à "Enfant" sur la ligne 6 échoue, tandis que le type
sur la ligne 7 valide. Pour l'attribut, le ref
réussit tandis que le type
échoue. J'essaie de comprendre pourquoi.
Ma compréhension de ref
était qu'il faisait simplement référence à un autre élément et spécifiait que vous vous attendiez à voir une instance du type référencé (avec le nom donné dans la définition) à cet emplacement. Évidemment, je me trompe, alors qu'est-ce que ref
signifie réellement?
En utilisant ref = ".." vous "collez" un élément/attribut existant défini à l'autre endroit. En utilisant type = ".." vous affectez une structure (définie dans complextype/simpletype) à un nouvel élément/attribut. Regardez ce qui suit:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tst="test" targetNamespace="test">
<xs:complexType name="Root">
<xs:sequence>
<xs:element ref="tst:Child" />
<xs:element name="Child2" type="tst:ChildType" />
</xs:sequence>
<xs:attribute ref="tst:AttRef" />
<xs:attribute name="Att2" type="tst:AttType" />
</xs:complexType>
<xs:complexType name="ChildType">
<xs:attribute ref="tst:AttRef" />
</xs:complexType>
<xs:element name="Child">
</xs:element>
<xs:simpleType name="AttType">
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
<xs:attribute name="AttRef" type="xs:integer" />
</xs:schema>
Dans un modèle de contenu, le xs:element
l'élément peut être soit:
(La même alternance nom/référence s'applique aux déclarations d'attribut et aux références d'attribut, et il existe une dichotomie similaire entre les définitions de type en ligne et les références aux types nommés.)
Dans votre exemple, il n'y a pas de déclaration de niveau supérieur pour un élément nommé Child, donc l'attribut ref
échoue. J'espère que ça aide.
La différence significative entre ref et type est qu'avec le type vous ne pouvez pas descendre plus bas d'un niveau, mais avec ref, vous pouvez utiliser un élément qui peut avoir un niveau supplémentaire et ainsi de suite.