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.