微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在XSLT中按月和年分组XML节点

更新

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…

我正在开发Umbraco的自定义博客. Umbraco将XML作为输出吐出,然后使用XSLT读取.

XML的结构如下

>博客

>博客中心

>房间

>博客文章
>博客文章
>博客文章

>房间

>博客文章

>博客中心

>房间

>博客文章

这是XML代码,我已经清理了很多,以使其至少具有一定的可读性.

<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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,1086,1186" isDoc="">
                <topicTitle>Lorem Ipsum</topicTitle>
            </BlogPost>
        </Room>
    </BlogCentre>
</Blog>

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

<xsl:param name="currentPage" />

这将始终是父节点< Blog />,因此我们必须在此处启动表单.

您会注意到< Blog />之间存在中间节点.和< BlogPost />但我们想要计算每个< BlogCentre />中的BlogPosts总数.和< Room />.

为此,我一直在使用

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

选择所有博客帖子,无论中心/房间.

现在我的要求是按月和年份对每个博客帖子进行分组(包括每个月的帖子计数).我想要将它们分组的日期是属性createDate,除非有一个名为< 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

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>

解决方法

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

<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,'-'
                          )
        "/>
   </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)]
                               ),7
                                    )
                              )[1]
                          )
              ]
          ">
         <xsl:sort order="descending" select=
            "substring(
                 concat(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)]
               ),2)"/>

  <xsl:variable name="vmonthsBlogs" select=
    "key('kPostsByYearMonth',substring(
              concat(archiveUnder,@createDate[not(archiveUnder)]
                     ),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="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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,1186" isDoc="">
                <topicTitle>Lorem Ipsum</topicTitle>
            </BlogPost>
        </Room>
    </BlogCentre>
</Blog>

产生想要的,正确的结果:

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

请注意:

使用> Muenchian Grouping – 用于确定不同年份和确定每年的不同月份.
>使用表达式在createDate属性和archiveUnder子项之间选择日期:

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

如果archiveUnder缺失或为空,则此并置仅选择@createDate.

0.3.即使元素的日期未排序,转换也会产生正确的结果.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。