L'adressage

L'adressage permet à un processeur de piloter et/ou sélectionner des noeuds ou un ensemble de noeuds. Ce type d'adressage, également nommé chemin de localisation, peut apparaître sous différentes formes: 

  • avec une notation brève ou détaillée,
  • comme un chemin de localisation relatif ou absolu.

Notation brève ou détaillée

Il existe une notation brève ou bien détaillée pour les noeuds et les axes mentionnés dans les pages précédentes. Dans la pratique, les deux types de notation sont employés de façon mixte. On utilise la version courte quand il s'agit de noeuds des axes très souvent pilotés. La version détaillée est couramment utilisée pour les noeuds et axes qui sont rares. Dans les paragraphes suivants, nous présenterons les deux types de notation, tout en insistant sur les courtes notations quand elles sont souvent utilisées.

Exemple d'une notation détaillée:

/child::livre/child::auteur/child::prenom/attribut::nom

Exemple d'une courte notation:

/livre/auteur/prenom/@nom

Dans la notation courte, on renonce à la description de l'axe child:: et le noeud de l'attribut est désigné par le signe @. Plus d'explications dans les exemples ci-dessous.

Notation détailléeNotation courte
child:: "default" axe,
peut être supprimé
attribute:: @
descendant-or-self::node()/ //
self::node() .
parent::node() ..

Tableau: Notations courtes et détaillées des axes et des noeuds

Chemin de localisation relatif et absolu

Il est possible d'écrire un chemin de localisation relatif ou absolu (en partant de l'élément racine). Stricto sensus, les chemins de localisation absolus proviennent du noeud de racine - il s'agit du noeud qui se trouve en haut de l'élément racine. Si l'on ne fait pas cette distinction et on part seulement de l'élément racine, alors il n'est pas possible d'adresser des commentaires ou instructions de processus qui se trouvent en dehors de l'élément racine. 
Les chemins de localisation se composent de plusieurs pas uniques, séparés les uns des autres par des barres obliques.

Un exemple:

/child::europe/child::pays/child::nom

Dans ce cas, il s'agit d'un chemin absolu partant du noeud racine. Le noeud de racine est indiqué grâce à la première barre oblique. À cet endroit, l'élément racine <europe> est sélectionné. Il doit avoir un élément enfant <pays>, qui doit de nouveau posséder un élément enfant <nom>, afin d'obtenir une correspondance. Les axes sont indiqués par leur nom suivi de deux deux-points. Dans le cas de child:: l'indication des axes peut être omise. Par conséquent, le chemin /europe/pays/nom est équivalent (dans une notation courte). À l'inverse, les chemins relatifs ont besoin d'un noeud contexte. Le chemin est exploité relatif à cet noeud:

Exemple:

child::pays/child::nom

Une correspondance existe seulement si le noeud contexte a un élément <pays> qui contient un élément <nom>. Dans cet exemple, la description des chemins relatifs est incomplète! Nous vous conseillons de lire la littérature consacrée à XPath.

Exemples XPath dans le cadre d'une feuille de style XSLT

Notre instance pour l'exercice (Europe.xml):

<?xml version="1.0" encoding="UTF-8"?>
<europe>
   <pays>
      <nom>Allemagne</nom>
      <nombreHabitants unite="millions">82.4</nombreHabitants>
      <capitele>Berlin</capitale>
      <plaqueImmatriculation>D</plaqueImmatriculation>
      <indicatif>0049</indicatif>
   </pays> 
   <pays> 
       <nom>France</nom> 
       <nombreHabitants unite="millions">58.5</nombreHabitants> 
       <capitale>Paris</capitale> 
       <plaqueImmatriculation>F</plaqueImmatriculation>
       <indicatif>0033</indicatif>
    </pays>
    <pays> 
       <nom>Espagne</Nom> 
       <nombreHabitants unite="millions">39.4</nombreHabitants>
       <capitale>Madrid</capitale>
       <plaqueImmatriculation>E</plaqueImmatriculation>
       <indicatif>0034</indicatif>
    </pays>
</europe>   

Ci-dessous, un exemple XSLT avec un adressage XPath:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">                                              (1)
        <html>
            <title></title>
            <body>
                <h3>
                   <xsl:apply-templates/>
                </h3>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="europe">                                         (2)                    
        <xsl:if test="pays/nom">                                          (2)
            correspondance : /europe/pays/nom
            <br/>
        </xsl:if>
        <xsl:if test="pays/nombreHabitants">                              (3)
            correspondance : /europe/pays/nombreHabitants
            <br/>
        </xsl:if>
        <xsl:if test="pays/capitale">                                     (4)        
            correspondance : /europe/pays/capitale
            <br/>
        </xsl:if>
        <xsl:if test="child::nombreHabitants">                            (5)
            correspondance : /europe/nombreHabitants
            <br/>
        </xsl:if>
        <xsl:if test="descendant::nombreHabitants">                       (6)
            correspondance : /europe/descendant::nombreHabitants
            <br/>
        </xsl:if>
        <xsl:if test="pays/nom/following-sibling::nombreHabitants">       (7)
            correspondance : /europe/pays/nom/following-sibling::nombreHabitants
            <br/><br/><br/><br/>
        </xsl:if>
        <xsl:if test="pays/nom/following-sibling::nombreHabitants/        (8)  
            parent::pays/descendant::capitale">
            correspondance : /europe/pays/nom/following-sibling::nombreHabitants/
            parent::pays/descendant::capitale
            <br/><br/><br/><br/>
        </xsl:if>
        <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="pays">                                           (9)
        <xsl:if test="capitale"> correspondance : /europe/pays/capitale   (9)
            <br/>
        </xsl:if> 
        <xsl:if test="parent::europe"> correspondance : /europe/pays/parent::europe  (10)
            <br/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>


(1) Le caractère / indique un noeud de racine.

(2) L'élément <xsl:template> se réfère à l'élément racine <europe>. Celui-ci est un contexte de noeud pour les éléments <xsl:if> du template qui suivent. En conséquence, tous les chemins de localisation qui suivent, commencent à partir de ce point de départ. Dans le premier exemple, c.-à-d. pays/nom. Les instructions se trouvant au sein de l'élément <xsl:if> sont exécutées, car il y a un élément enfant <pays> de <europe> qui lui-même possède un élément enfant <nom>. Dans l'affichage apparaît un chemin absolu: /europe/pays/nom.

(3) Un autre exemple, afin de montrer la position du noeud de contexte.

(4) Un autre exemple, afin de montrer la position du noeud de contexte.

(5) Il ne se produit ici aucune sortie, car du point de vue du noeud de contexte <europe>, il n'y a aucun élément enfant nommé <nombreHabitants>. Ici, il aurait suffit d'écrire nombreHabitants, car selon la convention ce terme peut-être utilisé pour remplacer child::nombreHabitants.

(6) Ici, une sortie a de nouveau lieu, car il existe un descendant <nombreHabitants> de <europe>.

(7) À cet endroit, le processeur recherche un élément frère suivant following-sibling::)<nombreHabitants> de <nom> qui possède également <pays> en tant qu'élément parent. La sortie a lieu, car l'élément <nombreHabitants> se situe véritablement après <nom>.

(8) Les pattern de recherche, indiqués ici, doivent montrer que la complexité de l'exercice peut être augmentée à volonté. Ici, on recherche un élément enfant d'un noeud de contexte <europe>, ayant le nom <pays>. Celui-ci devra contenir un élément enfant <nom>, lequel possède un élément frère suivant <nombreHabitants>. Jusqu'ici, cette requête correspond à la précédente et nous savons qu'elle s'applique. L'élément <nombreHabitants> doit posséder désormais, en tant qu'élément parent, un élément <pays>. Ce dernier devrait avoir un descendant <capitale>. Comme on peut le constater dans l'exemple, toutes ces conditions sont remplies.

(9) À cet endroit, un nouveau template veille à ce que le noeud de contexte soit un autre. Désormais, les pattern de recherche à l'intérieur des templates se réfèrent à <paye>. À cet endroit, une question se pose, à savoir, si l'élément <pays> possède un élément enfant <capitale>.

(10) On recherche ici un élément parent <europe> du noeud de contexte <pays>.

Nous obtenons le résultat suivant:

<html>
    <title></title>
    <body>
        <h3> 
            correspondance : /europe/pays/nom                                         (2)
            <br/> 
            correspondance : /europe/pays/nombreHabitants                             (3)
            <br/>
            correspondance : /europe/pays/capitale                                    (4)
            <br/> 
            correspondance : /europe/descendant::nombreHabitants                      (6)
            <br/> 
            correspondance : /europe/pays/nom/following-sibling::nombreHabitants      (7)
            <br/><br/><br/><br/> 
            correspondance : /europe/pays/nom/following-sibling::nombreHabitants/     (8)
            parent::pays/descendant::capitale 
            <br/><br/><br/><br/> 
            correspondance : /europe/pays/capitale                                    (9)
            <br/>
            correspondance : /europe/pays/parent::europe                              (10)
            <br/> 
            correspondance : /europe/pays/capitale                                    (9)
            <br/> 
            correspondance : /europe/pays/parent::europe                              (10)
            <br/> 
            correspondance : /europe/pays/capitale                                    (9)
            <br/> 
            correspondance : /europe/pays/parent::europe                              (10)
            <br/>
        </h3>
    </body>
</html>

vue du browser

Lors de la mise en forme de la page (p. ex. dans ce livre), on effectue généralement un retrait de la première ligne d'un paragraphe en saisissant une certaine valeur. Dans notre exemple, nous ne voulons pas que cette règle s'applique directement après un titre s'affichant à gauche. Le premier template règle la mise en forme des paragraphes standard. Le second template s'applique à tous les paragraphes qui suivent directement un titre. L'élément paragraphe s'appelle <para>, l'élément titre <title>.

<xsl:template match="para">
   <fo:block text-indent="6mm"><xsl:apply-templates/></fo:block>
</xsl:template>
<xsl:template match="para[preceding-sibling::*[1][self::title]]">
   <fo:block text-indent="0mm"><xsl:apply-templates/></fo:block>
</xsl:template>

Une petite collection de chemins pour vous entraîner:

  • child::europe retourne les éléments enfants de l'élément <europe>.
  • child::node() retourne les noeuds enfants du noeud de contexte.
  • attribute::unite est la notation détaillée de @unite et retourne le contenu de l'attribut unite du noeud de contexte.
  • descendant::europe retourne les descendants de l'élément <europe>.
  • self::europe se retourne lui-même, lorsque le noeud de contexte se trouve être l'élément <europe>.
  • / retourne l'élément racine.
  • //*/@* retourne quelconque attribut de quelconque élément.
  • /child::comment() retourne tous les noeuds de commentaires qui sont les enfants du noeud racine.

Adressage des différents types de noeuds

Jusqu'à présent, nous nous sommes concentrés sur l'adressage de noeuds d'éléments. Tous les autres types de noeud peuvent également être sélectionnés, évalués, traités et sortis. Le tableau suivant montre à l'aide d'exemples comment procéder à cette sélection. 

nom/text() Lorsque le noeud de texte de l'élément nom est adressé, cesi se passe par le biais du test noeud text().
adresse/comment() Lorsque le noeud de commentaire de l'élément adresse est adressé, ceci se passe par le biais du test noeud comment().
lieu/processing-instruction() Lorsque le noeud PI de l'élément lieu est adressé, ceci se passe par le biais du test noeud processing-instruction().
adresse/node() Lorsque tous les types de noeuds (sauf attributs) sont adressés, ceci se passe par le biais du test noeud node().
<< précédent suivant >>

Copyright © dpunkt.verlag GmbH 2007
Vous pouvez imprimer cette version en ligne pour un usage privé. Par ailleurs, ce chapitre du livre "Professionelle XML-Verarbeitung mit Word" est soumis aux mêmes clauses prévues pour la version papier: L'intégralité de l'oeuvre est protégée par les droits d'auteurs. Tous droits réservés y compris la copie, la traduction, la reproduction sur microfilm, tout comme l'enregistrement et le traitement dans des systèmes électroniques.

dpunkt.verlag GmbH, Ringstraße 19B, 69115 Heidelberg, téléphone +49 (0)6221-14830, fax +49 (0)6221-148399, hallo(at)dpunkt.de