更新
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,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>
在 Umbraco XSLT 样式表中,有一个为当前页面传递的参数。
<xsl:param name="currentPage" />
这将始终是父节点 <Blog /> ,所以我们必须从这里开始。
您会注意到 <Blog /> 之间有中间节点和 <BlogPost />但我们想计算每个 <BlogCentre /> 中的博文总数和 <Room /> .
为此,我一直在使用
<xsl:for-each select="$currentPage/descendant::BlogPost" />
这会选择所有博客文章,而不考虑中心/房间。
现在我的要求是,按月份和年份(包括每个月的帖子计数)对这些博客帖子中的每一个进行分组。我想将它们分组的日期是属性 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
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,
@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>
应用于提供的示例 XML 文档时(我们正在访问 $currentPage <xsl:param> 之外的每个节点,因为这将在真正的 Umbraco 案例中),格式化以提高可读性和每个 createDate 的 BlogPost 属性移动在元素名称后的第一行:
<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>
产生想要的、正确的结果:
<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)])
如果 @createDate 缺失或为空,此串联仅选择 archiveUnder。
.3。 即使元素的日期未排序,转换也会产生正确的结果。
关于xml - 在 XSLT 中按月份和年份对 XML 节点进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3910303/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解
我有一个像这样的ruby类:require'logger'classTdefdo_somethinglog=Logger.new(STDERR)log.info("Hereisaninfomessage")endend测试脚本行如下:#!/usr/bin/envrubygem"minitest"require'minitest/autorun'require_relative't'classTestMailProcessorClasses当我运行这个测试时,out和err都是空字符串。我看到消息打印在stderr上(在终端上)。有没有办法让Logger和capture_io一起玩得