8. Retour sur un chemin XPath

Je voudrais revenir sur la fonction XPath qui nous a permis de retrouver toutes les langues d'un document. Cette expression était: //span[not(@xml:lang=preceding::span/@xml:lang)]/@xml:lang. Cette expression est construite ainsi: nous recherchons tous les attributs xml:lang des éléments span. Ceci pourrait suffire à établir la liste des langues, mais nous nous retrouverions à coup sur avec des doublons. Il s'agit donc de supprimer les doublons avec ce que contient le prédicat. Ce prédicat teste si l'attribut courant xml:lang est égal à un attribut xml:lang d'un élément span faisant partie de l'ensemble des noeuds précédent: precedent::span/@xml:lang. Si le test renvoie vrai, c'est que nous avons un doublon. Pour avoir le bon prédicat, nous inversons donc le résultat du test avec not(), ce qui donne le prédicat que vous retrouvez dans l'article vous montrant comment générer la page des nouvelles.

Un autre chemin XPath intéressant est celui que l'on trouve dans les briques en C pour tester les permissions: /authorizations/group[@name=/authorizations/action[@name='visiter' and @object='planete']/authorization/@grantedto]/user/text()[.='toto']. J'ai remplacé les %s que l'on trouve dans l'article par des valeurs plus concrètes ici. Voyez l'article pour le format du fichier XML des permissions. Ici, voici comment la requête est construite. Nous voulons un utilisateur qui s'appelle toto: /authorizations/group/user/text()[.='toto']. Nous voulons aussi que cet utilisateur se trouve dans un groupe dont le nom est un nom que l'on retrouve dans les actions autorisées. Nous remplaçons group par group[@name=/authorizations/action/authorization/@grantedto]. Enfin, ce n'est pas n'importe quelle action, mais l'action dont le nom est 'visiter' et l'objet est 'planete'. Nous remplaçons encore action par action[@name='visiter' and @object='planete']. Et nous aboutissons à la requète voulue. Cette requète nous renvoie donc le nom de l'utilisateur qui a justement ce nom, s'il a les permissions, et rien s'il n'y a pas de tel utilisateur. Dans l'exemple des briques en C, il n'y a pas de tel utilisateur pour effectuer une telle action, donc le résultat est vide!

création est mise à disposition sous un contrat Creative Commons