2017-09-18 10 views
0

以下私はイベントのリストを持つXMLファイルを持っています。 私が達成したいのは、ニューヨークと常にリストの上にある都市とそれらをグループ化することです。 他の都市は名前でソートされ、次に日付でソートされます。 私は他の都市を分類するだけでなく、すべてを(ハックで)行うことができます。XSLグループと特定の項目を上にソート

<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> 

ムンキアングループを使用してイベントを都市別にグループ化するXLS(1.0)ファイル。 はまた、リストの一番上にニューヨークを抽出するために、私がfor-eachループ別々の2を作った:

<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> 

現在、「他の都市は、」入力順です。私はグループとソート上記のXML HTMLの結果は次のようになりますように、どのように:あなたの投稿コードが出力「ニューヨーク」のイベントが最初にそれをして簡単にする必要がありますなぜ

New York 
+ 14:00 Concert3 
+ 15:00 Concert5 
Austin 
+ 12:00 Concert6 
+ 19:00 Concert4 
Los Angeles 
+ 11:00 Concert2 
Seattle 
+ 12:00 Concert1 

答えて

2

私はわからない

<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

はい!これはまさに私が ''タグを探していたフィルタリング構文です。ありがとうございました。私のコードは、ニューヨークなどのために、2つのループを持つ醜い解決策を持っていたので、まずニューヨークを出力しました。 – yosh

関連する問題