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.Order
: Permet de réordonner les noeuds selon l’ordre croissant de cet attribut après la fusion.
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 on veut la redéfinir entièrement. -
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 queMERGE_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).
Order
Certains noeuds sont automatiquement réordrés une fois qu’ils ont été entièrement mergés (<Unit>
,<Elem>
,…). Il suffit donc d’ajouter cet attribut avec une valeur numérique pour que les noeuds soient ordrés de manière croissante.
Si l’attribut n’est pas spécifié, sa valeur par défaut vaut 50
.
A noter que le tri est conservatif: si plusieurs noeuds ont la même valeur pour cet attribut, l’ordre sera le même que celui déclaré.
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.
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" />
</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="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>