Sorting in XSLT
[email protected] (hufflen jean-michel) Thu, 13 Mar 2008 14:06:56 +0100 (CET)
| Newsgroups | gmane.text.xml.french.tech |
|---|---|
| Message-ID | <[email protected]> |
Bonjour à tous, Il s'agit plus d'une demande de confirmation qu'une véritable question... mais sait-on jamais... au cas où... Considérons la spécification suivante, donnée sous forme d'un extrait de DTD : <!ELEMENT bibliography (item*)> <!ELEMENT item (authors,...)> <!ELEMENT authors (person*)> <!ELEMENT person (lastname,firstname)> <!ELEMENT lastname (#PCDATA)> <!ELEMENT firstname (#PCDATA)> Comment écrire en XSLT, un tri d'une bibliographie par ordre croissant sur les noms des auteurs ? S'il n'y en avait que deux au maximum, on pourrait écrire quelque chose comme : <xsl:apply-templates select="item"> <xsl:sort select="authors/person[1]/lastname"/> <xsl:sort select="authors/person[1]/firstname"/> <xsl:sort select="authors/person[2]/lastname"/> <xsl:sort select="authors/person[2]/firstname"/> </xsl:apply-templates> ... mais en l'absence d'informations sur le plus grand nombre possible d'auteurs, cette méthode est inapplicable. En cherchant sur le "Net", j'ai vu des endroits où l'on propose un contournement : récupérer la concaténation de tous les noms et prénoms des auteurs et se baser sur cette gigantesque chaîne. Mais voici quel est l'inconvénient que j'y vois ; considérons les deux noms suivants : <person> <!-- Nom [1]. --> <lastname>Hood</lastname> <firstname>Robin Locksleyy</firstname> </person> <person> <!-- Nom [2]. --> <lastname>Hood Robin</lastname> <firstname>Locksley</firstname> </person> Si l'on se base sur des concaténations avec insertion d'espaces, les deux chaînes résultantes sont : "Hood Robin Locksleyy" et "Hood Robin Locksley" moyennant quoi [2] < [1]. Mais si l'on se base d'abord sur les noms de famille, et si besoin est sur les prénoms, alors [1] < [2]. Qu'en pensez-vous ? Y a-t-il finalement un moyen élégant d'exprimer un tel tri sans passer par une interface avec un langage de programmation ? Bien à vous, J.-M. H.