Attributs spéciaux (XML)

Dans les fichiers XML, il y a deux attributs spéciaux permettant de piloter le comportement du merger:

  • MergeType: Comportement à adopter entre le noeud parent et le noeud courant.
  • MergeBefore: Indique que le noeud doit être inséré avant le noeud avec l’id spécifié.
  • MergeAfter: Indique que le noeud doit être inséré avant le noeud avec l’id spécifié.

MergeType

Cet attribut peut prendre les valeurs suivantes:

  • OVERRIDE: le noeud écrase complètement le parent. Le processus ne descend pas des les noeuds enfants du noeud courant (puisque remplacé).

    C’est typiquement le comportement par défaut lorsqu’une tâche (<Task>) est redéclarée dans un module, car généralement elle est entièrement redéfinie.

  • MERGE_OVERRIDE: le noeud courant est mergé avec celui du parent. Lest attributs du noeud courant écrasent ceux du parents s’ils existent. Le processus continue ensuite dans les noeuds enfants.

    C’est le comportement par défaut si l’attribut MergeType n’est pas défini et si aucune règle n’a été spécifiée.

  • MERGE_IGNORE: idem que MERGE_OVERRIDE sauf que les attributs du noeud courant sont ignorés et n’apparaîtront donc pas dans la version finale mergée. Le processus continue dans les noeuds enfants.

  • NONE: le noeud courant est simplement ignoré et le parent est conservé tel quel. Le processus ne descend pas dans les noeuds enfants.

  • DELETE: les deux noeuds (parent et courant) sont supprimés et n’apparaissent pas dans la version finale.

A noter que cette valeur ne se propage pas à travers les noeuds. Ainsi, si le noeud parent est spécifié avec MERGE_IGNORE, le processus utilisera tout de même MERGE_OVERRIDE sur les noeuds enfants (sauf si l’attribut est redéfini ou une règle spécifie un autre comportement).

MergeBefore et MergeAfter

Il est parfois utile lors du merge de préciser exactement l’endroit ou un nouveau noeud doit être inséré. Ces deux attributs permettent de spécifier un identifiant d’un noeud au même niveau.

Suppression d’attribut

Il est possible de supprimer un attribut en utilisant le suffixe .DELETE. A ce moment-là, la valeur n’a aucune importance et l’attribut se fera supprimer lors de la fusion.

Exemples

OVERRIDE

<!-- parent -->
<Combos>
  <Combo ID="SAMPLE_COMBO">
    <Elem ID="Q" Label="Quotidien" />
    <Elem ID="H" Label="Hebdomadaire" />
    <Elem ID="M" Label="Mensuel" />
    <Elem ID="A" Label="Annuel" />
  </Combo>
</Combos>

<!-- courant -->
<Combos>
  <Combo ID="SAMPLE_COMBO" InternLabel="Some combo" MergeType="OVERRIDE">
    <Elem ID="Q" Label="Journalier" />
    <Elem ID="B" Label="Bi-annuel" />
  </Combo>
</Combos>

<!-- résultat -->
<Combos>
  <Combo ID="SAMPLE_COMBO" InternLabel="Some combo">
    <Elem ID="Q" Label="Journalier" />
    <Elem ID="B" Label="Bi-annuel" />
  </Combo>
</Combos>

MERGE_OVERRIDE

<!-- parent -->
<Combos>
  <Combo ID="SAMPLE_COMBO">
    <Elem ID="Q" Label="Quotidien" />
    <Elem ID="H" Label="Hebdomadaire" />
    <Elem ID="M" Label="Mensuel" />
    <Elem ID="A" Label="Annuel" Extra="info" />
  </Combo>
</Combos>

<!-- courant -->
<Combos>
  <Combo ID="SAMPLE_COMBO" InternLabel="Some combo" MergeType="MERGE_OVERRIDE">
    <Elem ID="Q" Label="Journalier" />
    <Elem ID="H2" Label="Bi-hebdomadaire" MergeAfter="H" />
    <Elem ID="M2" Label="Bi-mensuel" MergeBefore="A" />
    <Elem ID="A" Extra.DELETE="" />
    <Elem ID="B" Label="Bi-annuel" />
  </Combo>
</Combos>

<!-- résultat -->
<Combos>
  <Combo ID="SAMPLE_COMBO" InternLabel="Some combo">
    <Elem ID="Q" Label="Journalier" />
    <Elem ID="H" Label="Hebdomadaire" />
    <Elem ID="H2" Label="Bi-hebdomadaire" />
    <Elem ID="M" Label="Mensuel" />
    <Elem ID="M2" Label="Bi-mensuel" />
    <Elem ID="A" Label="Annuel" />
    <Elem ID="B" Label="Bi-annuel" />
  </Combo>
</Combos>

MERGE_IGNORE

<!-- parent -->
<Combos>
  <Combo ID="SAMPLE_COMBO">
    <Elem ID="Q" Label="Quotidien" />
    <Elem ID="H" Label="Hebdomadaire" />
    <Elem ID="M" Label="Mensuel" />
    <Elem ID="A" Label="Annuel" />
  </Combo>
</Combos>

<!-- courant -->
<Combos>
  <Combo ID="SAMPLE_COMBO" InternLabel="Some combo" MergeType="MERGE_IGNORE">
    <Elem ID="Q" Label="Journalier" />
    <Elem ID="B" Label="Bi-annuel" />
  </Combo>
</Combos>

<!-- résultat -->
<Combos>
  <Combo ID="SAMPLE_COMBO">
    <Elem ID="Q" Label="Journalier" />
    <Elem ID="H" Label="Hebdomadaire" />
    <Elem ID="M" Label="Mensuel" />
    <Elem ID="A" Label="Annuel" />
    <Elem ID="B" Label="Bi-annuel" />
  </Combo>
</Combos>

NONE

<!-- parent -->
<Combos>
  <Combo ID="SAMPLE_COMBO">
    <Elem ID="Q" Label="Quotidien" />
    <Elem ID="H" Label="Hebdomadaire" />
    <Elem ID="M" Label="Mensuel" />
    <Elem ID="A" Label="Annuel" />
  </Combo>
</Combos>

<!-- courant -->
<Combos>
  <Combo ID="SAMPLE_COMBO" InternLabel="Some combo" MergeType="NONE">
    <Elem ID="Q" Label="Journalier" />
    <Elem ID="B" Label="Bi-annuel" />
  </Combo>
</Combos>

<!-- résultat -->
<Combos>
  <Combo ID="SAMPLE_COMBO">
    <Elem ID="Q" Label="Quotidien" />
    <Elem ID="H" Label="Hebdomadaire" />
    <Elem ID="M" Label="Mensuel" />
    <Elem ID="A" Label="Annuel" />
  </Combo>
</Combos>

DELETE

<!-- parent -->
<Combos>
  <Combo ID="SAMPLE_COMBO">
    <Elem ID="Q" Label="Quotidien" />
    <Elem ID="H" Label="Hebdomadaire" />
    <Elem ID="M" Label="Mensuel" />
    <Elem ID="A" Label="Annuel" />
  </Combo>
</Combos>

<!-- courant -->
<Combos>
  <Combo ID="SAMPLE_COMBO" MergeType="DELETE" />
</Combos>

<!-- résultat -->
<Combos>
</Combos>

Order

<!-- parent -->
<Combos>
  <Combo ID="SAMPLE_COMBO">
    <!-- L'attribut Order n'étant pas spécifié, sa valeur par défaut vaut 50 -->
    <Elem ID="Q" Label="Quotidien" />
    <Elem ID="H" Label="Hebdomadaire" />
    <Elem ID="M" Label="Mensuel" />
    <Elem ID="A" Label="Annuel" />
  </Combo>
</Combos>

<!-- courant -->
<Combos>
  <Combo ID="SAMPLE_COMBO" InternLabel="Some combo" MergeType="MERGE_OVERRIDE">
    <Elem ID="D" Label="Demi-journée" Order="25" />
    <Elem ID="Q" Label="Journalier" Order="50" />
    <Elem ID="B" Label="Bi-annuel" Order="75" />
  </Combo>
</Combos>

<!-- résultat -->
<Combos>
  <Combo ID="SAMPLE_COMBO">
    <Elem ID="D" Label="Demi-journée" Order="25" />
    <Elem ID="Q" Label="Journalier" Order="50" /> <!-- le tri est conservatif -->
    <Elem ID="H" Label="Hebdomadaire" />
    <Elem ID="M" Label="Mensuel" />
    <Elem ID="A" Label="Annuel" />
    <Elem ID="B" Label="Bi-annuel" Order="75" />
  </Combo>
</Combos>