在XSLT中按月和年份分组XML节点 [英] Grouping XML nodes by Month and Year in XSLT

查看:162
本文介绍了在XSLT中按月和年份分组XML节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

更新


我想向提供答案的人表示歉意,我似乎造成各种混乱。为了避免使事情更加复杂,我已经删除了以前的代码,并添加了新的信息。阅读...


我正在Umbraco的自定义博客上工作。 Umbraco吐出XML作为输出,然后使用XSLT读取。



XML的结构如下




  • 博客

    • 博客中心

      • 房间

        • 博客文章

        • 博客文章

        • 博客文章

        • <


          • 博客文章



      • 博客中心

        • 房间







    这是XML代码,我已经清理了很多,使其至少有些可读。

     < Blog id =1078parentID =1049level =2writerID =0creatorID =0nodeType =1073template =1089sortOrder = 7createDate =2010-09-27T14:11:04updateDate =2010-10-12T16:59:12nodeName =BlogwriterName =AdministratorcreatorName =Administratorpath = -  1, 1049,1078isDoc => 
    < newPageTitle> The Lorem Ipsum Blog< / newPageTitle>
    < BlogCentre id =1079parentID =1078level =3writerID =0creatorID =0nodeType =1075template =1076sortOrder =1createDate = 2010-09-27T14:11:49updateDate =2010-10-07T14:43:13nodeName =Blog Center 1writerName =AdministratorcreatorName =Administratorpath = - 1,1049,1078, 1079isDoc =>
    < Room id =1081parentID =1079level =4writerID =0creatorID =0nodeType =1077template =0sortOrder =1createDate = 2010-09-27T14:12:26updateDate =2010-10-07T14:43:06nodeName =Room 10writerName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1081isDoc =>
    < BlogPost id =1175parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1192sortOrder =1createDate = 2010-10-07T14:51:48updateDate =2010-10-12T21:30:53nodeName =第一次博客文章writerName =AdministratorcreatorName =Administratorpath = - 1,1049, 10,D=>
    < topicTitle>第一个博客< / topicTitle>
    < / BlogPost>
    < BlogPost id =1180parentID =1081level =5writerID =0creatorID =3nodeType =1087template =1089sortOrder =2createDate = 2010-10-08T15:52:20updateDate =2010-10-12T16:57:00nodeName =asdasdwriterName =AdministratorcreatorName =ZXpath = - 1,1049,1078,1079, 1081,1180isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < / BlogPost>
    < BlogPost id =1181parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =3createDate = 2010-10-08T17:50:19updateDate =2010-10-12T11:40:37nodeName =condimentumwriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079, 1081,1181isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-09-01T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1194parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =4createDate = 2010-10-12T11:41:50updateDate =2010-10-12T11:42:37nodeName =Nam auguewriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1081,1194isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-08-05T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1195parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =5createDate = 2010-10-12T11:42:15updateDate =2010-10-12T11:42:25nodeName =due not nuncwriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1081,1195isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-08-12T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1196parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =6createDate = 2010-10-12T12:05:57updateDate =2010-10-12T12:08:40nodeName =cursus conguewriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1081,1196isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2009-10-22T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1197parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =7createDate = 2010-10-12T12:08:54updateDate =2010-10-12T12:09:24nodeName =inceptoswriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079, 1081,1197isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2009-11-19T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1198parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =8createDate = 2010-10-12T12:09:45updateDate =2010-10-12T12:10:13nodeName =inceptos himenaeoswriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1081,1198isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2009-12-16T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1199parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =9createDate = 2010-10-12T12:10:29updateDate =2010-10-12T12:10:56nodeName =becatwriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079, 1081,1199isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-01-13T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1200parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =10createDate = 2010-10-12T12:11:08updateDate =2010-10-12T12:11:35nodeName =himenaeoswriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079, 1081,1200isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-02-09T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1201parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =11createDate = 2010-10-12T12:11:45updateDate =2010-10-12T12:12:35nodeName =cursus conguewriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1081,1201isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-04-22T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1202parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =12createDate = 2010-10-12T12:12:18updateDate =2010-10-12T12:12:45nodeName =pharetrawriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079, 1081,1202isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-03-09T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1203parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =13createDate = 2010-10-12T12:13:05updateDate =2010-10-12T12:13:27nodeName =inceptos himenaeoswriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1081,1203isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-05-26T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1204parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =14createDate = 2010-10-12T12:13:36updateDate =2010-10-12T12:13:56nodeName =pharetrawriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079, 1081,1204isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-06-11T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1205parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =15createDate = 2010-10-12T12:14:06updateDate =2010-10-12T12:14:41nodeName =Fusce auguewriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1081,1205isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-07-08T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1206parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =16createDate = 2010-10-12T12:14:52upd​​ateDate =2010-10-12T12:15:19nodeName =pharetra et fermentumwriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078, 1079,1081,1206isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-08-09T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1207parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =17createDate = 2010-10-12T12:15:31updateDate =2010-10-12T12:15:51nodeName =Fusce augue puruswriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078, isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-09-14T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1208parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =18createDate = 2010-10-12T12:16:25updateDate =2010-10-12T12:16:45nodeName =类aptent tacitiwriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078, 1079,1081,1208isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-06-04T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1209parentID =1081level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =19createDate = 2010-10-12T12:17:01updateDate =2010-10-12T12:17:29nodeName =类aptentwriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1081,1209isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-06-21T00:00:00< / archiveUnder>
    < / BlogPost>
    < / Room>
    < Room id =1082parentID =1079level =4writerID =0creatorID =0nodeType =1077template =0sortOrder =2createDate = 2010-09-27T14:12:33updateDate =2010-10-07T14:43:09nodeName =Test BlogwriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1082isDoc =>
    < BlogPost id =1182parentID =1082level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =1createDate = 2010-10-08T17:51:19updateDate =2010-10-08T17:51:58nodeName =Test BlogwriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1082,1182isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < / BlogPost>
    < / Room>
    < Room id =1083parentID =1079level =4writerID =0creatorID =0nodeType =1077template =1089sortOrder =3createDate = 2010-09-27T14:12:40updateDate =2010-10-07T14:49:48nodeName =Test BlogwriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1083isDoc =>
    < BlogPost id =1183parentID =1083level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =1createDate = 2010-10-08T17:52:22upd​​ateDate =2010-10-08T17:52:39nodeName =Test BlogwriterName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1083,1183isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < / BlogPost>
    < / Room>
    < / BlogCentre>
    < BlogCentre id =1080parentID =1078level =3writerID =0creatorID =0nodeType =1075template =1076sortOrder =2createDate = 2010-09-27T14:11:55updateDate =2010-10-07T14:43:23nodeName =Blog Center 2writerName =AdministratorcreatorName =Administratorpath = - 1,1049,1078, 1080isDoc =>>
    < Room id =1084parentID =1080level =4writerID =0creatorID =0nodeType =1077template =0sortOrder =1createDate = 2010-09-27T14:12:45updateDate =2010-10-07T14:43:17nodeName =Room 1writerName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1080 ,1084isDoc =>
    < BlogPost id =1184parentID =1084level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =1createDate = 2010-10-08T17:53:05updateDate =2010-10-08T17:53:29nodeName =Blog Post 3writerName =AdministratorcreatorName =Administratorpath = - 1,1049,1078, 1080,1084,1184isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < / BlogPost>
    < / Room>
    < Room id =1085parentID =1080level =4writerID =0creatorID =0nodeType =1077template =0sortOrder =2createDate = 2010-09-27T14:12:50updateDate =2010-10-07T14:43:19nodeName =Room 2writerName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1080 ,1085isDoc =>
    < BlogPost id =1185parentID =1085level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =1createDate = 2010-10-08T17:53:51updateDate =2010-10-08T17:54:15nodeName =Blog Post 109writerName =AdministratorcreatorName =Administratorpath = - 1,1049,1078, 1080,1085,1185isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < / BlogPost>
    < / Room>
    < Room id =1086parentID =1080level =4writerID =0creatorID =0nodeType =1077template =1089sortOrder =3createDate = 2010-09-27T14:12:55updateDate =2010-10-07T14:50:39nodeName =Room 3writerName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1080 ,1086isDoc =>
    < BlogPost id =1186parentID =1086level =5writerID =0creatorID =0nodeType =1087template =1089sortOrder =1createDate = 2010-10-08T17:54:28updateDate =2010-10-08T17:54:51nodeName =Blog Post 123writerName =AdministratorcreatorName =Administratorpath = - 1,1049,1078, 1080,1086,1186isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < / BlogPost>
    < / Room>
    < / BlogCentre>
    < / Blog>

    在Umbraco XSLT样式表中,有一个参数传递给当前页面。

     < xsl:param name =currentPage/> 

    这将永远是父节点< Blog /> ; ,所以我们必须从这里开始。



    你会注意到< Blog /> < BlogPost /> ,但是我们要计算每个<$ c中的BlogPost的TOTAL数$ c>< BlogCentre /> 和< Room />



    为此,我一直在使用

     code>< xsl:for-each select =$ currentPage / descendant :: BlogPost/> 

    无论中心/房间如何,都选择所有博客帖子 / p>

    现在我的要求是通过月份和年份(包括每个月的帖子计数)对这些博客帖子进行分组。我想要分组的日期是属性 createDate UNLESS 有一个称为< archiveUnder> some-date-here< / archiveUnder> 。进一步解释



    更新

    我可以通过检查属性是否为空,轻松完成此部分,因此如果需要,解决方案可以省略此部分。

     < BlogPost createDate =2010-10-08T17:52:22 > 
    <! - no archiveUnder - >
    < / BlogPost>

    ^ 使用创建日期

     < BlogPost createDate =2010-10-08T17:52:22> 
    < archiveUnder> 2010-10-08T17:51:19< / archiveUnder>
    < / BlogPost>

    ^ 使用archiveUnder


    最后,这是一个预期输出的示例。




     < ul> 
    < li>
    < h3> 2010< / h3>
    < ul>
    < li> 9月(4)< / li>
    < li> August(2)< / li>
    < li> June(5)< / li> <! - 没有7月,因为没有帖子 - >
    < / ul>
    < / li>
    < li>
    < h3> 2009< / h3>
    < ul>
    < li> April(4)< / li>
    < li> March(2)< / li>
    < li> January(5)< / li> <! - 没有2月,因为没有帖子 - >
    < / ul>
    < / li>
    < / ul>


    解决方案

    此转换行,但格式化为可读性):

     < xsl:stylesheet version =1.0
    xmlns:xsl = $$$$xmlns:m =my:monthsexclude-result-prefixes =m>
    < xsl:output omit-xml-declaration =yesindent =yes/>

    < xsl:param name =currentPageselect =/ */>

    < m:months>
    < m> January< / m>
    < m> February< / m>
    < m> March< / m>
    < m> April< / m>
    < m> May< / m>
    < m> June< / m>
    < m> July< / m>
    < m> August< / m>
    < m> September< / m>
    < m> October< / m>
    < m> November< / m>
    < m> December< / m>
    < / m:months>

    < xsl:variable name =vMonthNamesselect =
    document('')/ * / m:months / */>

    < xsl:key name =kPostsByYearmatch =BlogPost
    use =substring-before(
    concat(archiveUnder,
    @createDate [not (archiveUnder)]
    ),
    ' - '
    )/>

    < xsl:key name =kPostsByYearMonthmatch =BlogPost
    use =substring(
    concat(archiveUnder,
    @createDate [not(archiveUnder )]
    ),
    1,7
    )/>

    < xsl:template match =/>
    < ul>
    < xsl:apply-templates mode =yearselect =
    $ currentPage / * / * / BlogPost
    [generate-id()
    =
    generate-id(key('kPostsByYear',
    substring-before(
    concat(archiveUnder,
    @createDate [not(archiveUnder)]
    ),
    ' '

    )[1]

    ]
    >
    < xsl:sort order =descendingselect =
    substring-before(
    concat(archiveUnder,
    @createDate [not(archiveUnder)]
    ) ,

    ' - '

    />
    < / xsl:apply-templates>
    < / ul>
    < / xsl:template>

    < xsl:template match =BlogPostmode =year>
    < xsl:variable name =vYearselect =
    substring-before(
    concat(archiveUnder,
    @createDate [not(archiveUnder)]
    ) ,

    ' - ')
    />
    < xsl:variable name =vyearBlogs
    select =key('kPostsByYear',$ vYear)/>
    < li>
    < h3>< xsl:value-of select =$ vYear/>< / h3>
    < ul>
    < xsl:apply-templates mode =monthselect =
    $ vyearBlogs
    [generate-id()
    =
    generate-id(key 'kPostsByYearMonth',
    substring(
    concat(archiveUnder,
    @createDate [not(archiveUnder)]
    ),

    1,7

    )[1]

    ]
    >
    < xsl:sort order =descendingselect =
    substring(
    concat(archiveUnder,
    @createDate [not(archiveUnder)]
    ),

    6,2)
    />
    < / xsl:apply-templates>
    < / ul>
    < / li>
    < / xsl:template>

    < xsl:template match =BlogPostmode =month>
    < xsl:variable name =vMonthselect =
    substring(
    concat(archiveUnder,
    @createDate [not(archiveUnder)]
    ),

    6,2)/>

    < xsl:variable name =vmonthsBlogsselect =
    key('kPostsByYearMonth',
    substring(
    concat(archiveUnder,
    @ createDate [not(archiveUnder)]
    ),

    1,7)
    )/>
    < li>< xsl:value-of select =
    concat($ vMonthNames [position()= $ vMonth],
    '(',
    count vmonthsBlogs),
    ')'
    )/>
    < / li>
    < / xsl:template>
    < / xsl:stylesheet>

    应用于提供的示例XML文档(我们正在访问每个节点关闭 $ currentPage < xsl:param> ,因为这将在真正的Umbraco案例中),格式化为可读性并且元素名称后面的第一行上移动的每个 BlogPost createDate 属性

     < Blog id =1078parentID =1049level =2writerID =0creatorID =0nodeType =1073 template =1089sortOrder =7createDate =2010-09-27T14:11:04updateDate =2010-10-12T16:59:12nodeName =BlogwriterName =AdministratorcreatorName =Administrator path = -  1,1049,1078isDoc => 
    < newPageTitle> The Lorem Ipsum Blog< / newPageTitle>
    < BlogCentre id =1079parentID =1078level =3writerID =0creatorID =0nodeType =1075template =1076sortOrder =1createDate = 2010-09-27T14:11:49updateDate =2010-10-07T14:43:13nodeName =Blog Center 1writerName =AdministratorcreatorName =Administratorpath = - 1,1049,1078, 1079isDoc =>
    < Room id =1081parentID =1079level =4writerID =0creatorID =0nodeType =1077template =0sortOrder =1createDate = 2010-09-27T14:12:26updateDate =2010-10-07T14:43:06nodeName =Room 10writerName =AdministratorcreatorName =Administratorpath = - 1,1049,1078,1079 ,1081isDoc =>
    < BlogPost id =1175parentID =1081level =5
    createDate =2010-10-07T14:51:48
    writerID =0creatorID = 0nodeType =1087
    template =1192sortOrder =1
    updateDate =2010-10-12T21:30:53
    nodeName =第一个Blog
    writerName =Administrator
    creatorName =Administrator
    path = - 1,1049,1078,1079,1081,1175isDoc =>
    < topicTitle>第一个博客< / topicTitle>
    < archiveUnder />
    < / BlogPost>
    < BlogPost id =1180parentID =1081
    createDate =2010-10-08T15:52:20
    level =5writerID =0creatorID = 3
    nodeType =1087template =1089
    sortOrder =2
    updateDate =2010-10-12T16:57:00nodeName =asdasd
    writerName =AdministratorcreatorName =ZX
    path = - 1,1049,1078,1079,1081,1180isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < / BlogPost>
    < BlogPost id =1181parentID =1081level =5
    createDate =2010-10-08T17:50:19
    writerID =0creatorID = 0nodeType =1087
    template =1089sortOrder =3
    updateDate =2010-10-12T11:40:37
    nodeName =condimentum
    writerName =Administrator
    creatorName =Administrator
    path = - 1,1049,1078,1079,1081,1181isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-09-01T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1194parentID =1081level =5
    createDate =2010-10-12T11:41:50
    writerID =0creatorID = 0nodeType =1087
    template =1089sortOrder =4
    updateDate =2010-10-12T11:42:37
    nodeName =Nam auguewriterName =Administrator
    creatorName =Administrator
    path = - 1,1049,1078,1079,1081,1194isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-08-05T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1195parentID =1081level =5
    createDate =2010-10-12T11:42:15
    writerID =0creatorID = 0nodeType =1087
    template =1089sortOrder =5
    updateDate =2010-10-12T11:42:25
    nodeName =becat nunc
    writerName =Administrator
    creatorName =Administrator
    path = - 1,1049,1078,1079,1081,1195isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-08-12T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1196parentID =1081level =5
    createDate =2010-10-12T12:05:57
    writerID =0creatorID = 0nodeType =1087
    template =1089sortOrder =6
    updateDate =2010-10-12T12:08:40
    nodeName =cursus congue
    writerName =Administrator
    creatorName =Administrator
    path = - 1,1049,1078,1079,1081,1196isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2009-10-22T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1197parentID =1081level =5
    createDate =2010-10-12T12:08:54
    writerID =0creatorID = 0nodeType =1087
    template =1089sortOrder =7
    updateDate =2010-10-12T12:09:24
    nodeName =inceptoswriterName = Administrator
    creatorName =Administrator
    path = - 1,1049,1078,1079,1081,1197isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2009-11-19T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1198parentID =1081level =5
    createDate =2010-10-12T12:09:45
    writerID =0creatorID = 0nodeType =1087
    template =1089sortOrder =8
    updateDate =2010-10-12T12:10:13
    nodeName =inceptos himenaeos
    writerName =Administrator
    creatorName =Administrator
    path = - 1,1049,1078,1079,1081,1198isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2009-12-16T00:00:00< / archiveUnder>
    < / BlogPost>
    < BlogPost id =1199parentID =1081level =5
    createDate =2010-10-12T12:10:29
    writerID =0creatorID = 0nodeType =1087
    template =1089sortOrder =9
    updateDate =2010-10-12T12:10:56
    nodeName =becatwriterName = Administrator
    creatorName =Administrator
    path = - 1,1049,1078,1079,1081,1199isDoc =>
    < topicTitle> Lorem Ipsum< / topicTitle>
    < archiveUnder> 2010-01-13T00:00:00< / archiveUnder>
    < / BlogPost>
    <BlogPost id=\"1200\" parentID=\"1081\" level=\"5\"
    createDate=\"2010-10-12T12:11:08\"
    writerID=\"0\" creatorID=\"0\" nodeType=\"1087\"
    template=\"1089\" sortOrder=\"10\"
    updateDate=\"2010-10-12T12:11:35\"
    nodeName=\"himenaeos\" writerName=\"Administrator\"
    creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1081,1200\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    <archiveUnder>2010-02-09T00:00:00</archiveUnder>
    </BlogPost>
    <BlogPost id=\"1201\" parentID=\"1081\" level=\"5\"
    createDate=\"2010-10-12T12:11:45\"
    writerID=\"0\" creatorID=\"0\" nodeType=\"1087\"
    template=\"1089\" sortOrder=\"11\"
    updateDate=\"2010-10-12T12:12:35\"
    nodeName=\"cursus congue\" writerName=\"Administrator\"
    creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1081,1201\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    <archiveUnder>2010-04-22T00:00:00</archiveUnder>
    </BlogPost>
    <BlogPost id=\"1202\" parentID=\"1081\" level=\"5\"
    createDate=\"2010-10-12T12:12:18\"
    writerID=\"0\" creatorID=\"0\" nodeType=\"1087\"
    template=\"1089\" sortOrder=\"12\"
    updateDate=\"2010-10-12T12:12:45\" nodeName=\"pharetra\"
    writerName=\"Administrator\" creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1081,1202\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    <archiveUnder>2010-03-09T00:00:00</archiveUnder>
    </BlogPost>
    <BlogPost id=\"1203\" parentID=\"1081\" level=\"5\"
    createDate=\"2010-10-12T12:13:05\"
    writerID=\"0\" creatorID=\"0\" nodeType=\"1087\"
    template=\"1089\" sortOrder=\"13\"
    updateDate=\"2010-10-12T12:13:27\"
    nodeName=\"inceptos himenaeos\"
    writerName=\"Administrator\"
    creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1081,1203\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    <archiveUnder>2010-05-26T00:00:00</archiveUnder>
    </BlogPost>
    <BlogPost id=\"1204\" parentID=\"1081\" level=\"5\"
    createDate=\"2010-10-12T12:13:36\"
    writerID=\"0\" creatorID=\"0\" nodeType=\"1087\"
    template=\"1089\" sortOrder=\"14\"
    updateDate=\"2010-10-12T12:13:56\"
    nodeName=\"pharetra\" writerName=\"Administrator\"
    creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1081,1204\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    <archiveUnder>2010-06-11T00:00:00</archiveUnder>
    </BlogPost>
    <BlogPost id=\"1205\" parentID=\"1081\" level=\"5\"
    createDate=\"2010-10-12T12:14:06\"
    writerID=\"0\" creatorID=\"0\" nodeType=\"1087\"
    template=\"1089\" sortOrder=\"15\"
    updateDate=\"2010-10-12T12:14:41\"
    nodeName=\"Fusce augue\" writerName=\"Administrator\"
    creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1081,1205\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    <archiveUnder>2010-07-08T00:00:00</archiveUnder>
    </BlogPost>
    <BlogPost id=\"1206\" parentID=\"1081\" level=\"5\"
    createDate=\"2010-10-12T12:14:52\"
    writerID=\"0\" creatorID=\"0\" nodeType=\"1087\"
    template=\"1089\" sortOrder=\"16\"
    updateDate=\"2010-10-12T12:15:19\"
    nodeName=\"pharetra et fermentum\"
    writerName=\"Administrator\" creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1081,1206\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    <archiveUnder>2010-08-09T00:00:00</archiveUnder>
    </BlogPost>
    <BlogPost id=\"1207\" parentID=\"1081\"
    createDate=\"2010-10-12T12:15:31\"
    level=\"5\" writerID=\"0\" creatorID=\"0\" nodeType=\"1087\"
    template=\"1089\" sortOrder=\"17\"
    updateDate=\"2010-10-12T12:15:51\"
    nodeName=\"Fusce augue purus\" writerName=\"Administrator\"
    creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1081,1207\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    <archiveUnder>2010-09-14T00:00:00</archiveUnder>
    </BlogPost>
    <BlogPost id=\"1208\" parentID=\"1081\" level=\"5\"
    createDate=\"2010-10-12T12:16:25\"
    writerID=\"0\" creatorID=\"0\" nodeType=\"1087\"
    template=\"1089\" sortOrder=\"18\"
    updateDate=\"2010-10-12T12:16:45\"
    nodeName=\"Class aptent taciti\" writerName=\"Administrator\"
    creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1081,1208\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    <archiveUnder>2010-06-04T00:00:00</archiveUnder>
    </BlogPost>
    <BlogPost id=\"1209\" parentID=\"1081\" level=\"5\"
    createDate=\"2010-10-12T12:17:01\"
    writerID=\"0\" creatorID=\"0\" nodeType=\"1087\"
    template=\"1089\" sortOrder=\"19\"
    updateDate=\"2010-10-12T12:17:29\" nodeName=\"Class aptent\"
    writerName=\"Administrator\" creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1081,1209\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    <archiveUnder>2010-06-21T00:00:00</archiveUnder>
    </BlogPost>
    </Room>
    <Room id=\"1082\" parentID=\"1079\" level=\"4\"
    createDate=\"2010-09-27T14:12:33\"
    writerID=\"0\" creatorID=\"0\" nodeType=\"1077\" template=\"0\"
    sortOrder=\"2\"
    updateDate=\"2010-10-07T14:43:09\" nodeName=\"Test Blog\"
    writerName=\"Administrator\" creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1082\" isDoc=\"\">
    <BlogPost id=\"1182\" parentID=\"1082\" level=\"5\" writerID=\"0\" creatorID=\"0\" nodeType=\"1087\" template=\"1089\" sortOrder=\"1\" createDate=\"2010-10-08T17:51:19\" updateDate=\"2010-10-08T17:51:58\" nodeName=\"Test Blog\" writerName=\"Administrator\" creatorName=\"Administrator\" path=\"-1,1049,1078,1079,1082,1182\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    </BlogPost>
    </Room>
    <Room id=\"1083\" parentID=\"1079\" level=\"4\" writerID=\"0\"
    createDate=\"2010-09-27T14:12:40\"
    creatorID=\"0\" nodeType=\"1077\" template=\"1089\" sortOrder=\"3\"
    updateDate=\"2010-10-07T14:49:48\" nodeName=\"Test Blog\"
    writerName=\"Administrator\" creatorName=\"Administrator\"
    path=\"-1,1049,1078,1079,1083\" isDoc=\"\">
    <BlogPost id=\"1183\" parentID=\"1083\" level=\"5\" writerID=\"0\" creatorID=\"0\" nodeType=\"1087\" template=\"1089\" sortOrder=\"1\" createDate=\"2010-10-08T17:52:22\" updateDate=\"2010-10-08T17:52:39\" nodeName=\"Test Blog\" writerName=\"Administrator\" creatorName=\"Administrator\" path=\"-1,1049,1078,1079,1083,1183\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    </BlogPost>
    </Room>
    </BlogCentre>
    <BlogCentre id=\"1080\" parentID=\"1078\" level=\"3\" writerID=\"0\"
    createDate=\"2010-09-27T14:11:55\"
    creatorID=\"0\" nodeType=\"1075\" template=\"1076\" sortOrder=\"2\"
    updateDate=\"2010-10-07T14:43:23\" nodeName=\"Blog Centre 2\"
    writerName=\"Administrator\" creatorName=\"Administrator\"
    path=\"-1,1049,1078,1080\" isDoc=\"\">
    <Room id=\"1084\" parentID=\"1080\" level=\"4\" writerID=\"0\" creatorID=\"0\" nodeType=\"1077\" template=\"0\" sortOrder=\"1\" createDate=\"2010-09-27T14:12:45\" updateDate=\"2010-10-07T14:43:17\" nodeName=\"Room 1\" writerName=\"Administrator\" creatorName=\"Administrator\" path=\"-1,1049,1078,1080,1084\" isDoc=\"\">
    <BlogPost id=\"1184\" parentID=\"1084\" level=\"5\" writerID=\"0\"
    createDate=\"2010-10-08T17:53:05\"
    creatorID=\"0\" nodeType=\"1087\" template=\"1089\" sortOrder=\"1\"
    updateDate=\"2010-10-08T17:53:29\" nodeName=\"Blog Post 3\"
    writerName=\"Administrator\" creatorName=\"Administrator\"
    path=\"-1,1049,1078,1080,1084,1184\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    </BlogPost>
    </Room>
    <Room id=\"1085\" parentID=\"1080\" level=\"4\" writerID=\"0\"
    createDate=\"2010-09-27T14:12:50\"
    creatorID=\"0\" nodeType=\"1077\" template=\"0\" sortOrder=\"2\"
    updateDate=\"2010-10-07T14:43:19\" nodeName=\"Room 2\"
    writerName=\"Administrator\" creatorName=\"Administrator\"
    path=\"-1,1049,1078,1080,1085\" isDoc=\"\">
    <BlogPost id=\"1185\" parentID=\"1085\" level=\"5\" writerID=\"0\"
    createDate=\"2010-10-08T17:53:51\"
    creatorID=\"0\" nodeType=\"1087\" template=\"1089\" sortOrder=\"1\"
    updateDate=\"2010-10-08T17:54:15\" nodeName=\"Blog Post 109\"
    writerName=\"Administrator\" creatorName=\"Administrator\"
    path=\"-1,1049,1078,1080,1085,1185\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    </BlogPost>
    </Room>
    <Room id=\"1086\" parentID=\"1080\" level=\"4\" writerID=\"0\" creatorID=\"0\" nodeType=\"1077\" template=\"1089\" sortOrder=\"3\" createDate=\"2010-09-27T14:12:55\" updateDate=\"2010-10-07T14:50:39\" nodeName=\"Room 3\" writerName=\"Administrator\" creatorName=\"Administrator\" path=\"-1,1049,1078,1080,1086\" isDoc=\"\">
    <BlogPost id=\"1186\" parentID=\"1086\" level=\"5\" writerID=\"0\"
    createDate=\"2010-10-08T17:54:28\"
    creatorID=\"0\" nodeType=\"1087\" template=\"1089\" sortOrder=\"1\"
    updateDate=\"2010-10-08T17:54:51\"
    nodeName=\"Blog Post 123\" writerName=\"Administrator\"
    creatorName=\"Administrator\"
    path=\"-1,1049,1078,1080,1086,1186\" isDoc=\"\">
    <topicTitle>Lorem Ipsum</topicTitle>
    </BlogPost>
    </Room>
    </BlogCentre>
    </Blog>

    produces the wanted, correct result:

    <ul> 
    <li>
    <h3>2010</h3>
    <ul>
    <li>October (7)</li>
    <li>September (2)</li>
    <li>August (3)</li>
    <li>July (1)</li>
    <li>June (3)</li>
    <li>May (1)</li>
    <li>April (1)</li>
    <li>March (1)</li>
    <li>February (1)</li>
    <li>January (1)</li>
    </ul>
    </li>
    <li>
    <h3>2009</h3>
    <ul>
    <li>December (1)</li>
    <li>November (1)</li>
    <li>October (1)</li>
    </ul>
    </li>
    </ul>

    Do note:


    1. Muenchian Grouping is used -- both for determining the different years and for determining the different months for each year.


    2. The date is chosen between the createDate attribute and the archiveUnder child using the expression:



      concat(archiveUnder, @createDate[not(archiveUnder)])


    This concatenation only picks @createDate if archiveUnder is missing or empty.



    .3. The transformation will produce the correct result even if the dates of the elements are unsorted.


    Update

    I'd like to appologize to the people who provided answers, I seem to have caused all sorts of confusion. To avoid complicating things even further, I've removed the previous code and have added new information. Read on...

    I'm working on a custom Blog in Umbraco. Umbraco spits out XML as the output which is then read using XSLT.

    The structure of the XML is as follows

    • Blog
      • Blog Centre
        • Room
          • Blog Post
          • Blog Post
          • Blog Post
        • Room
          • Blog Post
      • Blog Centre
        • Room
          • Blog Post

    Here's the XML code, I've cleaned up a lot of it to make it at least somewhat readable.

    <Blog id="1078" parentID="1049" level="2" writerID="0" creatorID="0" nodeType="1073" template="1089" sortOrder="7" createDate="2010-09-27T14:11:04" updateDate="2010-10-12T16:59:12" nodeName="Blog" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078" isDoc="">
        <newPageTitle>The Lorem Ipsum Blog</newPageTitle>
        <BlogCentre id="1079" parentID="1078" level="3" writerID="0" creatorID="0" nodeType="1075" template="1076" sortOrder="1" createDate="2010-09-27T14:11:49" updateDate="2010-10-07T14:43:13" nodeName="Blog Centre 1" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079" isDoc="">
            <Room id="1081" parentID="1079" level="4" writerID="0" creatorID="0" nodeType="1077" template="0" sortOrder="1" createDate="2010-09-27T14:12:26" updateDate="2010-10-07T14:43:06" nodeName="Room 10" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081" isDoc="">
                <BlogPost id="1175" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1192" sortOrder="1" createDate="2010-10-07T14:51:48" updateDate="2010-10-12T21:30:53" nodeName="The first ever Blog post" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1175" isDoc="">
                    <topicTitle>The first ever blog</topicTitle>
                </BlogPost>
                <BlogPost id="1180" parentID="1081" level="5" writerID="0" creatorID="3" nodeType="1087" template="1089" sortOrder="2" createDate="2010-10-08T15:52:20" updateDate="2010-10-12T16:57:00" nodeName="asdasd" writerName="Administrator" creatorName="ZX" path="-1,1049,1078,1079,1081,1180" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
                <BlogPost id="1181" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="3" createDate="2010-10-08T17:50:19" updateDate="2010-10-12T11:40:37" nodeName="condimentum" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1181" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-09-01T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1194" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="4" createDate="2010-10-12T11:41:50" updateDate="2010-10-12T11:42:37" nodeName="Nam augue" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1194" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-08-05T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1195" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="5" createDate="2010-10-12T11:42:15" updateDate="2010-10-12T11:42:25" nodeName="consequat nunc" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1195" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-08-12T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1196" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="6" createDate="2010-10-12T12:05:57" updateDate="2010-10-12T12:08:40" nodeName="cursus congue" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1196" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2009-10-22T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1197" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="7" createDate="2010-10-12T12:08:54" updateDate="2010-10-12T12:09:24" nodeName="inceptos" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1197" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2009-11-19T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1198" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="8" createDate="2010-10-12T12:09:45" updateDate="2010-10-12T12:10:13" nodeName="inceptos himenaeos" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1198" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2009-12-16T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1199" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="9" createDate="2010-10-12T12:10:29" updateDate="2010-10-12T12:10:56" nodeName="consequat" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1199" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-01-13T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1200" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="10" createDate="2010-10-12T12:11:08" updateDate="2010-10-12T12:11:35" nodeName="himenaeos" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1200" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-02-09T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1201" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="11" createDate="2010-10-12T12:11:45" updateDate="2010-10-12T12:12:35" nodeName="cursus congue" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1201" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-04-22T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1202" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="12" createDate="2010-10-12T12:12:18" updateDate="2010-10-12T12:12:45" nodeName="pharetra" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1202" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-03-09T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1203" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="13" createDate="2010-10-12T12:13:05" updateDate="2010-10-12T12:13:27" nodeName="inceptos himenaeos" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1203" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-05-26T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1204" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="14" createDate="2010-10-12T12:13:36" updateDate="2010-10-12T12:13:56" nodeName="pharetra" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1204" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-06-11T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1205" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="15" createDate="2010-10-12T12:14:06" updateDate="2010-10-12T12:14:41" nodeName="Fusce augue" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1205" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-07-08T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1206" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="16" createDate="2010-10-12T12:14:52" updateDate="2010-10-12T12:15:19" nodeName="pharetra et fermentum" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1206" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-08-09T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1207" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="17" createDate="2010-10-12T12:15:31" updateDate="2010-10-12T12:15:51" nodeName="Fusce augue purus" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1207" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-09-14T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1208" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="18" createDate="2010-10-12T12:16:25" updateDate="2010-10-12T12:16:45" nodeName="Class aptent taciti" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1208" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-06-04T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1209" parentID="1081" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="19" createDate="2010-10-12T12:17:01" updateDate="2010-10-12T12:17:29" nodeName="Class aptent" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081,1209" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-06-21T00:00:00</archiveUnder>
                </BlogPost>
            </Room>
            <Room id="1082" parentID="1079" level="4" writerID="0" creatorID="0" nodeType="1077" template="0" sortOrder="2" createDate="2010-09-27T14:12:33" updateDate="2010-10-07T14:43:09" nodeName="Test Blog" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1082" isDoc="">
                <BlogPost id="1182" parentID="1082" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="1" createDate="2010-10-08T17:51:19" updateDate="2010-10-08T17:51:58" nodeName="Test Blog" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1082,1182" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
            </Room>
            <Room id="1083" parentID="1079" level="4" writerID="0" creatorID="0" nodeType="1077" template="1089" sortOrder="3" createDate="2010-09-27T14:12:40" updateDate="2010-10-07T14:49:48" nodeName="Test Blog" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1083" isDoc="">
                <BlogPost id="1183" parentID="1083" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="1" createDate="2010-10-08T17:52:22" updateDate="2010-10-08T17:52:39" nodeName="Test Blog" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1083,1183" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
            </Room>
        </BlogCentre>
        <BlogCentre id="1080" parentID="1078" level="3" writerID="0" creatorID="0" nodeType="1075" template="1076" sortOrder="2" createDate="2010-09-27T14:11:55" updateDate="2010-10-07T14:43:23" nodeName="Blog Centre 2" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1080" isDoc="">
            <Room id="1084" parentID="1080" level="4" writerID="0" creatorID="0" nodeType="1077" template="0" sortOrder="1" createDate="2010-09-27T14:12:45" updateDate="2010-10-07T14:43:17" nodeName="Room 1" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1080,1084" isDoc="">
                <BlogPost id="1184" parentID="1084" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="1" createDate="2010-10-08T17:53:05" updateDate="2010-10-08T17:53:29" nodeName="Blog Post 3" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1080,1084,1184" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
            </Room>
            <Room id="1085" parentID="1080" level="4" writerID="0" creatorID="0" nodeType="1077" template="0" sortOrder="2" createDate="2010-09-27T14:12:50" updateDate="2010-10-07T14:43:19" nodeName="Room 2" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1080,1085" isDoc="">
                <BlogPost id="1185" parentID="1085" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="1" createDate="2010-10-08T17:53:51" updateDate="2010-10-08T17:54:15" nodeName="Blog Post 109" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1080,1085,1185" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
            </Room>
            <Room id="1086" parentID="1080" level="4" writerID="0" creatorID="0" nodeType="1077" template="1089" sortOrder="3" createDate="2010-09-27T14:12:55" updateDate="2010-10-07T14:50:39" nodeName="Room 3" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1080,1086" isDoc="">
                <BlogPost id="1186" parentID="1086" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="1" createDate="2010-10-08T17:54:28" updateDate="2010-10-08T17:54:51" nodeName="Blog Post 123" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1080,1086,1186" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
            </Room>
        </BlogCentre>
    </Blog>
    

    In the Umbraco XSLT stylesheets, there is a parameter that gets passed for the current page.

    <xsl:param name="currentPage" />
    

    This will always be the parent node <Blog />, so we have to start form here.

    You'll notice that there are intermediate nodes between <Blog /> and <BlogPost /> but we want to count the TOTAL number of BlogPosts in every <BlogCentre /> and <Room />.

    To do this, I've been using

    <xsl:for-each select="$currentPage/descendant::BlogPost" />
    

    Which selects all the Blog Posts, regardless of Centre/Room.

    Now the requirement I have is, to group each of these Blog Posts by Month and Year (including a Post count for each month). The date I'd like to group them by is the attribute createDate UNLESS there is a child node called <archiveUnder>some-date-here</archiveUnder>. To explain further

    Update
    I can easily do this part by checking if an attribute is blank, so the solution can omit this part if need-be.

    <BlogPost createDate="2010-10-08T17:52:22">
        <!-- no archiveUnder -->
    </BlogPost>
    

    ^ Use create Date

    <BlogPost createDate="2010-10-08T17:52:22">
        <archiveUnder>2010-10-08T17:51:19</archiveUnder>
    </BlogPost>
    

    ^ Use archiveUnder

    Finally, here's an example of the expected output.

    <ul>
        <li>
            <h3>2010</h3>
            <ul>
                <li>September (4)</li>
                <li>August (2)</li>
                <li>June (5)</li> <!-- No July because there are no posts -->
            </ul>
        </li>
        <li>
            <h3>2009</h3>
            <ul>
                <li>April (4)</li>
                <li>March (2)</li>
                <li>January (5)</li> <!-- No February because there are no posts -->
            </ul>
        </li>
    </ul>
    

    解决方案

    This transformation (141 lines but formatted for readability):

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:m="my:months" exclude-result-prefixes="m" >
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:param name="currentPage" select="/*"/>
    
     <m:months>
       <m>January</m>
       <m>February</m>
       <m>March</m>
       <m>April</m>
       <m>May</m>
       <m>June</m>
       <m>July</m>
       <m>August</m>
       <m>September</m>
       <m>October</m>
       <m>November</m>
       <m>December</m>
     </m:months>
    
     <xsl:variable name="vMonthNames" select=
      "document('')/*/m:months/*"/>
    
     <xsl:key name="kPostsByYear" match="BlogPost"
      use="substring-before(
                        concat(archiveUnder,
                               @createDate[not(archiveUnder)]
                               ),
                        '-'
                            )"/>
    
     <xsl:key name="kPostsByYearMonth" match="BlogPost"
      use="substring(
                     concat(archiveUnder,
                            @createDate[not(archiveUnder)]
                            ),
                     1,7
                     )"/>
    
     <xsl:template match="/">
       <ul>
        <xsl:apply-templates mode="year" select=
         "$currentPage/*/*/BlogPost
              [generate-id()
              =
               generate-id(key('kPostsByYear',
                           substring-before(
                           concat(archiveUnder,
                                  @createDate[not(archiveUnder)]
                                  ),
                                  '-'
                                             )
                                )[1]
                           )
                  ]
         ">
           <xsl:sort order="descending" select=
            "substring-before(
                        concat(archiveUnder,
                               @createDate[not(archiveUnder)]
                               ),
    
                               '-'
                              )
            "/>
       </xsl:apply-templates>
      </ul>
     </xsl:template>
    
     <xsl:template match="BlogPost" mode="year">
      <xsl:variable name="vYear" select=
        "substring-before(
                         concat(archiveUnder,
                                @createDate[not(archiveUnder)]
                                ),
    
                          '-')
        "/>
      <xsl:variable name="vyearBlogs"
                    select="key('kPostsByYear',$vYear)"/>
      <li>
        <h3><xsl:value-of select="$vYear"/></h3>
        <ul>
          <xsl:apply-templates mode="month" select=
              "$vyearBlogs
                 [generate-id()
                 =
                  generate-id(key('kPostsByYearMonth',
                              substring(
                            concat(archiveUnder,
                                   @createDate[not(archiveUnder)]
                                   ),
    
                            1,7
                                        )
                                  )[1]
                              )
                  ]
              ">
             <xsl:sort order="descending" select=
                "substring(
                     concat(archiveUnder,
                            @createDate[not(archiveUnder)]
                            ),
    
                     6,2)"
             />
          </xsl:apply-templates>
       </ul>
      </li>
     </xsl:template>
    
     <xsl:template match="BlogPost" mode="month">
      <xsl:variable name="vMonth" select=
       "substring(
            concat(archiveUnder,
                   @createDate[not(archiveUnder)]
                   ),
    
            6,2)"/>
    
      <xsl:variable name="vmonthsBlogs" select=
        "key('kPostsByYearMonth',
             substring(
                  concat(archiveUnder,
                         @createDate[not(archiveUnder)]
                         ),
    
                  1,7)
             )"/>
      <li><xsl:value-of select=
            "concat($vMonthNames[position()=$vMonth],
                    ' (',
                    count($vmonthsBlogs),
                    ')'
                    )"/>
      </li>
     </xsl:template>
    </xsl:stylesheet>
    

    when applied on the provided sample XML document (we are accessing every node off the $currentPage <xsl:param> as this will be in the real Umbraco case), formatted for readability and the createDate attribute of every BlogPost moved on the firs line after the element name:

    <Blog id="1078" parentID="1049" level="2" writerID="0" creatorID="0" nodeType="1073" template="1089" sortOrder="7" createDate="2010-09-27T14:11:04" updateDate="2010-10-12T16:59:12" nodeName="Blog" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078" isDoc="">
        <newPageTitle>The Lorem Ipsum Blog</newPageTitle>
        <BlogCentre id="1079" parentID="1078" level="3" writerID="0" creatorID="0" nodeType="1075" template="1076" sortOrder="1" createDate="2010-09-27T14:11:49" updateDate="2010-10-07T14:43:13" nodeName="Blog Centre 1" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079" isDoc="">
            <Room id="1081" parentID="1079" level="4" writerID="0" creatorID="0" nodeType="1077" template="0" sortOrder="1" createDate="2010-09-27T14:12:26" updateDate="2010-10-07T14:43:06" nodeName="Room 10" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1081" isDoc="">
                <BlogPost id="1175" parentID="1081" level="5"
                createDate="2010-10-07T14:51:48"
                writerID="0" creatorID="0" nodeType="1087"
                template="1192" sortOrder="1"
                updateDate="2010-10-12T21:30:53"
                nodeName="The first ever Blog post"
                writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1175" isDoc="">
                    <topicTitle>The first ever blog</topicTitle>
                    <archiveUnder/>
                </BlogPost>
                <BlogPost id="1180" parentID="1081"
                 createDate="2010-10-08T15:52:20"
                 level="5" writerID="0" creatorID="3"
                 nodeType="1087" template="1089"
                 sortOrder="2"
                 updateDate="2010-10-12T16:57:00" nodeName="asdasd"
                 writerName="Administrator" creatorName="ZX"
                 path="-1,1049,1078,1079,1081,1180" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
                <BlogPost id="1181" parentID="1081" level="5"
                 createDate="2010-10-08T17:50:19"
                 writerID="0" creatorID="0" nodeType="1087"
                 template="1089" sortOrder="3"
                 updateDate="2010-10-12T11:40:37"
                 nodeName="condimentum"
                 writerName="Administrator"
                 creatorName="Administrator"
                 path="-1,1049,1078,1079,1081,1181" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-09-01T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1194" parentID="1081" level="5"
                createDate="2010-10-12T11:41:50"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="4"
                updateDate="2010-10-12T11:42:37"
                nodeName="Nam augue" writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1194" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-08-05T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1195" parentID="1081" level="5"
                createDate="2010-10-12T11:42:15"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="5"
                updateDate="2010-10-12T11:42:25"
                nodeName="consequat nunc"
                writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1195" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-08-12T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1196" parentID="1081" level="5"
                createDate="2010-10-12T12:05:57"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="6"
                updateDate="2010-10-12T12:08:40"
                nodeName="cursus congue"
                writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1196" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2009-10-22T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1197" parentID="1081" level="5"
                 createDate="2010-10-12T12:08:54"
                 writerID="0" creatorID="0" nodeType="1087"
                 template="1089" sortOrder="7"
                 updateDate="2010-10-12T12:09:24"
                 nodeName="inceptos" writerName="Administrator"
                 creatorName="Administrator"
                 path="-1,1049,1078,1079,1081,1197" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2009-11-19T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1198" parentID="1081" level="5"
                createDate="2010-10-12T12:09:45"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="8"
                updateDate="2010-10-12T12:10:13"
                nodeName="inceptos himenaeos"
                writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1198" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2009-12-16T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1199" parentID="1081" level="5"
                 createDate="2010-10-12T12:10:29"
                 writerID="0" creatorID="0" nodeType="1087"
                 template="1089" sortOrder="9"
                 updateDate="2010-10-12T12:10:56"
                 nodeName="consequat" writerName="Administrator"
                 creatorName="Administrator"
                 path="-1,1049,1078,1079,1081,1199" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-01-13T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1200" parentID="1081" level="5"
                createDate="2010-10-12T12:11:08"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="10"
                updateDate="2010-10-12T12:11:35"
                nodeName="himenaeos" writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1200" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-02-09T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1201" parentID="1081" level="5"
                 createDate="2010-10-12T12:11:45"
                 writerID="0" creatorID="0" nodeType="1087"
                 template="1089" sortOrder="11"
                 updateDate="2010-10-12T12:12:35"
                 nodeName="cursus congue" writerName="Administrator"
                 creatorName="Administrator"
                 path="-1,1049,1078,1079,1081,1201" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-04-22T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1202" parentID="1081" level="5"
                createDate="2010-10-12T12:12:18"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="12"
                updateDate="2010-10-12T12:12:45" nodeName="pharetra"
                writerName="Administrator" creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1202" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-03-09T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1203" parentID="1081" level="5"
                createDate="2010-10-12T12:13:05"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="13"
                updateDate="2010-10-12T12:13:27"
                nodeName="inceptos himenaeos"
                writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1203" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-05-26T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1204" parentID="1081" level="5"
                createDate="2010-10-12T12:13:36"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="14"
                updateDate="2010-10-12T12:13:56"
                nodeName="pharetra" writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1204" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-06-11T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1205" parentID="1081" level="5"
                createDate="2010-10-12T12:14:06"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="15"
                updateDate="2010-10-12T12:14:41"
                nodeName="Fusce augue" writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1205" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-07-08T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1206" parentID="1081" level="5"
                createDate="2010-10-12T12:14:52"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="16"
                updateDate="2010-10-12T12:15:19"
                nodeName="pharetra et fermentum"
                writerName="Administrator" creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1206" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-08-09T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1207" parentID="1081"
                createDate="2010-10-12T12:15:31"
                level="5" writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="17"
                updateDate="2010-10-12T12:15:51"
                nodeName="Fusce augue purus" writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1207" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-09-14T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1208" parentID="1081" level="5"
                createDate="2010-10-12T12:16:25"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="18"
                updateDate="2010-10-12T12:16:45"
                nodeName="Class aptent taciti" writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1208" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-06-04T00:00:00</archiveUnder>
                </BlogPost>
                <BlogPost id="1209" parentID="1081" level="5"
                createDate="2010-10-12T12:17:01"
                writerID="0" creatorID="0" nodeType="1087"
                template="1089" sortOrder="19"
                updateDate="2010-10-12T12:17:29" nodeName="Class aptent"
                writerName="Administrator" creatorName="Administrator"
                path="-1,1049,1078,1079,1081,1209" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                    <archiveUnder>2010-06-21T00:00:00</archiveUnder>
                </BlogPost>
            </Room>
            <Room id="1082" parentID="1079" level="4"
            createDate="2010-09-27T14:12:33"
            writerID="0" creatorID="0" nodeType="1077" template="0"
            sortOrder="2"
            updateDate="2010-10-07T14:43:09" nodeName="Test Blog"
            writerName="Administrator" creatorName="Administrator"
            path="-1,1049,1078,1079,1082" isDoc="">
                <BlogPost id="1182" parentID="1082" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="1" createDate="2010-10-08T17:51:19" updateDate="2010-10-08T17:51:58" nodeName="Test Blog" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1082,1182" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
            </Room>
            <Room id="1083" parentID="1079" level="4" writerID="0"
            createDate="2010-09-27T14:12:40"
            creatorID="0" nodeType="1077" template="1089" sortOrder="3"
            updateDate="2010-10-07T14:49:48" nodeName="Test Blog"
            writerName="Administrator" creatorName="Administrator"
            path="-1,1049,1078,1079,1083" isDoc="">
                <BlogPost id="1183" parentID="1083" level="5" writerID="0" creatorID="0" nodeType="1087" template="1089" sortOrder="1" createDate="2010-10-08T17:52:22" updateDate="2010-10-08T17:52:39" nodeName="Test Blog" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1079,1083,1183" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
            </Room>
        </BlogCentre>
        <BlogCentre id="1080" parentID="1078" level="3" writerID="0"
        createDate="2010-09-27T14:11:55"
        creatorID="0" nodeType="1075" template="1076" sortOrder="2"
        updateDate="2010-10-07T14:43:23" nodeName="Blog Centre 2"
        writerName="Administrator" creatorName="Administrator"
        path="-1,1049,1078,1080" isDoc="">
            <Room id="1084" parentID="1080" level="4" writerID="0" creatorID="0" nodeType="1077" template="0" sortOrder="1" createDate="2010-09-27T14:12:45" updateDate="2010-10-07T14:43:17" nodeName="Room 1" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1080,1084" isDoc="">
                <BlogPost id="1184" parentID="1084" level="5" writerID="0"
                createDate="2010-10-08T17:53:05"
                creatorID="0" nodeType="1087" template="1089" sortOrder="1"
                updateDate="2010-10-08T17:53:29" nodeName="Blog Post 3"
                writerName="Administrator" creatorName="Administrator"
                path="-1,1049,1078,1080,1084,1184" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
            </Room>
            <Room id="1085" parentID="1080" level="4" writerID="0"
            createDate="2010-09-27T14:12:50"
            creatorID="0" nodeType="1077" template="0" sortOrder="2"
            updateDate="2010-10-07T14:43:19" nodeName="Room 2"
            writerName="Administrator" creatorName="Administrator"
            path="-1,1049,1078,1080,1085" isDoc="">
                <BlogPost id="1185" parentID="1085" level="5" writerID="0"
                createDate="2010-10-08T17:53:51"
                creatorID="0" nodeType="1087" template="1089" sortOrder="1"
                updateDate="2010-10-08T17:54:15" nodeName="Blog Post 109"
                writerName="Administrator" creatorName="Administrator"
                path="-1,1049,1078,1080,1085,1185" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
            </Room>
            <Room id="1086" parentID="1080" level="4" writerID="0" creatorID="0" nodeType="1077" template="1089" sortOrder="3" createDate="2010-09-27T14:12:55" updateDate="2010-10-07T14:50:39" nodeName="Room 3" writerName="Administrator" creatorName="Administrator" path="-1,1049,1078,1080,1086" isDoc="">
                <BlogPost id="1186" parentID="1086" level="5" writerID="0"
                createDate="2010-10-08T17:54:28"
                creatorID="0" nodeType="1087" template="1089" sortOrder="1"
                updateDate="2010-10-08T17:54:51"
                nodeName="Blog Post 123" writerName="Administrator"
                creatorName="Administrator"
                path="-1,1049,1078,1080,1086,1186" isDoc="">
                    <topicTitle>Lorem Ipsum</topicTitle>
                </BlogPost>
            </Room>
        </BlogCentre>
    </Blog>
    

    produces the wanted, correct result:

    <ul>
       <li>
          <h3>2010</h3>
          <ul>
             <li>October (7)</li>
             <li>September (2)</li>
             <li>August (3)</li>
             <li>July (1)</li>
             <li>June (3)</li>
             <li>May (1)</li>
             <li>April (1)</li>
             <li>March (1)</li>
             <li>February (1)</li>
             <li>January (1)</li>
          </ul>
       </li>
       <li>
          <h3>2009</h3>
          <ul>
             <li>December (1)</li>
             <li>November (1)</li>
             <li>October (1)</li>
          </ul>
       </li>
    </ul>
    

    Do note:

    1. Muenchian Grouping is used -- both for determining the different years and for determining the different months for each year.

    2. The date is chosen between the createDate attribute and the archiveUnder child using the expression:

      concat(archiveUnder, @createDate[not(archiveUnder)])

    This concatenation only picks @createDate if archiveUnder is missing or empty.

    .3. The transformation will produce the correct result even if the dates of the elements are unsorted.

    这篇关于在XSLT中按月和年份分组XML节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆