Précédent

Table des matières

bas de page     

Suivant     


Table des matières abrégée
5 L'affinage et la résolution des propriétés
    5.1 Les valeurs spécifiées, calculées et réelles et l'héritage
    5.2 Le développement des raccourcis
    5.3 Le calcul des valeurs des propriétés correspondantes
    5.4 La correspondance entre une propriété simple et un trait
    5.5 La correspondance entre une propriété complexe et un trait
    5.6 La génération d'un trait non basé sur une propriété
    5.7 Les transformations basées sur des propriétés
    5.8 Le traitement Unicode BIDI
    5.9 Les expressions
    5.10 La librairie des fonctions de base
    5.11 Les types de données des propriétés

5 L'affinage et la résolution des propriétés

Lors de l'affinage, le jeu des propriétés, qui s'appliquent à un objet de mise en forme, est transformé en un jeu de traits, qui définit les contraintes sur le résultat de la mise en forme. Pour de nombreux traits, il y a une correspondance, un à un, avec une propriété ; pour d'autres traits, la transformation est plus complexe. Les détails de cette transformation sont exposés plus loin.

La première étape de l'affinage d'un objet de mise en forme donné est l'obtention de la valeur effective de chaque propriété qui s'appliquent à celui-ci. Toute propriété raccourcie, spécifiée pour un objet de mise en forme, est développée en propriétés individuelles. Ceci est décrit plus loin dans le chapitre [5.2 Le développemement des raccourcis]. Pour toute propriété, qui n'a pas été spécifiée sur un objet, c'est la valeur héritée (voir [5.1.4 L'héritage]) ou initiale, selon les cas, qui est retenue comme valeur effective. La deuxième étape consiste à transformer ce jeu de propriétés en traits.

Remarque :

Bien que le processus d'affinage soit décrit selon une suite d'étapes, c'est uniquement une commodité pour l'exposé, cela ne veut pas dire qu'il faille implémenter celles-ci séparément pour que la mise en œuvre soit conforme. Une mise en œuvre conforme se doit uniquement d'obtenir le même résultat.

5.1 Les valeurs spécifiées, calculées et réelles et l'héritage

Pour chaque propriété qui s'applique à un objet de mise en forme donné, il est nécessaire de déterminer la valeur de celle-ci. On distingue trois sortes de valeur : la valeur spécifié, la valeur calculée et la valeur réelle. La « valeur spécifiée », c'est celle qui est attribuée à l'objet de mise en forme lors du processus de construction de l'arbre. Une valeur spécifiée peut ne pas avoir une forme directement utilisable ; par exemple, ce peut être un pourcentage, ou une autre expression, qui doit être convertie en une valeur absolue. Une valeur qui résulte d'une telle conversion est appelée « valeur calculée ». Enfin, la valeur calculée peut ne pas être exploitable sur le média de sortie, elle peut nécessiter un ajustement, préalablement à son emploi dans le rendu. Par exemple, une largeur de ligne peut s'ajuster pour devenir un nombre entier de pixels dans le média de sortie. Cette valeur ajustée, c'est la « valeur réelle ».

5.1.1 Les valeurs spécifiées

La valeur spécifiée d'une propriété se détermine en utilisant les mécanismes suivants (par ordre de préséance) :

  1. Si le processus de construction de l'arbre fixe la propriété sur l'objet de mise en forme, utiliser la valeur de celle-ci comme valeur spécifiée. Ce qu'on nomme « spécification explicite » ;

  2. Autrement, si la propriété est héritable, utiliser la valeur de cette propriété de l'objet de mise en forme du parent, généralement la valeur calculée (voir plus loin) ;

  3. Sinon, utiliser la valeur initiale de la propriété, si elle en a une. La valeur initiale de chaque propriété est indiquée dans la définition de la propriété. S'il n'y a pas de valeur initiale, cette propriété n'est pas spécifiée pour l'objet de mise en forme. En général, c'est une erreur.

La racine de l'arbre résultant, qui n'a pas de parent, ne peut utiliser les valeurs de son objet de mise en forme parent ; dans ce cas, on utilise la valeur initiale, s'il y a lieu.

5.1.2 Les valeurs calculées

Les valeurs spécifiées peuvent être absolues (c'est-à-dire, elles ne sont pas spécifiées en fonction d'une autre valeur, comme dans "red" ou "2mm"), ou relatives (c'est-à-dire, elles sont spécifiées en fonction d'une autre valeur, comme dans "auto", "2em" et "12%"), ou encore être des expressions. Pour la plupart des valeurs absolues, aucun calcul n'est nécessaire pour déterminer la valeur calculée. À l'inverse, les valeurs relatives doivent être transformées en valeurs calculées : les pourcentages doivent être multipliés par une valeur de référence (chaque propriété en définit une), les valeurs exprimées en unités relatives (em) doivent être rendue absolues par multiplication avec la taille de police appropriée, les valeurs "auto" doivent être calculées selon les formules indiquées avec chaque propriété, certaines valeurs de propriété ("smaller", "bolder") doivent être remplacées selon leur définition. La valeur calculée de toute propriété agissant sur une épaisseur de bordure, le style de celle-ci étant "none", sera obligatoirement "0pt".

Pour certaines propriétés, on peut en spécifier la valeur de plusieurs façons. Les exemples les plus simples de telles propriétés sont représentés par celles où l'on peut spécifier une valeur en fonction d'une direction selon un sens d'écriture (par exemple, 'padding-before') ou en fonction d'une direction par rapport à une orientation géométrique absolue de la zone de visualisation (par exemple, 'padding-top'). Celles-ci sont appelées propriété relative et propriété absolue, respectivement. Ensemble, on les appelle des « propriétés correspondantes ».

La spécification d'une valeur pour une propriété détermine à la fois une valeur calculée pour cette propriété et une valeur calculée pour la propriété correspondante. Identifier quelle propriété relative correspond à telle propriété absolue dépend du mode d'écriture. Par exemple, si la propriété 'writing-mode', au niveau supérieur du document, est "lr-tb", alors 'padding-start' correspond à 'padding-left', mais si 'writing-mode' est "rl-tb", alors 'padding-start' correspond à 'padding-right'. La spécification exacte pour les modalités de calcul des valeurs des propriétés correspondantes est donnée au chapitre [5.3 Le calcul des valeurs des propriétés correspondantes].

Dans la plupart des cas, les éléments héritent des valeurs calculées. Cependant, il existe des propriétés dont la valeur spécifiée peut être héritée (par exemple, certaines valeurs de la propriété 'line-height'). Pour les cas où les éléments enfants n'héritent pas de la valeur calculée, l'indication est fournie dans la définition de la propriété.

5.1.3 Les valeurs réelles

En principe, une valeur calculée est prête à l'emploi, mais un agent utilisateur peut être dans l'impossibilité de l'utiliser dans un environnement donné. Par exemple, un agent utilisateur peut ne rendre des bordures qu'avec des valeurs entières en pixels pour leurs épaisseurs, ce qui oblige un ajustement de cette valeur calculée en un nombre entier de pixels pour ce média. La valeur réelle, c'est cette valeur calculée après que de tels ajustements aient été effectués.

5.1.4 L'héritage

Certaines des propriétés qui s'appliquent aux objets de mise en forme sont « héritables ». On identifie lesquelles de celles-ci le sont dans leur description. Tous les objets de mise en forme peuvent avoir des propriétés héritables. Celles-ci se propagent en descendant l'arbre des objets de mise en forme, des parents à chacun de leurs enfants (la valeur initiale de ces propriétés est attribuée à la racine de l'arbre résultant). Pour une propriété héritable donnée, celle-ci étant présente sur un enfant, alors c'est la valeur de cette propriété que l'enfant utilise (tout comme les descendants de celui-ci, jusqu'à une nouvelle spécification faite explicitement sur un descendant situé plus bas) ; autrement, la valeur spécifiée pour cette propriété sur l'enfant correspond à la valeur calculée pour celle-ci sur l'objet de mise en forme parent. Ainsi, il y a toujours une valeur spécifiée définie pour chaque propriété héritable et pour chaque objet de mise en forme.

5.2 Le développement des raccourcis

En XSL, il existe deux sortes de propriétés raccourcies, celles qui proviennent de CSS, telle que 'border', et celles qui apparaissent à la suite de l'éclatement et/ou de la combinaison de propriétés CSS, telle que 'page-break-inside'. En XSL, on gère ces deux types de raccourcis de la même façon.

Remarque :

Les raccourcis ne sont inclus qu'au plus haut niveau de conformité XSL, il s'agit du niveau « complet » (voir le chapitre [8 La conformité]).

On indique le niveau de conformité de chaque propriété au chapitre [C.3 Un tableau des propriétés : 2eme partie].

Les propriétés raccourcies n'héritent pas des raccourcis de leur parent. Par contre, les propriétés individuelles qui en sont issues le peuvent.

Certains raccourcis CSS sont liés, leur développement ayant une ou plusieurs propriétés individuelles communes. CSS indique que l'utilisateur peut spécifier l'ordre du traitement pour les combinaisons de multiples raccourcis et propriétés liés. En XML, les attributs sont définis comme n'étant pas ordonnés. Pour résoudre cette question, XSL définit une préséance, quand plusieurs propriétés raccourcies, ou une seule, et une propriété individuelle liées sont spécifiées :

Celles-ci sont traitées par ordre de précision croissante (c'est-à-dire, 'border' est moins précise que 'border-top' qui, à son tour, est moins présise que 'border-top-color'). Les propriétés individuelles sont toujours plus précises qu'une propriété raccourcie. Pour les cas restants ambigüs, XSL définit l'ordre suivant :

  1. 'border-style', 'border-color' et 'border-width' sont moins précises que

  2. 'border-top', 'border-bottom', 'border-right' et 'border-left'.

Le traitement se fait conceptuellement selon les étapes suivantes :

  1. Attribuer, comme valeur effective à chacune des propriétés, leur valeur initiale ;

  2. Traiter tous les raccourcis selon une précision croissante;

    Si la valeur du raccourci est "inherit", attribuer, comme valeur effective à chacune des propriétés individuelles pouvant l'être par le raccourci, la valeur calculée de la propriété correspondante du parent ;

    Si la valeur du raccourci n'est pas "inherit", déterminer lesquelles des propriétés individuelles doivent recevoir une valeur et remplacer leur valeur initiale par la valeur calculée obtenue à partir de celle qui est spécifiée ;

  3. Traiter toutes les propriétés individuelles ;

  4. Déterminer l'héritage éventuel des propriétés qui n'auraient pas reçus de valeur autre que lors de la première étape.

Remarque :

Par exemple, si les propriétés 'background' et 'background-color' sont toutes deux spécifiées pour un objet de mise en forme donné : traiter le raccourci 'background', ensuite traiter la propriété 'background-color'.

5.3 Le calcul des valeurs des propriétés correspondantes

Là où il y a des propriétés correspondantes, telles que 'padding-left' et 'padding-start', on détermine une valeur calculée pour toutes celles-ci. La manière de déterminer les valeurs calculées d'un objet de mise en forme donné dépend de la propriété correspondante qui est spécifiée pour l'objet en question. Voir la description ci-dessous.

La relation de correspondance d'une propriété absolue vers une propriété relative est effectuée comme suit :

Quand la propriété 'writing-mode' indique une direction de progression de bloc de « haut-en-bas », alors "top" correspond à "before" et "bottom" à "after";

Quand 'writing-mode' indique une direction de progression de bloc de « bas-en-haut », alors "top" correspond à "after" et "bottom" à "before" ;

Quand "writing-mode" indique une direction de progression de bloc de « gauche-à-droite », alors "left" correspond à "before" et "right" à "after" ;

Quand 'writing-mode' indique une direction de progression de bloc de « droite-à-gauche », alors "left" correspond à "after" et "right" à "before" ;

Quand 'writing-mode' indique une direction de progression en-ligne de « gauche-à-droite », alors "left" correspond à "start" et "right" à "end" ;

Quand 'writing-mode' indique une direction de progression en-ligne de « droite-à-gauche », alors "left" correspond à "end" et "right" à "start" ;

Quand 'writing-mode' indique une direction de progression en-ligne de « haut-en-bas », alors "top" correspond à "start" et "bottom" à "end" ;

Quand 'writing-mode' indique une direction de progression en-ligne de « bas-en-haut », alors "top" correspond à "end" et "bottom" à "start" ;

Quand 'writing-mode' indique une direction de progression en-ligne de « gauche-à-droite », pour des lignes avec des numéros impairs, et de « droite-à-gauche », pour des lignes avec des numéros pairs, alors "left" correspond à "start" et "right" à "end".

Remarque :

La propriété 'reference-orientation' consiste en une rotation et n'influence donc pas la relation de correspondance.

5.3.1 Les propriétés de bordure et d'espacement

La classe des propriétés correspondantes la plus simple est constituée de celles pour lesquelles la correspondance n'a que deux variantes, une propriété absolue et une propriété relative, leurs noms ne différant que par le choix d'une désignation absolue ou relative ; par exemple, les propriétés 'border-left-color' et 'border-start-color'.

Pour cette classe, les valeurs calculées des propriétés correspondantes sont déterminées comme suit. Si la variante correspondante absolue de la propriété est spécifiée sur l'objet de mise en forme, c'est la valeur calculée de celle-ci qui est utilisée pour déterminer la valeur calculée de la propriété correspondante relative. Si la propriété correspondante absolue n'est pas spécifiée explicitement, alors la valeur calculée de celle-ci prend la valeur calculée de la propriété correspondante relative. Si la propriété correspondante relative est spécifiée sur l'objet de mise en forme et si la spécification de la propriété absolue ne survient qu'à la suite du développement d'une propriété raccourcie, alors la valeur calculée de cette dernière prend celle de la propriété correspondante relative.

Noter que si les deux propriétés, absolue et relative, ne sont pas spécifiées, alors les règles de détermination de la valeur spécifiée utiliseront soit la valeur héritée, si celle-ci est définie, soit la valeur initiale. La valeur initiale doit être la même pour toutes les propriétés correspondante possibles. Si les deux propriétés, l'une absolue et l'autre correspondante relative, alors la règle précédente donne la priorité à la propriété absolue et la valeur spécifiée de la propriété correspondante relative est ignorée pour la détermination de la valeur calculée de cette dernière.

Voici les propriétés correspondantes qui suivent ces règles de détermination de la valeur calculée :

5.3.2 Les propriétés de marge, d'espace et d'indentation

Les propriétés 'space-before' et 'space-after' (pour les objets de mise en forme de type bloc), et 'space-start' et 'space-end' (pour les objets de mise en forme de type en-ligne), sont gérées de la même façon que les propriétés immédiatement précédentes, mais leurs propriétés correspondantes absolues se trouvent parmi le jeu 'margin-top', 'margin-bottom', 'margin-left' et 'margin-right'. Le composant conditionality pour tout espace avant, ou après, déterminé à partir d'une propriété de marge, prend la valeur "retain".

Remarque :

La prise en compte du composant conditionality existe pour des raisons de compatibilité avec CSS2.

Remarque :

La valeur calculée d'une marge CSS2 dans une direction de progression de bloc, cette valeur étant spécifiée "auto", est 0pt. Tout espace avant, ou après , déterminé à partir d'une valeur de marge "auto", prend la valeur 0pt.

Il existe deux propriétés supplémentaires, 'end-indent' et 'start-indent' (pour les objets de mise en forme de type bloc), qui correspondent aux diverses propriétés de marge absolues. Pour celles-ci, la correspondance est plus complexe et implique les propriétés correspondantes 'border-X-width' et 'padding-X', où X représente l'un parmi "left", "right", "top" et "bottom". On détermine la valeur calculée de ces propriétés correspondantes des manières suivantes :

Si la propriété correspondante absolue 'margin' est spécifiée sur l'objet de mise en forme et si ce dernier génère une aire de référence, alors la valeur calculée de la marge est utilisée pour calculer celle de la propriété correspondante 'Y-indent', où Y est soit "start", soit "end". Les formules pour déterminer 'start-indent' et 'end-indent' sont alors :

start-indent = marge correspondante + espacement correspondant + épaisseur-de-bordure correspondante

end-indent = marge correspondante + espacement correspondant + épaisseur-de-bordure correspondante

Si la propriété correspondante absolue 'margin' est spécifiée sur l'objet de mise en forme et si ce dernier ne génère pas d'aire de référence, alors la valeur calculée de la marge et celles des propriétés correspondantes 'border-X-width' et 'padding-X' sont utilisées pour calculer la valeur calculée de la propriété correspondante 'Y-indent'. Les formules pour déterminer 'start-indent' et 'end-indent' sont alors :

start-indent = valeur-héritée-de(start-indent) + marge correspondante + espacement correspondant + épaisseur-de-bordure correspondante

end-indent = valeur-héritée-de(end-indent) + marge correspondante + espacement correspondant + épaisseur-de-bordure correspondante

Si la propriété de marge correspondante absolue n'est pas spécifiée explicitement, ou si la propriété correspondante relative est spécifiée sur l'objet de mise en forme et si la spécification de la propriété absolue ne provient que du développement d'une propriété raccourcie, alors la valeur de la propriété de marge correspondante absolue se calcule selon les formules suivantes :

marge correspondante = start-indent - valeur-héritée-de(start-indent) - espacement correspondant - épaisseur-de-bordure correspondante

marge correspondante = end-indent - valeur-héritée-de(end-indent) - espacement correspondant - épaisseur-de-bordure correspondante

Remarque :

Si les propriétés 'start-indent' ou 'end-indent' ne sont pas spécifiées, alors on utilise, dans ces formules, leur valeur héritée.

5.3.3 Les propriétés de hauteur et de largeur

En fonction du mode d'écriture en vigueur pour l'objet de mise en forme, on convertit soit les propriétés 'height', 'min-height' et 'max-height', soit les propriétés 'width', 'min-width' et 'max-width', en leurs propriétés correspondantes 'block-progression-dimension', ou 'inline-progression-dimension'.

Les propriétés '-height' sont absolues et indiquent une dimension de « haut-en-bas », les propriétés de largeur une dimension de « gauche-à-droite ».

Si la propriété 'writing-mode' spécifie une direction de progression de bloc de « haut-en-bas » ou de « bas-en-haut », la conversion a lieu ainsi :

Si la propriété 'writing-mode' spécifie une direction de progression de « gauche-à-droite » ou de « droite-à-gauche », la conversion a lieu ainsi :

5.3.4 La géométrie sur-contrainte

La somme des valeurs des traits start-indent, end-indent et inline-progression-dimension du rectangle de contenu d'une aire devrait être égale à la valeur de trait inline-progression-dimension du rectangle de contenu de l'aire de référence de l'ancêtre le plus proche. Au cas où une spécification conduirait à ce que ceux-ci soient différents, la valeur de end-indent (et par la même la marge correspondante) est ajustée de manière à ce que l'égalité soit vérifiée.

5.4 La correspondance entre une propriété simple et un trait

Une majorité de propriétés correspondent aux traits de même nom. La plupart d'entre eux recopient également les valeurs des propriétés. Ces traits sont rangés selon les classes « Rendu », « Mise en forme », « Spécification », « Sélection de police », « Référence » et « Action » dans le tableau des propriétés au chapitre [C.3 Un tableau des propriétés : 2eme partie]. Par exemple, la propriété font-style = "italic" s'affine en un trait font-style avec une valeur "italic".

Certains traits ont une valeur différente de celle de la propriété. Ceux-ci sont rangés dans la classe « Changement de valeur » dans le tableau des propriétés. Par exemple, la propriété background-position-horizontal = "left" s'affine en un trait background-position-horizontal avec une valeur "0pt". Les valeurs de correspondance pour ces traits sont données ci-dessous.

5.4.1 Les propriétés background-position-horizontal et background-position-vertical

Les valeurs "top", "bottom", "left", "right" ou "center" sont converties en une longueur comme spécifié dans la définition de la propriété.

5.4.2 La propriété column-number

Si la valeur de cette propriété, qui s'applique sur un objet de mise en forme donné, n'a pas été spécifiée, la valeur initiale est calculée comme indiqué dans la définition de la propriété.

5.4.3 La propriété text-align

Une valeur de "left" ou "right" est convertie en une valeur relative au mode d'écriture comme indiqué dans la définition de la propriété.

5.4.4 La propriété text-align-last

Une valeur de "left" ou "right" est convertie en une valeur relative au mode d'écriture comme indiqué dans la définition de la propriété.

5.4.5 La propriété z-index

La valeur est convertie en une valeur absolue, c'est-à-dire la valeur affinée correspond à la valeur spécifié plus la valeur affinée de z-index de son objet de mise en forme parent, s'il y en a un.

« errata-E8 »

5.5 La correspondance entre une propriété complexe et un trait

Un petit nombre de propriétés influencent les traits d'une manière plus complexe. Les détails en sont donnés ci-dessous.

5.5.1 Les propriétés word-spacing et letter-spacing

Ces propriétés peuvent donner les valeurs pour les traits space-start et space-end comme décrit dans leurs définitions.

5.5.2 La propriété reference-orientation

Le trait reference-orientation est copié de la propriété 'reference-orientation' lors de l'affinage. Une orientation absolue est déterminée pendant la composition (voir le chapitre [4.2.2 Les traits communs]).

5.5.3 Les propriétés writing-mode et direction

Les traits writing-mode, direction et unicode-bidi sont copiés des propriétés de même nom lors de l'affinage. Ceux-ci sont utilisés pour la détermination des orientations absolues des traits block-progression-direction, inline-progression-direction et shift-direction en accord avec ceux du chapitre [4.2.2 Les traits communs].

5.5.4 La propriété absolute-position

Si la propriété absolute-position = "absolute", ou "fixed, les traits left-position, top-position, etc. sont copiés directement des propriétés 'left', 'top', etc. Autrement, les valeurs de ces traits restent indéfinies lors de l'affinage et sont déterminées lors de la composition.

5.5.5 La propriété relative-position

Si la propriété relative-position = "relative", alors les valeurs des traits left-offset et top-offset sont copiées directement des propriétés 'left' et 'top'. Si la propriété 'right' est spécifiée, mais pas 'left', alors left-offset reçoit la valeur négative de 'right'. Si ni 'left' ni 'right' ne sont spécifiées, alors left-offset prend la valeur 0. Si la propriété 'bottom' est spécifiée, mais pas 'top', alors top-offset reçoit la valeur négative de 'bottom'. Si ni 'top' ni 'bottom' ne sont spécifiées, alors top-offset prend la valeur 0.

5.5.6 La propriété text-decoration

La propriété 'text-decoration' fournit les valeurs du trait blink et d'un jeu de traits score et score-color. La couleur spécifiée a la valeur du trait color de l'objet de mise en forme pour lequel la propriété 'text-decoration' est en cours d'affinage.

Une valeur de propriété contenant le jeton "underline" donne la valeur "true" au trait underline-score et une valeur de couleur spécifiée au trait underline-score-color.

Une valeur de propriété contenant le jeton "overline" donne la valeur "true" au trait overline-score et une valeur de couleur spécifiée au trait overline-score-color.

Une valeur de propriété contenant le jeton "line-through" donne la valeur "true" au trait through-score et une valeur de couleur spécifiée au trait through-score-color.

Une valeur de propriété contenant le jeton "blink" donne la valeur "true" au trait blink.

Une valeur de propriété contenant le jeton "no-underline" donne la valeur "false" au trait underline-score et une valeur de couleur spécifiée au trait underline-score-color.

Une valeur de propriété contenant le jeton "no-overline" donne la valeur "false" au trait overline-score et une valeur de couleur spécifiée au trait overline-score-color.

Une valeur de propriété contenant le jeton "no-line-through" donne la valeur "false" au trait through-score et une valeur de couleur spécifiée au trait through-score-color.

Une valeur de propriété contenant le jeton "no-blink" donne la valeur "false" au trait blink.

5.5.7 Les propriétés de police

Les traits de police d'une aire sont obtenus indirectement à partir d'une combinaison des propriétés de police, qui sont utilisées pour la sélection d'une police, et des tables de police de celle-ci.

Le modèle abstrait, assumé par XSL pour une police, est décrit au chapitre [7.8.1 Les polices et les données de police].

Il n'existe aucun mécanisme XSL pour la spécification d'une police donnée ; par contre, une police sélectionnée est retenue, parmi celles disponibles pour l'agent utilisateur, en fonction d'un jeu de critères de sélection. Les critères de sélection se fondent sur les propriétés de police 'font-family', 'font-style', 'font-variant', 'font-weight', 'font-stretch' et 'font-size', et, pour certains objets de mise en forme, une ou plusieurs caractéristiques. Les détails sur la manière dont sont utilisés ces critères de sélection sont spécifiés au chapitre [7.8.3 'font-selection-strategy'].

La valeur du trait nominal-font correspond à la police sélectionnée . Au cas où il n'y a aucune police sélectionnée, le glyphe « caractère manquant » étant affiché, la valeur du trait nominal-font correspond à la police qui contient ce glyphe (d'autres mécanismes était utilisés pour représenter le non affichage d'un caractère), autrement le trait correspond à une police système.

Les traits dominant-baseline-identifier et actual-baseline-table se déduisent de la valeur de la propriété 'dominant-baseline'. Celle-ci est une valeur agglomérée à partir de trois composants : un identifiant de ligne de base pour la ligne de base dominante, une table de lignes de base et une taille de police de la table de lignes de base. La valeur du trait dominant-baseline-identifier se déduit du premier composant. On utilise la taille de police de la table de lignes de base pour faire varier les positions des lignes de base de la table de même nom, puis la position de la ligne de base dominante est soustraite des positions de ces autres lignes de base pour produire une table des décalages à partir de la ligne de base dominante. Cette table correspond à la valeur du trait actual-baseline-table.

5.6 La génération d'un trait non basé sur une propriété

Le trait is-reference-area prend la valeur "true" pour les objets de mise en forme fo:simple-page-master, fo:title, fo:region-body, fo:region-before, fo:region-after, fo:region-start, fo:region-end, fo:block-container, fo:inline-container, fo:table, fo:table-caption et fo:table-cell. Pour tous les autres objets de mise en forme, celui-ci a la valeur "false".

5.7 Les transformations basées sur des propriétés

5.7.1 La propriété text-transform

Les changements de casse spécifiés par cette propriété sont réalisés lors de l'affinage, par une modification appropriée de la valeur de la propriété 'character'.

Remarque :

L'usage de la propriété 'text-transform' est déprécié en XSL, suite aux grandes difficultés pour l'internationalisation.

5.8 Le traitement Unicode BIDI

Dans certaines écritures, on écrit les lettres horizontalement, de la droite vers la gauche. Pour certains documents, notamment ceux écrits en arabe ou en hébreu, également dans des contextes de langues mêlées, le texte d'un seul bloc (visuellement parlant) peut apparître selon des directionnalités mixtes. On appelle ce phénomène bidirectionnalité, ou « BIDI » pour faire court.

Le standard Unicode [UNICODE] définit un algorithme complexe, l'algorithme Unicode BIDI [UNICODE UAX #9], pour déterminer la directionnalité correcte du texte. Cet algorithme se fonde à la fois sur une partie implicite, à partir des propriétés des caractères, et sur des contrôles explicites pour les incorporations et les surclassements.

L'étape finale de l'affinage emploie cet algorithme et le type de caractère bidirectionnel Unicode de chaque caractère pour convertir la directionnalité implicite du texte en un balisage explicite par rapport aux objets de mise en forme. Par exemple, un extrait en caractères arabe, dans un paragraphe en anglais, induirait la création d'un objet de mise en forme en-ligne, le contenu en étant cet extrait en arabe, dont la propriété 'direction' aurait la valeur "rtl" et la propriété 'unicode-bidi' la valeur "bidi-override". L'objet de mise en forme rend explicite le positionnement de droite à gauche des caractères arabes, précédemment implicite.

Comme défini au chapitre [UNICODE UAX #9], l'algorithme Unicode BIDI reçoit un flux de texte en entrée et effectue un traitement selon trois phases principales :

  1. La séparation du texte entré en paragraphes. Le reste de l'algorithme n'affecte que le texte qui se trouvent entre les séparateurs de paragraphe ;

  2. La résolution des niveaux d'incorporation dans le texte. Dans ce cas, les types de caractère bidirectionnels, plus les codes de mise en forme directionnels Unicode, sont utilisés pour produire des niveaux d'incorporation résolus. Le type de caractère bidirectionnel normatif pour chaque caractère est spécifié dans la Base de données des Caractères Unicode [UNICODE Character Database].

  3. Le réordonnancement du texte pour un affichage ligne-à-ligne, en utilisant les niveaux d'incorporation résolus, une fois que le texte a été réparti en ligne.

L'algorithme, qui est décrit ci-dessus, demande quelques adaptations pour cadrer avec le modèle de traitement XSL. Premièrement, l'étape de réordonnancement final du texte n'a pas lieu durant l'affinage. À la place, l'équivalent XSL de ce réordonnancement se tient lors de la mise en forme. On utilise la direction de progression en-ligne de chaque glyphe pour contrôler leur empilement, comme décrit au chapitre [4.2.5 Les contraintes d'empilement]. Cette direction de progression en-ligne est déterminée au niveau du bloc, par la propriété 'writing-mode', et dans les objets de mise en forme de type en-ligne dans un bloc donné, par les propriétés 'direction' et 'unicode-bidi', celles-ci ayant été spécifiées sur les objets de mise en forme en-ligne générés par la construction de l'arbre ou étant spécifiées sur des objets de mise en forme en-ligne lors de l'affinage (voir le détail ci-dessous).

Deuxièmement, l'algorithme s'applique sur une séquence de caractères provenant du contenu d'un ou de plusieurs objets de mise en forme. Cette séquence de caractères est créée au cours du traitement d'un fragment de l'arbre des objets de mise en forme. Un fragment est représenté par toute séquence contigüe d'enfants d'un certain objet de mise en forme dans l'arbre. La séquence est créée lors du cheminement préordonné dans le fragment, en descendant jusqu'au niveau fo:character. Pendant le cheminement préordonné, chaque objet de mise en forme fo:character ajoute un caractère à la séquence. Plus précisément, à chaque fois que l'examen de préordonnancement rencontre un nœud dont la propriété 'unicode-bidi' a la valeur "embed" ou "override", il est ajouté un caractère Unicode RLO/LRO, ou RLE/LRE, en adéquation avec la valeur des propriétés 'direction' et 'unicode-bidi'. Lors du retour sur ce nœud après examen de son contenu, il est ajouté un caractère Unicode PDF. De cette façon, le fragment de l'arbre des objets de mise en forme est aplani en une séquence de caractères. On appelle celle-ci séquence de caractères aplanie ci-dessous.

Troisièmement, en XSL, on applique l'algorithme à des étendues de texte délimitées à la place de simplement des paragraphes. Une étendue de texte délimitée est une séquence de caractères aplanie maximale ne contenant aucun délimiteur. Tout objet de mise en forme qui génère des aires de bloc est un délimiteur. Il fait office de délimiteur pour son contenu. Il fait aussi office de délimiteur pour le contenu de son parent. C'est-à-dire, si le parent a un contenu textuel, alors ceux de ses objets de mise en forme enfants, qui génèrent des aires de bloc, agissent pour découper ce contenu textuel en boîtes anonymes, chacune d'entre elles étant une étendue de texte délimitée. De façon similaire, l'objet de mise en forme fo:multi-case fait office de délimiteur pour son contenu et pour celui de son parent. Finalement, un texte, dont l'orientation n'est pas perpendiculaire à la ligne de base dominante, fait office de délimiteur pour un texte dont l'orientation est perpendiculaire à celle-ci. On dit qu'un texte a une orientation perpendiculaire à la ligne de base dominante quand les glyphes, correspondant aux caractères du texte, sont tous orientés perpendiculairement à celle-ci.

Remarque :

Dans la plupart des cas, une étendue de texte délimitée correspond à la séquence de caractères maximale qui aurait été formatée en une ou plusieurs séquences d'aires de ligne. Pour l'objet fo:multi-case et le texte dont l'orientation est perpendiculaire à la ligne de base dominante, l'étendue délimitée peut être une sous-séquence d'une ligne, ou d'une séquence de lignes. Par exemple, en japonais formaté selon un mode d'écriture vertical, un texte latin ou arabe, ayant subi une rotation, serait délimité par les caractères japonais verticaux qui entourent immédiatement celui-ci. Aucun des objets de mise en forme qui génèrent des aires en-ligne n'agit sur la détermination de l'étendue de texte délimitée.

Pour chaque étendue de texte délimitée, c'est la direction de progression en-ligne de l'objet de mise en forme du plus proche ancêtre (lui-même inclus), l'objet générant une aire de bloc, qui détermine le niveau d'incorporation du paragraphe utilisé dans l'algorithme Unicode BIDI. C'est le niveau d'incorporation par défaut pour l'étendue de texte délimitée.

Les niveaux d'incorporation sont des nombres qui indiquent à quelle profondeur le texte est imbriqué et la direction par défaut de celui-ci à ce niveau. Le niveau d'incorporation minimum du texte est zéro et le niveau maximum 61. Avoir plus de 61 niveaux d'incorporation est une erreur. Un processeur XSL peut signaler cette erreur. Si celui-ci ne le fait pas, il doit reprendre cette erreur en permettant un nombre maximum supérieur de niveaux d'incorporation.

La seconde étape de l'algorithme Unicode BIDI labellise chaque caractère de l'étendue de texte délimitée avec un niveau d'incorporation résolu. Le niveau d'incorporation résolu de chaque caractère sera supérieur ou égal à celui du paragraphe. Un texte de droite-à-gauche finira toujours avec un niveau impair et un texte de gauche-à-droite avec un niveau pair. De plus, un texte numérique finira toujours avec un niveau supérieur à celui du paragraphe.

Une fois déterminés les niveaux d'incorporation résolus de l'étendue de texte délimitée, de nouveaux objets de mise en forme fo:bidi-override, avec des valeurs appropriées pour leurs propriétés 'direction' et 'unicode-bidi', sont insérés dans le fragment de l'arbre des objets de mise en forme, celui-ci a été aplani en une étendue de texte délimitée tel que les contraintes suivantes soient satisfaites :

  1. Pour chaque caractère de l'étendue de texte délimitée, la direction de progression en-ligne de celui-ci doit correspondre avec son niveau d'incorporation résolu ;

  2. Pour chaque niveau d'incorporation résolu L, du niveau d'incorporation du paragraphe jusqu'au niveau d'incorporation maximum résolu, et pour chaque séquence de caractères contigüe maximale S, pour laquelle le niveau d'incorporation résolu de chaque caractère est supérieur ou égal à L :

    1. Il y a un objet de mise en forme de type en-ligne F qui a pour contenu le fragment d'arbre des objets de mise en forme s'aplanissant en S et qui a une propriété 'direction' cohérente avec le niveau d'incorporation résolu L ;

      Remarque :

      F n'a pas besoin d'être un objet de mise en forme inséré si la contrainte est obtenue par un objet de mise en forme existant, ou par la spécification de valeurs pour les propriétés 'direction' et 'unicode-bidi' sur un objet de mise en forme existant.

    2. Tous les objets de mise en forme qui contiennent une partie de la séquence S sont correctement imbriqués dans F et conservent les relations d'imbrication qu'ils avaient dans l'arbre des objets de mise en forme, préalablement à l'insertion des nouveaux objets de mise en forme.

      Remarque :

      Satisfaire cette contrainte peut nécessiter le partage d'un ou plusieurs objets de mise en forme existants dans l'arbre des objets de mise en forme, chacun d'eux, en une paire d'objets de mise en forme, chacun des objets de cette paire ayant le même jeu des valeurs calculées des propriétés que l'objet original avant son partage. L'un des objets de la paire se terminerait avant le début de F, ou commencerait après la fin de F, et l'autre commencerait après le début de F, ou se terminerait avant la fin de F, respectivement. La paire ainsi créée doit continuer à s'imbriquer correctement pour satisfaire la contrainte. Par exemple, supposons un texte de gauche-à-droite représenté par la lettre « G » et un texte de droite-à-gauche représenté par la lettre « D ». Soit le sous-arbre :

       <fo:block>
         GG
         <fo:inline ID="A">GGGDDD</fo:inline>
         DD
       </fo:block>
      

      En supposant un niveau d'incorporation de "0" pour le paragraphe, les niveaux d'incorporation résolus nécessiteraient la structure suivante (insérée et répliquée) :

       <fo:block>
         GG
         <fo:inline ID="A">GGG</fo:inline>
         <fo:bidi-override direction="rtl">
           <fo:inline ID="A+">DDD</fo:inline>
           DD
         </fo:bidi-override>
       </fo:block>
      

      Noter que l'objet de mise en forme fo:inline, avec une ID égale à "A", a été partagé en deux objets fo:inline, le premier ayant l'ID originale "A" et le second l'ID "A+". Les IDs devant être uniques, la valeur calculée de toute ID ou propriété-clé ne doit pas être répliquée dans le second membre de la paire. La valeur de "A+" n'est utilisée ici que pour illustrer le propos.

  3. On ne peut insérer moins d'objets de mise en forme fo:bidi-override et, cependant, satisfaire les contraintes précédentes. C'est-à-dire, il n'est ajouté, à l'arbre des objets de mise en forme affiné, qu'autant d'objets de mise en forme fo: bidi-override que nécessaire, mis à part les objets de mise en forme créés lors de la construction de l'arbre, pour représenter les niveaux d'incorporation présents dans le document.

5.9 Les expressions

Toutes les spécifications de valeur de propriété des attributs dans une feuille de style XSL peuvent être des expressions. Celles-ci représentent les valeurs de la propriété spécifiée. L'expression est tout d'abord évaluée, puis la valeur résultante est utilisée pour déterminer la valeur de la propriété.
« errata-E9 »

5.9.1 Le contexte d'une propriété

Les propriétés sont évaluées dans leur contexte spécifique. Ce contexte fournit :

Remarque :

Il n'est pas nécessaire qu'une conversion soit fournie pour tous les types. Si aucune conversion n'est spécifiée, c'est une erreur.

Quand une instance de type (par exemple, une chaîne, un mot-clé, un nombre, etc.) est reconnue dans l'expression, celle-ci est évaluée dans le contexte de la propriété. Ceci permet la conversion de valeurs spécifiques avec les algorithmes propres au contexte de la propriété ou des conversions à utiliser dans l'évaluation de l'expression comme un tout.

Par exemple, le jeton d'énumération "auto" de certaines propriétés est une valeur calculée. Un tel jeton serait converti en une instance d'un type spécifique via un algorithme spécifié dans la définition de la propriété. Dans un tel cas, la valeur résultante pourrait être une longueur absolue spécifiant la largeur d'un certain aspect de l'objet de mise en forme.

De plus, ceci permet, pour certains types, comme des valeurs numériques relatives, leur résolution en des valeurs numériques absolues, préalablement à des opérations mathématiques.

Tous les contextes de propriété permettent des conversions comme indiqué au chapitre [5.9.12 Les conversions des valeurs des expressions].

5.9.2 L'ordre d'évaluation

Quand un jeu de propriétés est en cours d'évaluation pour un objet donné de l'arbre des objets de mise en forme, il existe un ordre spécifique selon lequel on doit évaluer les propriétés. Essentiellement, la propriété 'font-size' doit être évaluée avant toutes les autres. Une fois l'évaluation de celle-ci achevée, toutes les autres peuvent l'être dans n'importe quel ordre.

Lors de l'évaluation de la propriété 'font-size', c'est la taille de police de l'élément parent qui est la taille de police courante à évaluer. Une fois que la propriété 'font-size' est évaluée, cette valeur est utilisée comme taille de police courante pour tous les contextes de propriété de toutes les expressions des valeurs des propriétés à évaluer par la suite.

5.9.3 Les bases

[1]   Expr   ::=   ExprAdditive
[2]   ExprPrimaire   ::=   '(' Expr ')'
| Numérique
| Littérale
| Couleur
| Mot-clé
| JetonÉnumération
| AppelFonction

5.9.4 Les appels de fonction

[3]   AppelFonction   ::=   NomFonction '(' ( Argument ( ',' Argument)*)? ')'
[4]   Argument   ::=   Expr

5.9.5 Les valeurs numériques

Une valeur numérique représente tous les types de nombre dans une expression XSL. Certains de ces nombres sont des valeurs absolues. D'autres sont relatifs à un autre jeu de valeurs. Toutes ces valeurs utilisent un nombre décimal pour représenter la part numérique de leur définition.

Un nombre décimal peut avoir toute valeur au format IEEE 754 64-bit double précision [IEEE 754]. Ceci inclut une valeur spéciale "Not-a-Number" (NaN), un infini, positif et négatif, et un zéro, positif et négatif. Voir le chapitre 4.2.3 de [JLS] pour un résumé des règles clés du standard IEEE 754.

[5]   Numérique   ::=   NumériqueAbsolue
| NumériqueRelative
[6]   NumériqueAbsolue   ::=   LongueurAbsolue
[7]   LongueurAbsolue   ::=   Nombre NomUnitéAbsolue?
[8]   NumériqueRelative   ::=   Pourcentage
| LongueurRelative
[9]   Pourcentage   ::=   Nombre '%'
[10]   LongueurRelative   ::=   Nombre NomUnitéRelative

Avec les valeurs numériques, on peut employer les opérateurs suivants :

+

Effectue une addition ;

-

Effectue une soustraction ou une négation ;

*

Effectue une multiplication ;

div

Effectue une division décimale selon IEEE 754 ;

mod

Retourne le reste d'une division tronquée.

Remarque :

Comme XML permet le caractère « - » dans les noms, il faut typiquement faire précéder l'opérateur « - » d'un blanc (quand celui-ci n'est pas utilisé comme une expression ExprUnaire). Par exemple, l'expression 10pt - 2pt signifie soustraire 2 points de 10 points. Et l'expression 10pt-2pt signifierait une valeur de longueur de 10 avec une unité de "pt-2pt".

Remarque :

Voici des exemples avec l'opérateur mod :

Remarque :

L'opérateur mod est semblable à l'opérateur « % » en Java et en ECMAScript, ce n'est pas la même chose que l'opération de reste IEEE, qui retourne le reste d'une division tronquée.

Les expressions numériques
[11]   ExprAdditive   ::=   ExprMultiplicative
| ExprAdditive '+' ExprMultiplicative
| ExprAdditive '-' ExprMultiplicative
[12]   ExprMultiplicative   ::=   ExprUnaire
| ExprMultiplicative OpérateurMultiplier ExprUnaire
| ExprMultiplicative 'div' ExprUnaire
| ExprMultiplicative 'mod' ExprUnaire
[13]   ExprUnaire   ::=   ExprPrimaire
| '-' ExprUnaire

Remarque :

Selon cette grammaire, l'ordre de préséance, par ordre croissant, est :

et les opérateurs sont associatifs à gauche. Par exemple, 2*3 + 4 div 5 équivaut à (2*3) + (4 div 5).

Si une valeur non numérique est utilisée dans une expression ExprAdditive et s'il n'y a pas de conversion dans le contexte de propriété vers une valeur numérique absolue, l'expression est invalide et est considérée une erreur.

5.9.6 Les valeurs numériques absolues

Une valeur numérique absolue est une valeur de longueur absolue consistant en une paire formée d'un Nombre et d'un NomUnité élevé à une puissance. Quand on écrit une longueur absolue sans unité, la puissance de l'unité est supposée être zéro. Ainsi, tous les nombres décimaux sont des longueurs avec une puissance de zéro.

Chaque nom d'unité a un ratio interne d'une certaine unité de mesure interne commune qui lui est associé (par exemple, un mètre). Quand une valeur est inscrite dans une expression de propriété, celle-ci est d'abord convertie dans l'unité de mesure interne, les opérations mathématiques étant effectuées ensuite.

De plus, seuls les opérateurs mod et ceux d'addition et de soustraction requièrent que les valeurs numériques, de part et d'autre de l'opérateur, soit des valeurs absolues dans la même puissance de l'unité. Pour d'autres opérations, les puissances de l'unité peuvent différer, et le résultat devraient être mathématiquement cohérent comme pour la gestion des puissances en algèbre.

Une définition de propriété peut contraindre une longueur absolue en une puissance spécifique. Par exemple, pour la spécification de la taille de police, on attend que la valeur soit à la puissance "un". C'est-à-dire, cette valeur est censée avoir une seule unité spécifiée (par exemple, 10pt).

Quand le calcul de la valeur finale d'une propriété est effectué, la puissance résultante de la valeur numérique absolue doit être soit zéro soit un. Si toute autre puissance est spécifiée, la valeur est erronée.

5.9.7 Les valeurs numériques relatives

Les longueurs relatives sont des valeurs calculées par rapport à un autre jeu de valeurs. Quand elles sont écrites dans une expression, celles-ci sont soit converties en valeurs numériques absolues, via le contexte de la propriété, soit transmises telles quelles comme valeurs de propriété.

Il y a erreur si le contexte de propriété ne dispose pas d'une conversion pour la valeur numérique relative, une conversion est obligatoire pour l'évaluation d'une expression (par exemple, dans une addition).

5.9.7.1 Les pourcentages

Les valeurs en pourcentage sont comptées en 1/100 d'unité. C'est-à-dire, la valeur en pourcentage 10% correspond à 0.10 en nombre décimal. Lors de la conversion vers une valeur numérique absolue, le pourcentage est défini, dans la définition de la propriété, comme étant un pourcentage d'une valeur de propriété connue. Si l'évaluation du pourcentage est "auto", l'évaluation de l'expression en entier est "auto".

Par exemple, l'évaluation d'une valeur de "110%" d'une propriété 'font-size' signifierait 1.1 fois la taille de la police courante. La conversion admise pour une valeur en pourcentage est spécifié dans la définition de la propriété. Si aucune conversion n'est spécifiée, la valeur résultante est un pourcentage.

5.9.7.2 Les longueurs relatives

Une longueur relative est une valeur, basée sur une unité, qui se mesure par rapport à la valeur courante de la propriété 'font-size'.

Il n'existe qu'une seule unité de mesure relative, le « em ». Une valeur de "1em" est, par définition, égale à la taille de la police courante. Par exemple, une valeur de "1.25em" correspond à 1.25 fois la taille de la police courante.

Quand une expression contient une mesure exprimée en em, cette valeur est convertie en fonction de celle de la taille de la police du contexte de la propriété courante. Le résultat de l'expression est une longueur absolue. Voir le chapitre [7.8.4 'font-size'].

5.9.8 Les chaînes

Les chaînes se présentent soit sous une forme littérale soit sous la forme d'un jeton d'énumération. Tous les contextes des propriétés permettent une conversion des jetons d'énumération vers des chaînes. Voir le chapitre [5.9.12 Les conversions des valeurs des expressions].

5.9.9 Les couleurs

Une couleur est un jeu de valeurs utilisé pour identifier une couleur donnée dans un espace de couleur. Seules les couleurs RGB (Red, Green, Blue) [sRGB] et ICC (International Color Consortium) [ICC] font partie de cette Recommandation.

Les couleurs RGB sont représentées directement dans le langage de l'expression à l'aide d'une notation hexadécimale. On peut spécifier des couleurs ICC au travers d'une fonction rgb-icc(). On peut aussi spécifier les couleurs au travers de la fonction system-color() ou d'un jeton JetonÉnumération via le contexte de propriété.

5.9.10 Les mots-clés

Les mots-clés sont des jetons particuliers, dans la grammaire, qui fournissent un accès aux valeurs calculées ou à d'autres valeurs de propriété. Les mots-clés admis sont définis dans les sections qui suivent.

5.9.10.1 inherit

La propriété prend la même valeur calculée que celle de la propriété du parent de l'objet de mise en forme en question.

Remarque :

La valeur "inherit" n'est pas admise dans une expression faisant intervenir des opérations. Cette même fonctionnalité est offerte par la fonction from-parent(), celle-ci pouvant être mêlée à des opérations.

5.9.11 La structure lexicale

Lors du traitement d'une expression, on peut admettre un blanc (ExprBlanc), avant ou après tout jeton d'expression, bien que ceci ne soit pas défini explicitement comme tel dans la grammaire. Dans certains cas, un blanc est nécessaire pour distinguer lexicalement les jetons dans la grammaire. Essentiellement, un blanc devrait être considéré comme n'existant pas après que l'atomisation [N.d.T. tokenization] de l'expression soit survenue.

On doit appliquer les règles d'atomisation particulières qui suivent, dans l'ordre spécifié, pour lever les ambiguïtés éventuelles de la grammaire :

La structure d'une expression lexicale
[14]   ExprJeton   ::=   '(' | ')' | '%'
| Opérateur
| NomFonction
| JetonÉnumération
| Nombre
[15]   Nombre   ::=    NombreDécimal
[16]   NombreDécimal   ::=   Chiffres ('.' Chiffres?)?
| '.' Chiffres
[17]   Chiffres   ::=   [0-9]+
[18]   Couleur   ::=   '#' AlphaOuChiffres
[19]   AlphaOuChiffres   ::=   [a-fA-F0-9]+
[20]   Littérale   ::=   '"' [^"]* '"'
| "'" [^']* "'"
[21]   Opérateur   ::=   NomOpérateur
| OpérateurMultiplier
| '+' | '-'
[22]   NomOpérateur   ::=   'mod' | 'div'
[23]   OpérateurMultiplier   ::=   '*'
[24]   Mot-clé   ::=   'inherit'
[25]   NomFonction   ::=    NCName
[26]   JetonÉnumération   ::=   NCName
[27]   NomUnitéAbsolue   ::=   'cm' | 'mm' | 'in' | 'pt' | 'pc' | 'px'
[28]   NomUnitéRelative   ::=   'em'
[29]   ExprBlanc   ::=   S

5.9.12 Les conversions des valeurs d'expression

Les valeurs issues de l'évaluation d'une expression peuvent être converties en des types de valeur de propriété. Dans certains cas, il s'agit d'une simple vérification d'appartenance à un jeu de valeurs (par exemple, cette valeur correspond-elle à un code de pays valide). Dans d'autres cas, la valeur est censée être d'un type simple, comme un entier, et doit être convertie.

Tous les types ne sont pas forcément admis pour une conversion. Si la valeur de l'expression ne peut être convertie en un type nécessaire pour la valeur de la propriété, il y a erreur.

Le tableau suivant indiquent les conversions qui sont admises.

TypeConversions admisesContraintes
NCName
  • Couleur, via la fonction system-color() ;

  • Valeur d'énumération, comme indiqué dans la définition de la propriété ;

  • Vers une chaîne littérale.

La valeur peut être vérifiée par rapport à un jeu de valeurs légal, selon la propriété.
NumériqueAbsolue
  • Entier, via la fonction round() ;

  • Couleur, comme valeur de couleur RGB.

Pour une conversion vers une valeur de couleur RGB, ce doit être une valeur de couleur légale de l'espace de couleur.
LongueurRelative
  • Vers une longueur absolue.

 

La conversion spécifique à appliquer est propre à la propriété, on trouve celle-ci dans chaque définition de propriété.

Remarque :

Les conversions des valeurs des propriétés composées ne sont pas admises ; ainsi, par exemple, space-before.optimum = "inherited-property-value(space-before)" est invalide. Sont admises, par exemple, space-before = "inherited-property-value(space-before)" et space-before.optimum = "inherited-property-value(space-before.optimum)", celles-ci ne nécessitant pas de conversion.

5.9.13 Les définitions des unités de mesure

Dans cette recommandation, les unités de mesure sont définies ainsi :

NomDéfinition
cmVoir [ISO31]
mmVoir [ISO31]
in2.54cm
pt1/72in
pc12pt
pxVoir [5.9.13.1 Les pixels]
emVoir [5.9.7.2 Les longueurs relatives]
5.9.13.1 Les pixels

XSL interprète une unité « px » comme étant une requête adressée au formateur pour que celui-ci choisisse une mesure dépendante de l'appareil, cette mesure approchant la vision d'un pixel sur un moniteur générique. L'interprétation suit :

  1. La définition préférée pour un « px » est :

  2. Cependant, les mises en œuvre peuvent simplement prendre, à la place, un facteur de conversion fixe, en traitant un « px » comme une unité de mesure absolue (comme, par exemple, 1/92" ou 1/72").

Remarque :

On ne devrait pas mélanger des pixels avec d'autres unités absolues dans les expressions, ceci pouvant conduire à des effets indésirables. Également, les valeurs hérités de propriétés devraient faire l'objet d'une attention particulière, quand la spécification de ces propriétés peut avoir été faite en pixels.

Si l'agent utilisateur, pour un « px », choisit une mesure qui ne correspond pas à un nombre entier de points matériels dans chacun des axes, ceci peut causer des effets indésirables, tels que :

Les auteurs de feuilles de style devraient comprendre que la taille réelle d'un pixel peut varier d'un appareil à l'autre, ainsi :

5.10 La librairie des fonctions de base

5.10.1 Les fonctions numériques

Fonction : numérique floor(numérique)

La fonction floor() retourne le plus grand entier (le plus proche de l'infini positif), qui n'est pas plus grand que l'argument. L'argument numérique pour cette fonction doit être d'une puissance d'unité zéro.

Remarque :

S'il est nécessaire d'employer la fonction floor() pour une propriété qui attend une puissance d'unité de un, alors on doit l'utiliser dans une expression de cette manière : "floor(1.4in div 1.0in)*1.0in". Ceci s'applique aux fonctions ceiling(), round() et d'autres fonctions de ce genre pour lesquelles une puissance d'unité de zéro est requise.

Fonction : numérique ceiling(numérique)

La fonction ceiling() retourne le plus petit entier (le plus proche de l'infini négatif), qui n'est pas moindre que l'argument. L'argument numérique pour cette fonction doit être d'une puissance d'unité de zéro.

Fonction : numérique round(numérique)

La fonction round() retourne l'entier le plus proche de l'argument. S'il existe deux nombres dans ce cas, alors c'est celui le plus proche de l'infini positif qui est retourné. L'argument numérique pour cette fonction doit être d'une puissance d'unité de zéro.

Fonction : numérique min(numérique, numérique)

La fonction min() retourne le plus petit des deux arguments numériques. Ceux-ci doivent avoir la même puissance d'unité.

Fonction : numérique max(numérique, numérique)

La fonction max() retourne le plus grand des deux arguments numériques. Ceux-ci doivent avoir la même puissance d'unité.

Fonction : numérique abs(numérique)

La fonction abs() retourne la valeur absolue de l'argument numérique. Ainsi, quand celui-ci est négatif, la fonction retourne la valeur négative de l'argument.

5.10.2 Les fonctions de couleur

Fonction : couleur rgb(numérique, numérique, numérique)

La fonction rgb() retourne une couleur spécifique de l'espace de couleur RGB. Les paramètres de cette fonction doivent être des valeurs numériques (nombres réels) avec une puissance de longueur de zéro.

Fonction : couleur rgb-icc(numérique, numérique, numérique, NCName, numérique, numérique)

La fonction rgb-icc() retourne une couleur spécifique du Profil de Couleur ICC. Le profil de couleur est spécifié par le paramètre nommé (le quatrième paramètre). Ce profil doit avoir été déclaré dans l'objet de mise en forme fo:declarations à l'aide d'un objet de mise en forme fo:color-profile.

Les trois premiers paramètres spécifient une couleur de repli dans l'espace de couleur sRGB. Celle-ci est utilisée quand le profil de couleur n'est pas disponible.

La couleur est spécifiée par une séquence formée d'une ou plusieurs valeurs de couleur (nombres réels) qui vient après le paramètre nommé. Ces valeurs sont propres au profil de couleur.

Fonction : couleur system-color(NCName)

La fonction system-color() retourne une couleur définie dans le système avec un nom donné.

5.10.3 Les fonctions de police

Fonction : objet system-font(NCName, NCName)

La fonction system-font() retourne une caractéristique d'une police système. Le premier argument est le nom de la police système et le second argument, qui est optionnel, nomme la propriété qui spécifie la caractéristique. Si le second argument est omis, alors la caractéristique qui est retournée correspond au nom même de la propriété sur laquelle l'expression est en train de s'exercer.

Par exemple, l'expression system-font(heading,font-size) retourne la caractéristique de taille de la police système nommée « heading ». Ceci est équivalent à l'assignation de propriété font-size="system-font(heading)".

5.10.4 Les fonctions de valeur de propriété

Fonction : objet inherited-property-value(NCName)

La fonction inherited-property-value() retourne la valeur héritée de la propriété dont le nom correspond avec celui de l'argument spécifié ou , si celui-ci est omis, pour la propriété sur laquelle l'évaluation de l'expression est en cours. Il y a erreur si cette propriété n'est pas une propriété héritée.

La « valeur héritée » qui est retournée est la valeur calculée de cette propriété sur le parent de cet objet. En particulier, l'exemple suivant :

<fo:list-block>
  ...
  <fo:list-item color="red">
    <fo:list-item-body background-color="green">
      <fo:block background-color="inherited-property-value(color)">
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>
</fo:list-block>

La propriété 'background-color' sur l'objet de mise en forme fo:block reçoit la valeur "red", parce que la valeur calculée, après héritage, de la propriété 'color' (et non pas 'background-color'), celle-ci sur l'objet de mise en forme fo:list-item-body parent de fo:block, cette valeur est "red".

Fonction : numérique label-end()

La fonction label-end() retourne la valeur de label de fin calculée, pour les listes. Voir la définition au chapitre [7.28.3 'provisional-label-separation'].

Fonction : numérique body-start()

La fonction body-start() retourne la valeur du début de corps calculée, pour les listes. Voir la définition au chapitre [7.28.4 'provisional-distance-between-starts'].

Remarque :

Quand cette fonction est employée en dehors d'une liste, elle retourne quand même une valeur calculé comme indiquée.

Fonction : objet from-parent(NCName)

La fonction from-parent() retourne une valeur calculée de la propriété dont le nom correspond avec l'argument spécifié ou, si celui-ci est omis, la retourne à la propriété pour laquelle l'expression est en cours d'évaluation. La valeur retournée est alors celle du parent de l'objet de mise en forme pour lequel l'expression est évaluée. S'il n'y a pas de parent, la valeur retournée correspond à la valeur initiale. Si l'argument spécifie une propriété raccourcie et si l'expression ne consiste qu'en la fonction from-parent(), son argument correspondant à la propriété en cours de calcul, alors elle est interprétée comme le développement d'une propriété raccourcie en ses propriétés individuelles, chacune d'entre elles ayant une valeur from-parent avec un argument leur correspondant. Il y a erreur si les arguments correspondant à une propriété raccourcie sont utilisés d'une autre manière.
« errata-E5 »

Fonction : objet from-nearest-specified-value(NCName)

La fonction from-nearest-specified-value() retourne une valeur calculée de la propriété dont le nom correspond à l'argument spécifié ou, si celui-ci est omis, la retourne à la propriété pour laquelle l'expression est en cours d'évaluation. La valeur retournée est alors celle de l'ancêtre le plus proche de l'objet de mise en forme, pour lequel l'expression est évaluée, sur lequel il y a une attribution de la propriété dans l'arbre résultant XML dans l'espace nominal fo. S'il n'existe pas de tel ancêtre, la valeur retournée est la valeur initiale. Si l'argument spécifie une propriété raccourcie et si l'expression ne consiste qu'en la fonction from-nearest-specified-value(), son argument correspondant à la propriété en cours de calcul, alors elle est interprétée comme le développement d'une propriété raccourcie en ses propriétés individuelles, chacune d'entre elles ayant une valeur from-nearest-specified-value avec un argument leur correspondant. C'est une erreur que d'employer les arguments correspondant à une propriété raccourcie d'une autre manière.

Fonction : objet from-table-column(NCName)

La fonction from-table-column() retourne la valeur héritée de la propriété dont le nom correspond avec l'argument spécifié ou, si celui-ci est omis, la retourne à la propriété pour laquelle l'expression est en cours d'évaluation, à partir de l'objet de mise en forem fo:table-column, dont la valeur du trait column-number correspond avec la colonne pour laquelle l'expression est évaluée et dont la valeur du trait number-columns-spanned correspond également avec une éventuelle fusion de plusieurs colonnes. S'il n'y a aucune correspondance pour le trait number-columns-spanned, cette fusion est assimilée à une colonne. S'il n'y a toujours pas de correspondance, la valeur initiale est retournée. C'est une erreur que d'employer cette fonction sur des objets de mise en forme autres que fo:table-cell et leurs descendants.

Fonction : numérique proportional-column-width(numérique)

La fonction proportional-column-width() retourne N unités de mesure proportionnelle, où N est l'argument donné à la fonction. Les largeurs des colonnes sont déterminées en premier sans tenir compte des mesures proportionnelles. La différence entre la largeur de la table et la somme des largeurs des colonnes représente la largeur proportionnelle disponible. Une unité de mesure proportionnelle correspond à la largeur proportionnelle disponible, divisée par la somme des facteurs proportionnels. C'est une erreur que d'employer cette fonction sur des objets de mise en forme autres que fo:table-column. C'est également une erreur de l'employer quand on n'utilise pas la disposition de table fixe.

Fonction : objet merge-property-values(NCName)

La fonction merge-property-values() retourne une valeur de la propriété dont le nom correspond à l'argument ou, si celui-ci est omis, la retourne à la propriété pour laquelle l'expression est en cours d'évaluation. La valeur retournée est celle spécifiée sur le dernier objet de mise en forme fo:multi-property-set, d'un parent fo:multi-properties, qui s'exerce sur l'état de l'agent utilisateur. S'il n'y a pas une telle valeur, c'est la valeur calculée du parent fo:multi-properties qui est retournée.

Remarque :

Le test, pour déterminer si l'état d'un agent utilisateur permet une application, s'effectue avec la propriété 'active-state'.

C'est une erreur que d'employer cette fonction sur des objets de mise en forme autres qu'un objet fo:wrapper, celui-ci un enfant d'un objet fo:multi-properties.

5.11 Les types de données des propriétés

Certaines valeurs de propriété sont décrites en termes de types de données composés, de restrictions sur des valeurs de nombre permises ou de chaînes avec une sémantique propre.

Les types de données composés, tel qu'un espace, sont représentés dans l'arbre résultant comme des attributs multiples. Les noms de ces attributs sont constitués du nom de la propriété, suivi par un point, suivi par le nom du composant. Par exemple, la spécification d'une propriété 'space-before' peut être comme suit :

space-before.minimum = "2.0pt"
space-before.optimum = "3.0pt"
space-before.maximum = "4.0pt"
space-before.precedence = "0"
space-before.conditionality = "discard"

On peut utiliser une forme raccourcie pour spécifier une valeur composée, pour le cas où le type de données comprend certains composants de <longueur> et pour le type de données <rétention>. Dans le premier cas, la spécification est réalisée avec une valeur de <longueur> donnée à un attribut avec un nom qui correspond à celui d'une propriété. Une telle spécification donne cette valeur à chacun des composants de <longueur> et leur valeur initiale à tous les composants qui ne sont pas de ce type. Par exemple :

space-before="4.0pt"

cette spécification équivaut à celles-ci :

space-before.minimum = "4.0pt"
space-before.optimum = "4.0pt"
space-before.maximum = "4.0pt"
space-before.precedence = "0"
space-before.conditionality = "discard"

Remarque :

Comme une valeur du type <percentage>, quand elle n'est pas interprétée comme étant "auto", est une valeur du type <longueur> valide, on peut employer celle-ci dans une forme raccourcie.

Pour le type de données <rétention>, la spécification est réalisée en donnant une valeur, qui est valide pour un composant, à un attribut dont le nom correspond avec celui d'une propriété. Une telle spécification donne cette valeur à chacun des composants. Par exemple :

keep-together = "always"

cette spécification équivaut à celles-ci :

keep-together.within-line = "always"
keep-together.within-colums = "always"
keep-together.within-page = "always"

On peut employer les formes raccourcies en même temps que les formes complètes ; les formes complètes ont priorité sur les formes raccourcies développées. Par exemple :

space-before = "4.0pt"
space-before.maximum = "6.0pt"

cette spécification équivaut à celles-ci :

space-before.minimum = "4.0pt"
space-before.optimum = "4.0pt"
space-before.maximum = "6.0pt"
space-before.precedence = "0"
space-before.conditionality = "discard"

Les valeurs composées des propriétés s'héritent comme un tout et non comme des composants individuels. Après héritage, on utilise éventuellement une spécification par la forme complète sur le composant pour lui donner sa valeur.

Si la valeur calculée d'un propriété relative correspondante est donnée à partir de la propriété absolue correspondante, on utilise la valeur de cette dernière pour déterminer celles de tous les composants de la propriété relative.

Remarque :

Par exemple, en supposant une direction de progression de bloc de "haut-en-bas" dans cette spécification :

margin-top = "10.0pt"
space-before.minimum = "4.0pt"

une valeur donnée explicitement à l'un des composants de la propriété relative n'aura aucun effet.

Voici les définitions syntaxiques pour la spécification des types de données utilisables dans les valeurs des propriétés :

<entier>

Une valeur entière signée, constituée d'un caractère « + » ou « - » optionnel, suivi par une suite de chiffres. Une propriété peut définir des contraintes supplémentaires sur la valeur.

Remarque :

Un signe « + » est admis pour une compatibilité avec CSS2.

<nombre>

Un nombre réel signé, constitué d'un caractère; « + » ou « - » optionnel, suivi par une suite de chiffres, suivie d'un point « . » optionnel et d'une suite de chiffres. Une propriété peut définir des contraintes supplémentaires sur la valeur ;

<longueur>

Une valeur de longueur signée, où « longueur » est un nombre réel qualifié d'une unité. Une propriété peut définir des contraintes supplémentaires sur la valeur ;

<longueur-plage>

Un type de données composé, ses composants : minimum, optimum et maximum. Chaque composant est du type <longueur>. Si la valeur de "minimum" est supérieure à celle de "optimum", celle-ci sera considérée ayant la valeur de "optimum". Si la valeur de "maximum" est inférieure à celle de "optimum", celle-ci sera considérée ayant la valeur de "optimum". Une propriété peut définir des contraintes supplémentaires sur la valeur ;

<longueur-conditionnelle>

Un type de données composé, ses composants : length et conditionality. Le composant length est du type <longueur>. Le composant conditionality prend la valeur "discard" ou "retain". Une propriété peut définir des contraintes supplémentaires sur la valeur ;

<longueur-bp-ip-direction>

Un type de données composé, ses composants : block-progression-direction et inline-progression-direction. Chacun des composants est du type <longueur>. Une propriété peut définir des contraintes supplémentaires sur la valeur ;

<espace>

Un type de données composé, ses composants : minimum, optimum, maximum, precedence et conditionality. Les composants minimum, optimum et maximum sont du type <longueur>. Le composant precedence prend soit la valeur "force", soit une valeur du type <entier>. Le composant conditionality prend la valeur "discard" ou "retain". Si la valeur de "minimum" est supérieure à celle de "optimum", celle-ci sera considérée ayant la valeur de "optimum". Si la valeur de "maximum" est inférieure à celle de "optimum", celle-ci sera considérée ayant la valeur de "optimum" ;

<rétention>

Un type de données composé, ses composants : within-line, within-column et within-page. La valeur de chacun des composants est soit "auto" ou "always", soit du type <entier> ;

<angle>

Une représentation d'un angle, constitué d'un caractère « + » ou « - » optionnel, suivi immédiatement d'un <nombre>, suivi immédiatement d'un identifiant d'unité d'angle. Les identifiants d'unité d'angle sont « deg » (pour les degrés), « grad » (pour les grades) et « rad » (pour les radians). Les valeurs spécifiées sont normalisées dans une échelle allant de "0deg" à "360deg". Une propriété peut définir des contraintes supplémentaires sur la valeur ;

<pourcentage>

Un pourcentage réel signé, constitué d'un caractère « + » ou « - » optionnel, suivi par une suite de chiffres, suivie d'un point « . » optionnel et d'une suite de chiffres suivis par le caractère « % ». Une propriété peut définir des contraintes supplémentaires sur la valeur ;

<caractère>

Un seul caractère Unicode ;

<chaîne>

Une séquence de caractères ;
« errata-E6 »

<nom>

Une chaîne de caractères représentant un nom. Celui-ci doit être conforme à la définition du type NCName dans [XML Names] ;

<famille-nom>

Une chaîne de caractères identifiant une police ;

<couleur>

C'est soit une chaîne de caractères représentant un mot-clé, soit une fonction de couleur définie au chapitre [5.10.2 Les fonctions de couleur]. La liste des mots-clés de couleur : aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, white et yellow ;

<pays>

Une chaîne de caractères conforme à un code de pays pour ISO 3166 ;

<langue>

Une chaîne de caractères conforme au code de trois lettres ISO 639 ;
« errata-E7 »

<script>

Une chaîne de caractères conforme à un code de script ISO 15924 ;

<id>

Une chaîne de caractères conforme à la définition du type NCName dans [XML Names] et unique dans la feuille de style ;

<idref>

Une chaîne de caractères conforme à la définition du type NCName dans [XML Names] et qui correspond à une valeur de propriété ID dans la feuille de style ;

<uri-spécification>

Une séquence de caractères, « url( », suivie par un caractère guillemet optionnel, simple « ' » ou double « " », suivi par une référence d'URI, tel que défini dans [RFC2396], suivi par un caractère guillemet optionnel, simple « ' » ou double « " », suivi par un blanc optionnel et suivi par le caractère « ) ». Les deux caractères guillemets doivent être tous les deux identiques et tous les deux soit présents, soit absents. Si la référence d'URI contient un guillemet simple, il faut absolument mettre celle-ci entre guillemets doubles ;

<durée>

Un <nombre> immédiatement suivi par un identifiant d'unité de durée. Les identifiants d'unité de durée : « ms » (pour des millisecondes) et « s » (pour des secondes) ;

<fréquence>

Un <nombre> immédiatement suivi par un identifiant d'unité de fréquence. Les identifiants d'unité de fréquence : « Hz » (pour Hertz) et « kHz » (pour kiloHertz).


    

Précédent

Table des matières

début de page          

Suivant