2017-09-18 3 views
0

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 

Répondre

2

Je ne sais pas pourquoi votre code affiché génèrerait événements « New York » d'abord, mais il devrait être facile avec

<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="key('groups', 'New York')[1]"/> 
    <xsl:apply-templates select="Event/City[generate-id() = generate-id(key('groups', .)[1])][. != 'New York']"> 
     <xsl:sort select="."/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="City"> 
    <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> 
+0

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