5.7.7. Généralisation

On peut généraliser un contenu spécialisé vers un type ancêtre. Le processus de généralisation peut conserver les informations du niveau de spécialisation précédent afin de permettre des allers-retours entre les formes spécialisée et non spécialisée du même contenu.

La généralisation peut avoir lieu soit dans le cadre d'une migration (par exemple, pour retirer une spécialisation râtée), soit pour un aller-retour temporaire (par exemple, pour déplacer un contenu au travers d'un processus incompatible avec une spécialisation et qui ne fonctionne qu'avec les instances du type structurel de base). Pour une généralisation de migration, les attributs class et domains devraient être absents du document d'instance généralisé, de manière à utiliser les valeurs par défaut dans la définition DTD générale ou le schéma. Pour une généralisation en aller-retour, les attributs class et domains devraient retenir les valeurs spécialisées originales dans le document d'instance généralisé.

Un document DITA peut contenir un mélange de balises provenant d'au moins un type structurel et de zéro ou plus domaines. Les types structuraux et les domaines permis dans un type de document particulier sont définis par l'interpréteur du type de document (document type shell).

Lors de la généralisation du document, le généralisateur (generalizer) peut choisir de laisser tel quel un type structurel ou un domaine, ou de généraliser ce type ou domaine vers l'un de ses ancêtres.

Le généralisateur peut fournir la source et la cible de chaque généralisation : par exemple, généraliser d'un élément <reference> vers un élément <topic>. Le généralisateur peut spécifier plusieurs cibles en une seule passe : par exemple, généraliser de <reference> vers <topic>, et de ui-d vers topic. Si la source et la cible ne sont pas fournies, on suppose une généralisation de tous les types structuraux vers la base (<topic> ou <map>), et aucune généralisation pour les domaines.

Le généralisateur peut également fournir le type de document cible. Si le type de document cible n'est pas fourni, le document généralisé ne contiendra pas de référence de définition DTD ou de schéma. Il sera peut-être possible à l'avenir de générer automatiquement un interpréteur de type de document et un type de document cible fondés sur les attributs class et domains dans le document généralisé.

Le processus de généralisation devrait être capable de traiter les cas où il reçoit seulement les sources de généralisation (auquel cas les types sources désignés sont généralisés vers <topic> ou <map>), seulement les cibles de généralisation (auquel cas tous les descendants de la cible sont généralisés vers cette cible), ou les deux (auquel cas seuls les descendants spécifiés de la cible sont généralisés vers cette cible).

Pour chaque instance de type structurel, le processus de généralisation vérifie si l'instance est une candidate pour la généralisation, ou si celle-ci a des domaines qui sont candidats pour la généralisation. Il importe d'être sélectif sur les instances de type structurel à traiter : si le processus généralise simplement chaque élément d'après les valeurs de son attribut class, une instruction de généraliser un élément <reference> vers <topic> pourrait aboutir à un thème de type APIReference avec un modèle de contenu invalide, puisque tous les éléments qu'il réutilise de <reference> auront été renommés en équivalents du niveau <topic>.

L'attribut class de l'élément racine du type structurel est vérifié avant de généraliser les types structuraux :

Cible et source Source non spécifiée Source spécifiée
Cible non spécifiée Généraliser ce type structurel vers son ancêtre de base. Vérifier si l'élément racine du thème correspond à une source spécifiée ; si c'est le cas, généraliser vers son ancêtre de base, sinon ignorer l'instance de type structurel à moins qu'elle n'ait des domaines à généraliser.
Cible spécifiée Vérifier si l'attribut class contient la cible ; si c'est le cas, généraliser vers la cible, sinon passer l'instance de type structurel à moins qu'elle n'ait des domaines à généraliser. Si l'élément racine correspond à une source spécifiée mais que son attribut class ne contient pas la cible, émettre un message d'erreur. Si l'élément racine correspond à une source spécifiée et que son attribut class contient la cible, généraliser vers la cible. Sinon ignorer l'instance de type structurel à moins qu'elle n'ait des domaines à généraliser.

L'attribut domains de l'élément racine du type structurel est vérifié avant de généraliser les domaines :

Cible et source Source non spécifiée Source spécifiée
Cible non spécifiée Ne pas généraliser les spécialisations de domaine dans ce type structurel. Véririer si l'attribut domains liste le domaine spécifié ; si c'est le cas, lancer la généralisation, sinon ignorer l'instance de type structurel à moins qu'elle ne soit elle-même une candidate à la généralisation.
Cible spécifiée Vérifier si l'attribut domains contient la cible ; si c'est le cas, généraliser vers la cible, sinon passer l'instance de type structurel à moins qu'elle ne soit elle-même une candidate à la généralisation. Si l'attribut domains correspond à une source spécifiée mais que la chaîne de valeur de domaine ne contient pas la cible, émettre un message d'erreur. Si l'attribut domains correspond à une source spécifiée et que la chaîne de valeur de domaine contient la cible, généraliser vers la cible. Sinon ignorer l'instance de type structurel à moins qu'elle ne soit elle-même une candidate à la généralisation.

Pour chaque élément dans une instance de type structurel candidate :

Cible et source Source non spécifiée Source spécifiée
Cible non spécifiée Si l'attribut class commence par un SIGNE MOINS « - » (partie d'un type structurel), renommer l'élément vers son équivalent ancêtre de base. Sinon l'ignorer. Vérifier si la dernière valeur de l'attribut class correspond à une source spécifiée ; si c'est le cas, généraliser vers son ancêtre de base, sinon ignorer l'élément.
Cible spécifiée Vérifier si l'attribut class contient la cible ; si c'est le cas, renommer l'élément vers la valeur associée à la cible, sinon ignorer l'élément. Si la dernière valeur de l'attribut class correspond à une source spécifiée mais que la valeur précédente n'inclut pas la cible, émettre un message d'erreur. Si la dernière valeur dans l'attribut class correspond à une source spécifiée et que la valeur précédente n'inclut pas la cible, renommer l'élément vers la valeurs associée à la cible. Sinon ignorer l'élément.

Pour le renommage des éléments pendant une généralisation en aller-retour, le processus de généralisation devrait préserver les valeurs de tous les attributs. Pour le renommage des éléments pendant une généralisation aller ou de migration, le processus devrait préserver les valeurs de tous les attributs sauf celles des attributs class et domains, celles-ci devant être fournies par le type de document cible.

  1. 5.7.7.1. Généralisation des attributs
    Les attributs spécialisés depuis props ou base peuvent être généralisés en utilisant une syntaxe de généralisation d'attribut spéciale. Les processus compatibles avec la spécialisation devraient être capables de reconnaître et de traiter à la fois les formes spécialisées et généralisées d'un attribut comme étant équivalentes dans leurs valeurs.
  2. 5.7.7.2. Généralisation de l'élément <foreign>
    Pendant la généralisation, les éléments DITA sont modifiés en fonction de la valeur de l'attribut class pour utiliser le nom d'un élément ancêtre. On ne peut pas le faire avec le contenu d'un élément <foreign> spécialisé parce que les éléments contenus ne sont pas des éléments DITA et n'ont pas d'attributs class.