Liste de bâtiment avec xslt
Je suis en train de construire une liste qui analyse l'ensemble de mon document xml. J'ai besoin de la liste numérique des noms alors l'alpha noms. La liste devrait ressembler à quelque chose comme ça.
6
6600 Training
6500 Training
A
Accelerated Training
T
Training
Ceci est un extrait de l'xml.
<courses>
<course>
<name>Accelerated Training</name>
</course>
<course>
<name>6600 Training</name>
</course>
<course>
<name>Training</name>
</course>
<course>
<name>6500 Training</name>
</course>
</courses>
C'est le code que j'utilise actuellement. J'ai trouvé ça dans une autre question sur le site et de pouvoir la personnaliser un peu. Actuellement, il ne tient pas compte de mon besoin de l'analyse en nombre et aussi des rendements de l'ordre alphabétique.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vLower" select= "'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="vUpper" select= "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:key name="kTitleBy1stLetter" match="courses/course" use="substring(name,1,1)"/>
<xsl:template match="/*">
<xsl:for-each select="course [generate-id() = generate-id(key('kTitleBy1stLetter', substring(name,1,1)) [1] ) ]">
<xsl:variable name="v1st" select="substring(name,1,1)"/>
<h2><xsl:value-of select="$v1st"/></h2>
<div class="{translate($v1st, $vUpper, $vLower)}-content">
<ul>
<xsl:for-each select="key('kTitleBy1stLetter',$v1st)">
<li><xsl:value-of select="name"/></li>
</xsl:for-each>
</ul>
</div>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, vous avez besoin de groupe par la première lettre et de les trier par
<name>
. Vous êtes sur une bonne voie avec votre Muenchian approche de regroupement déjà.Je voudrais suggérer une alternative qui est un peu plus facile sur les yeux:
sorties:
EDIT: Pour des raisons de lisibilité, j'ai laissé de côté la partie supérieure du boîtier de la première lettre. La clé correcte serait cela (vous ne pouvez pas utiliser une variable dans une clé, d'où la traduction littérale de l'alphabet de chaînes de caractères):
Il en va de même bien sûr pour les
$initial
variable dans le deuxième modèle, mais ici, vous pouvez en fait utiliser des variables de nouveau.EDIT #2: Puisque le tri est sensible à la casse, vous pouvez utiliser la même expression:
D'une transformation XSLT 2.0 solution:
Lors de la transformation ci-dessus est appliquée sur l'origine du document XML fourni par le:
le résultat voulu est produit (au format texte pour des raisons de simplicité -- produire le Html est laissé comme exercice pour le lecteur 🙂
Ne remarque:
L'utilisation de la
<xsl:for-each-group>
XSLT 2.0 instructionL'utilisation de la
courant-regroupement-clés()
etcourant-groupe de()
XSLT 2.0 fonctions.L'utilisation de la
majuscule()
XPath 2.0 fonctionBien les chiffres de la partie est difficile si vous voulez quelque chose de complexe, mais en fonction de votre sortie idéale à tous vous êtes en manque plus qu'un simple tri sur votre pour-chaque:
mise en garde: je ne fais pas de revendications à propos de cet être la meilleure ou la seule ou autre méthode, simplement que cela fonctionne arrêt complet, et utilise ce que vous avez déjà.