2012-04-10 70 views
0

我需要使用XSLT在XML中对两个不同的元素进行分组。这里是示例XML:XSLT中的多个分组

<root> 
<name>Joe</name> 
<classYear>1996</classYear> 
<deathDate>September 10, 2010</deathDate> 
<monthName>September 2010</deathDate> 
<moreInfo></moreInfo> 
<link><a href="http://somelink.com">Details available here.</a></link> 
</root> 
<root> 
<name>Sam</name> 
<classYear>1981</classYear> 
<deathDate>January 1, 2003</deathDate> 
<monthName>January 2003</deathDate> 
<moreInfo>He played on the baseball team.</moreInfo> 
<link><a href="http://anotherlink.com">Details available here.</a></link> 
</root> 

我需要按月分组,然后classYear内。我需要按照monthName,classYear,然后是deathDate的一天部分进行排序。如果在课程年度只有一个死亡声明,我希望它在线显示,然后在同一个月的一个班级有多个公告时显示阻止。

这是我到目前为止。它按月份成功分组,但不按classYear分组。

<xsl:variable name="vMonthNamesCaps" select="'|JANUARY|FEBRUARY|MARCH|APRIL|MAY|JUNE|JULY|AUGUST|SEPTEMBER|OCTOBER|NOVEMBER|DECEMBER'"/> 
<xsl:for-each select="//monthName[not(. = following::monthName)]"> 
    <xsl:sort select="string-length(substring-before($vMonthNamesCaps,substring-before(.,' ')))" data-type="number" order="ascending" /> 
    <H2><xsl:value-of select="."/></H2> 
    <xsl:for-each select="//root[monthName=current()]"> 
    <xsl:sort select="classYear"/> 
    <xsl:sort select="substring-after(substring-before(deathDate,', '),' ')" data-type="number" order="ascending" /> 
    <strong>Class of <xsl:value-of select="classYear"/>: </strong><span class="name"><xsl:value-of select="name"/></span> died on <xsl:value-of select="deathDate"/>. <xsl:value-of select="moreInfo"/> 
    <xsl:choose> 
     <xsl:when test='count(link/a) &gt; 0'> 
     <xsl:copy-of select="link/a" /> 
     </xsl:when> 
     <xsl:otherwise></xsl:otherwise> 
    </xsl:choose> 
    <br /><br /> 

    </xsl:for-each> 
</xsl:for-each> 

回答

0

你要检查xsl:key作为一个简单的办法有一个或多个“GROUPBY”游标。