Forum Programmation.web Soucis xslt...

Posté par  .
Étiquettes : aucune
0
19
oct.
2004
Bonsoir tout le monde.
Voici mon soucis :
J'ai un fichier xml dans lequel j'ai des entrées de ce genre :
<personne nom="DUPONT" prenom="Machin" num_tel="458">...</personne>

Et de ces entrées, j'en ai un certain nombre, toutes à la suite.
Je voudrais écrire une feuille de style xlst qui me permette de sortir tout ça sous une forme (html "propre", en tout cas, xhtml 1.0 strict), présenté sous cette forme :
A
...
La liste des personnes dont le nom commence par A
B
...
La liste des personnes dont le nom commence par B,

etc...

Problème : je ne sais pas comment procéder. Ces entrées sont le constituant d'une arborescence d'annuaire, et au final, je voudrais pouvoir classer tout ça selon les demandes de l'utilisateur. Autant poser tout le problème tout de suite.
Ainsi, la présentation "brute" proposera une liste alphabétique intégrale, mais par la suite, j'aimerais qu'on puisse choisir (par quel moyen ? aucune idée, sugestions bienvenues :)) une présentation par bureau, service, etc.
Tous ces renseignements sont bien sûrs présents.
J'ai bien entendu fouillé un peu le web à la recherche du script correspondant à mes besoins, sans succès. J'ai bien trouvé quelques pistes sur le site du w3c, mais je n'ai pas été capable de mettre en oeuvre les exemples cités. Par avance merci pour votre aide, vos conseils....
  • # La norme est ton amie

    Posté par  (site web personnel) . Évalué à 3.

    http://www.w3.org/TR/xslt#element-sort(...)

    Y'a un exemple et tout que j'ai la flemme de copier parce que Templeet va le rendre illisible.
    • [^] # Re: La norme est ton amie

      Posté par  . Évalué à 1.

      Je suis encore allé trop vite en tapant mon message....
      En tout cas, je n'avais pas vu cette partie du document, je m'étais arrêté avant (peu importe). Ceci m'explique comment faire pour avoir ma liste triée par ordre alphabétique intégral, ce que je savait déjà faire, en utilisant de surcroit le parcours //personne...
      Ce que je voudrais, c'est extraire, un seule et unique fois : la première, la première lettre de façon à en faire un index cliquable avec des a href="#", et ça, je ne sais pas faire.
      J'ai pu voir cet après-midi qu'il fallait exploiter pour ce faire soit une key, soit une variable, comme expliqué ici : http://www.biglist.com/lists/xsl-list/archives/200201/msg00980.html(...)
      mais ce que j'ai trouvé ici :
      http://www.biglist.com/lists/xsl-list/archives/200110/msg00278.html(...)
      semble meilleur et mieux expliqué. Je ne suis toujours pas contre une solution toute faite, mais ces deux découvertes (la première en cherchant avec google "xsl distinct", et la seconde en cherchant "xsl unique") semblent de bon augure, ou tout au moins indiquent que mon cas ne semble pas désespéré !
      Merci en tout cas pour ce début de solution !
      • [^] # Re: La norme est ton amie

        Posté par  . Évalué à 1.

        Je me répond à moi-même, car en poursuivant mes google-investigations, je suis tombé sur ça : http://www.jenitennison.com/xslt/grouping/muenchian.html(...)
        Et là, franchement, si je n'arrive pas à m'en sortir avec ça...
        Par contre, je n'ai rien trouvé/cerché sur les xslt interactifs, mais je regarderais ça demain. Si ça peut intéresser quelqu'un, je veux bien publier ma solution ici même quand elle sera complétement fonctionnelle...
  • # Une solution

    Posté par  (site web personnel) . Évalué à 0.

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform(...)">

    <xsl:template match="/">
    <xsl:for-each select="/personnes/personne">
    <xsl:sort select="@nom" />
    <xsl:variable name="currentLetter" select="substring(@nom, 1, 1)" />
    <xsl:variable name="thisNode" select="." />
    <xsl:for-each select="/personnes/personne[starts-with(@nom, $currentLetter)][1]">
    <xsl:sort select="@nom" />
    <xsl:if test="generate-id(.)=generate-id($thisNode)">
    <h1><xsl:value-of select="$currentLetter" /></h1>
    </xsl:if>
    </xsl:for-each>
    <p><xsl:value-of select="@nom" /></p>
    </xsl:for-each>
    </xsl:template>

    </xsl:stylesheet>
    • [^] # Re: Une solution

      Posté par  . Évalué à 1.

      Mille mercis...mais ta solution arrive un peu tardivement.
      Ne sois pas déçu cependant, car elle m'ouvre d'autres perspectives pour d'autres choses !
      La solution à laquelle je suis arrivé utilise la fonction key() pour obtenir les initiales. J'avais vaguement capté que c'était possible avec les variables : grâce à toi, j'ai compris comment.
      Merci encore pour tes efforts, et cette solution "clef en main".

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.