web-dev-qa-db-fra.com

Quelle est la différence entre ref et type dans un schéma XML?

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?

18
Nigel Hawkins

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> 
20
Jirka Š.

Dans un modèle de contenu, le xs:element l'élément peut être soit:

  1. Une déclaration d'élément (donnant le nom et le type de l'élément) ou
  2. Une référence à une déclaration d'élément de niveau supérieur (en donnant le nom de l'élément comme moyen de l'identifier et en reportant la déclaration réelle pour le type).

(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.

3

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.

1
Buckeye