XSLT,按年份日期排序和分组
关于 Umbraco XSLT 版本 1。
我有 aprox。 XML 格式的 150 条新闻。让我们这样说(在我更熟悉这个 xml/xslt 之前,所有都是伪代码):
<news>
<data alias=date>2008-10-20</data>
</news>
<news>
<data alias=date>2009-11-25</data>
</news><news>
<data alias=date>2009-11-20</data>
</news> etc. etc....
我想运行 XML 并创建 html 输出作为新闻存档。像这样的东西(标签不重要):
2008
Jan
Feb
...
2009
Jan
Feb
Mar
etc. etc.
我只能想出一个嵌套的 for-each (伪代码):
var year_counter = 2002
var month_counter = 1
<xsl:for-each select="./data [@alias = 'date']=year_counter">
<xsl:for-each select="./data [@alias = 'date']=month_counter">
<xsl:value-of select="data [@alias = 'date']>
"...if month_counter==12 end, else month_counter++ ..."
</xsl:for-each>
"... year_counter ++ ..."
</xsl:for-each>
但是程序员指出,循环 10 年将给出 120 个循环,这是糟糕的编码。因为我认为 Umbraco 缓存了结果,所以我不太关心,而且在这种情况下会有一个最大值。共 150 条记录。
有关如何对许多新闻项目进行排序和输出并将其按年份分组以及每年按月份分组的任何线索?
Br。安德斯
Regarding Umbraco XSLT version 1.
I have aprox. 150 news items in XML. Lets say like this (all is pseudocode until I get more familiar with this xml/xslt):
<news>
<data alias=date>2008-10-20</data>
</news>
<news>
<data alias=date>2009-11-25</data>
</news><news>
<data alias=date>2009-11-20</data>
</news> etc. etc....
I would like to run through the XML and create html-output as a news archive. Something like (tags not important):
2008
Jan
Feb
...
2009
Jan
Feb
Mar
etc. etc.
I can only come up with a nested for-each (pseudocode):
var year_counter = 2002
var month_counter = 1
<xsl:for-each select="./data [@alias = 'date']=year_counter">
<xsl:for-each select="./data [@alias = 'date']=month_counter">
<xsl:value-of select="data [@alias = 'date']>
"...if month_counter==12 end, else month_counter++ ..."
</xsl:for-each>
"... year_counter ++ ..."
</xsl:for-each>
But a programmer pointet out that looping through 10 years will give 120 loops and that is bad coding. Since I think Umbraco caches the result I am not so concerned, plus in this case there will be a max. of 150 records.
Any clues on how to sort and output many news items and group them in year and group each year in months?
Br. Anders
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您需要的是所谓的 Muenchian Grouping 方法,它正是解决这个问题XSLT 的问题/模式。
基本上,它通过查找唯一键并循环使用的键中包含的条目来进行分组。
What you need is the so-called Muenchian Grouping method, which addresses exactly this problem/pattern for XSLT.
Basically, it groups by finding unique keys and looping over the entries contained in the key being used.
除了 lucero 之外,请查看 Xsl 分组重复问题,以避免月份名称被删除的问题
in addition to lucero, check out Xsl grouping duplicates problem for avoiding problems with month names being removes
您不能在 XSLT 中执行 Month_counter++,它不是一种过程语言,也不是 XSLT 的工作方式。因此,如果这不能以这种方式工作,那么担心效率低下是毫无意义的。
这看起来像是 XSLT 中的一大难题。我的 XSLT 还不够新鲜,无法尝试和实际实现它。但这里有两种方法:
1)
2)(如果可行的话,似乎更容易。)
3) 忘记 XSLT,使用真正的编程语言。
You can't do month_counter++ in XSLT, it's not a procedural language and it's not how XSLT works. So, it's kind of pointless to worry about this being inefficient if this does not work this way.
This looks like a major pain in the neck in XSLT. My XSLT is not fresh enough to try and actually implement it. But here are two ways:
1)
2) (seems easier, if it works.)
3) Forget XSLT, use a real programming language.
对于以下解决方案,我使用了此 XML 文件:
和此 XSLT 1.0 转换:
应用转换时,会生成以下输出:
它已经具有正确的结构,您可以根据自己的需要调整实际外观。
解决方案是两阶段 Muenchian 分组方法。在第一阶段,新闻项目按年份分组,第二阶段按年月分组。
请参考我对
和key()
的解释 在这里。您不需要阅读另一个问题,尽管它是一个类似的问题。请阅读我的答案的下半部分。For the following solution I used this XML file:
and this XSLT 1.0 transformation:
When the transformation is applied, the following output is produced:
It has the right structure already, you can adapt actual appearance to your own needs.
The solution is a two-phase Muenchian grouping approach. In the first phase, news items are grouped by year, in the second phase by year-month.
Please refer to my explanation of
<xsl:key>
andkey()
over here. You don't need to read the other question, though it is a similar problem. Just read the lower part of my answer.