Ci-dessous j'ai un fichier XML avec une liste d'événements. Ce que je veux accomplir, c'est de les regrouper par ville, New York étant toujours en tête de liste. Les autres villes sont censées être triées par nom, puis les événements triés par date. Je peux tout faire (avec un peu de hack) en plus de trier d'autres villes.Groupe XSL et tri avec l'élément spécifique sur le dessus
<Events>
<Event id="1">
<Title>Concert1</Title>
<Date>2017-01-05 12:00</Date>
<City>Seattle</City>
</Event>
<Event id="2">
<Title>Concert2</Title>
<Date>2017-01-05 11:00</Date>
<City>Los Angeles</City>
</Event>
<Event id="3">
<Title>Concert3</Title>
<Date>2017-01-05 14:00</Date>
<City>New York</City>
</Event>
<Event id="4">
<Title>Concert4</Title>
<Date>2017-01-05 19:00</Date>
<City>Austin</City>
</Event>
<Event id="5">
<Title>Concert5</Title>
<Date>2017-01-05 15:00</Date>
<City>New York</City>
</Event>
<Event id="6">
<Title>Concert6</Title>
<Date>2017-01-05 12:00</Date>
<City>Austin</City>
</Event>
</Events>
Et un fichier XLS (1.0) qui utilise le groupement muenchian pour regrouper les événements par ville. également pour extraire de New York au sommet de la liste, j'ai fait 2 distincts pour chaque boucle:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
<xsl:key name="groups" match="City" use="."/>
<xsl:template match="/Events">
<xsl:apply-templates select="Event/City[generate-id() = generate-id(key('groups', .)[1])]"/>
</xsl:template>
<!-- NEW YORK -->
<xsl:template match="City[text()='New York']">
<xsl:variable name="currentGroup" select="."/>
<b><xsl:value-of select="$currentGroup"/></b><br/>
<xsl:for-each select="key('groups', $currentGroup)">
<xsl:sort select="../Date"/>
<i>+ <xsl:value-of select="../Date"/> <xsl:value-of select="../Title"/></i><br/>
</xsl:for-each>
</xsl:template>
<!-- OTHER CITIES -->
<xsl:template match="City[text()!='New York']">
<xsl:variable name="currentGroup" select="."/>
<b><xsl:value-of select="$currentGroup"/></b><br/>
<xsl:for-each select="key('groups', $currentGroup)">
<xsl:sort select="../Date"/>
<i>+ <xsl:value-of select="../Date"/> <xsl:value-of select="../Title"/></i><br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Actuellement, les « autres villes » sont dans un ordre d'entrée. Comment puis-je grouper et trier XML ci-dessus afin que le résultat HTML serait comme ceci:
New York
+ 14:00 Concert3
+ 15:00 Concert5
Austin
+ 12:00 Concert6
+ 19:00 Concert4
Los Angeles
+ 11:00 Concert2
Seattle
+ 12:00 Concert1
Oui! C'est exactement la syntaxe de filtrage que je cherchais pour les balises ''. Je vous remercie. Mon code a sorti New York d'abord parce que j'avais une solution laide avec 2 boucles, pour New York et d'autres. –
yosh